Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 旋转整个水平面_C#_.net_Xna - Fatal编程技术网

C# 旋转整个水平面

C# 旋转整个水平面,c#,.net,xna,C#,.net,Xna,我有一个XNA程序,它绘制纹理的一个字段(50x50) 图纸的代码如下所示: namespace Village { public class DrawLogic { internal static void DrawCreatures(GameTime gameTime, GraphicsDevice graphicsDevice, SpriteBatch spriteBatch, Dictionary<string, Texture2D> cr

我有一个
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();
        }
    }
}
名称空间村庄
{
公共类逻辑
{
内部静态虚空绘制生物(游戏时间游戏时间、图形设备图形设备、SpriteBatch SpriteBatch、字典创建纹理、列表、当前坐标)
{
spriteBatch.Begin();
foreach(列表中的变量项)
{
向量2原点=新向量2(0,0);
如果(选定项)
{
spriteBatch.Draw(creatureTextures[“selected”]、新矢量2((item.Coordinates.X*32)-current.X、(item.Coordinates.Y*32)-current.Y)、新矩形(0,0,creatureTextures[“human”]、宽度、creatureTextures[“human”]、高度)、颜色、白色、0.0f、原点、1f、SpriteEffects.None、1f);
}
其他的
{
spriteBatch.Draw(creatureTextures[“human”]、新矢量2((item.Coordinates.X*32)-current.X、(item.Coordinates.Y*32)-current.Y)、新矩形(0,0,creatureTextures[“human”]、宽度、creatureTextures[“human”]、高度)、颜色、白色、0.0f、原点、1f、SpriteEffects.None、1f);
}
}
spriteBatch.End();
}
内部静态void DrawObjects(游戏时间游戏时间、图形设备图形设备、SpriteBatch SpriteBatch、字典创建纹理、列表、当前坐标)
{
spriteBatch.Begin();
foreach(列表中的变量项)
{
向量2原点=新向量2(0,0);
spriteBatch.Draw(creatureTextures[“tree”]、新矢量2((item.Coordinates.X*32)-current.X、(item.Coordinates.Y*32)-current.Y)、新矩形(0,0,creatureTextures[“tree”]、宽度、creatureTextures[“tree”]、高度)、颜色、白色、0.0f、原点、1f、SpriteEffects.None、1f);
}
spriteBatch.End();
}
内部静态虚空绘图地图(游戏时间游戏时间,图形设备图形设备,SpriteBatch SpriteBatch,字典世界纹理,块[,]地图,当前坐标)
{
spriteBatch.Begin();
for(int i=0;i
我现在的问题是,如何旋转整个地图

应该是这样的:

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

我不知道最好的方法是什么

我应该旋转我的每个纹理并将它们按正确的顺序排列,还是有办法旋转整个级别

我想如果我可以旋转整个关卡,我的生物的行走算法会让我更容易,因为它与我当前的算法没有什么不同

另一种方法(旋转每一个纹理)要困难得多。。我想


提前谢谢

我的方法是在绘制地图之前将旋转矩阵应用于投影矩阵。您可以在XNA文档中看到一个小说明

如果您正在寻找一个等轴测投影(我认为这是您实际要寻找的),那么XNA参考资料上的tile引擎教程将介绍它


不过,我不确定这将如何简化“行走算法”,因为在这方面旋转显示器仅用于视觉目的,不会影响幕后的数据。你能更详细地解释一下为什么你认为它会改变一切吗?

我的方法是在你绘制地图之前,将旋转矩阵应用于投影矩阵。您可以在XNA文档中看到一个小说明

如果您正在寻找一个等轴测投影(我认为这是您实际要寻找的),那么XNA参考资料上的tile引擎教程将介绍它


不过,我不确定这将如何简化“行走算法”,因为在这方面旋转显示器仅用于视觉目的,不会影响幕后的数据。您能更详细地解释一下为什么您认为它会改变情况吗?

您可以使用重载方法spriteBatch.Begin(),它接受一个变换矩阵。可以设置使用matrix.CreateRotationZ()和matrix.CreateTranslation创建的矩阵。通过乘以它们来组合它们。
如果要围绕某个点旋转,则必须应用平移,将相应点重新定位到原点,然后旋转并向后平移。

可以使用重载方法spriteBatch.Begin(),该方法采用变换矩阵。可以设置使用matrix.CreateRotationZ()和matrix.CreateTranslation创建的矩阵。通过乘以它们来组合它们。
如果你想围绕某个点旋转,你必须应用一个平移,将相应的点重新定位到原点,旋转并向后平移。

不要尝试旋转世界-这是不可能的。改变你的观点。

不要试图旋转世界——那是不可能的。改变你的观点。

谢谢你的回答!我已经看过了这些链接,我想它们会对我有很大帮助!谢谢你的回答!我已经看过了这些链接,我想它们会对我有很大帮助!