1

Вопрос по .net, c# – Поворачивая весь уровень

у меня естьXNA программа, которая рисует поле (50x50) текстуры

enter image description here

Код чертежа выглядит так:

namespace Village
{
    public class DrawLogic
    {

        internal static void DrawCreatures(GameTime gameTime, GraphicsDevice graphicsDevice, SpriteBatch spriteBatch, Dictionary<string, Texture2D> creatureTextures, List<Creature> list, Coordinate current)
        {
            spriteBatch.Begin();
            foreach (var item in list)
            {
                Vector2 origin = new Vector2(0, 0);
                if (item.Selected)
                {
                    spriteBatch.Draw(creatureTextures["selected"], new Vector2((item.Coordinates.X * 32) - current.X, (item.Coordinates.Y * 32) - current.Y), new Rectangle(0, 0, creatureTextures["human"].Width, creatureTextures["human"].Height), Color.White, 0.0f, origin, 1f, SpriteEffects.None, 1f);
                }
                else
                {
                    spriteBatch.Draw(creatureTextures["human"], new Vector2((item.Coordinates.X * 32) - current.X, (item.Coordinates.Y * 32) - current.Y), new Rectangle(0, 0, creatureTextures["human"].Width, creatureTextures["human"].Height), Color.White, 0.0f, origin, 1f, SpriteEffects.None, 1f);
                }
            }
            spriteBatch.End();
        }

        internal static void DrawObjects(GameTime gameTime, GraphicsDevice graphicsDevice, SpriteBatch spriteBatch, Dictionary<string, Texture2D> creatureTextures, List<IHarvestable> list, Coordinate current)
        {
            spriteBatch.Begin();
            foreach (var item in list)
            {
                Vector2 origin = new Vector2(0, 0);

                spriteBatch.Draw(creatureTextures["tree"], new Vector2((item.Coordinates.X * 32) - current.X, (item.Coordinates.Y * 32) - current.Y), new Rectangle(0, 0, creatureTextures["tree"].Width, creatureTextures["tree"].Height), Color.White, 0.0f, origin, 1f, SpriteEffects.None, 1f);

            }
            spriteBatch.End();
        }

        internal static void DrawMap(GameTime gameTime, GraphicsDevice graphicsDevice, SpriteBatch spriteBatch, Dictionary<string, Texture2D> worldTextures, Block[,] map, Coordinate current)
        {
            spriteBatch.Begin();

            for (int i = 0; i < map.GetLength(0); i++)
            {
                for (int j = 0; j < map.GetLength(1); j++)
                {
                    if (map[i, j].GetType() == typeof(Grass))
                    {


                        Vector2 origin = new Vector2(0, 0);
                        spriteBatch.Draw(worldTextures["grass"], new Vector2((i * 32) - current.X, (j * 32) - current.Y), new Rectangle(0, 0, worldTextures["grass"].Width, worldTextures["grass"].Height), Color.White, 0.0f, origin, 1.0f, SpriteEffects.None, 1f);
                    }
                }
            }

            spriteBatch.End();
        }
    }
}

Мой вопрос сейчас, как я могу повернуть всю карту?

Это должно выглядеть так:

The first shape is how i looks now, and the second one is how it should look

Я не знаю, как лучше всего это сделать.

Должен ли я вращать все свои текстуры и располагать их в правильном порядке, или есть способ повернуть весь уровень?

Я думаю, что если бы я мог вращать весь уровень, алгоритм ходьбы моих существ был бы мне намного проще, потому что он не отличался бы от моего текущего алгоритма.

Другой способ (вращение каждой текстуры) будет намного сложнее ... Я думаю.

Заранее спасибо!

  • Спасибо за ваш ответ! Я просмотрел эти ссылки и думаю, они мне очень помогут!

    от Sunnygurke
  • 0

    Не пытайтесь вращать мир &

    # x2014; это невозможно. Вместо этого измените свою точку зрения.

  • 0

    Вы можете использовать перегруженный метод spriteBatch.Begin ()

    который принимает матрицу преобразования. Вы можете установить матрицу, которую вы создаете с помощью Matrix.CreateRotationZ () и Matrix.CreateTranslation. Объедините их, умножив их. Если вы хотите повернуть определенную точку, вы должны применить перевод, который переместит соответствующую точку в начало координат, повернет и переместит назад.

  • 1

    Я бы применил это

    применив матрицу вращения к матрице проекции, прежде чем рисовать карту. Вы можете увидеть небольшое руководство в документации XNAВот.

    Если вы ищете изометрическую проекцию (которая, я думаю, именно то, что вы на самом деле ищете), в нее будет включено руководство по движку плиток по ресурсам XNA.Вот.

    Я не уверен, что вижу, как это упростило бы ваш "алгоритм ходьбы". тем не менее, вращение дисплея в этом отношении носит исключительно визуальный характер и не влияет на данные за сценой. Не могли бы вы рассказать подробнее о том, почему вы думаете, что это изменит ситуацию?