1

XNAテクスチャのフィールド(50x50)を描画するプログラムがあります

ここに画像の説明を入力してください

図面のコードは次のようになります。

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();
        }
    }
}

私の質問は今ですが、どうすれば地図全体を回転させることができますか?

次のようになります。

最初の形は私が今どのように見えるかであり、2番目の形はそれがどのように見えるべきかです

これを行うための最良の方法がわかりません。

すべてのテクスチャを回転させて正しい順序に配置する必要がありますか、それともレベル全体を回転させる方法はありますか?

レベル全体を回転させることができれば、現在のアルゴリズムと変わらないので、クリーチャーの歩行アルゴリズムははるかに簡単になると思います。

他の方法(すべてのテクスチャを回転させる)ははるかに難しいでしょう..私は思います。

前もって感謝します!

4

3 に答える 3

1

私が行う方法は、マップを描画する前に、回転行列を投影行列に適用することです。XNAのドキュメントに小さなハウツーがあります

等角投影(実際に探しているものだと思います)を探している場合は、XNAリソースのタイルエンジンチュートリアルがここにあります。

ただし、この点でディスプレイを回転させるのは視覚的な目的のみであり、舞台裏のデータには影響しないため、これによって「歩行アルゴリズム」がどのように簡素化されるかはわかりません。それが物事を変えると思う理由について、さらに詳しく説明していただけますか?

于 2012-04-08T18:13:12.750 に答える
0

変換行列を受け取るオーバーロードされたメソッドspriteBatch.Begin()を使用できます。Matrix.CreateRotationZ()およびMatrix.CreateTranslationを使用して作成するマトリックスを設定できます。それらを掛け合わせて組み合わせます。特定のポイントを中心に回転する場合は、対応するポイントを原点に再配置する平行移動を適用し、回転して元に戻す必要があります。

于 2012-04-08T18:14:17.390 に答える
0

世界を回転させようとしないでください—それは不可能です。代わりに、あなたの視点を変えてください。

于 2012-04-08T19:08:29.497 に答える