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创建的矩阵。通过乘以它们来组合它们。
如果你想围绕某个点旋转,你必须应用一个平移,将相应的点重新定位到原点,旋转并向后平移。不要尝试旋转世界-这是不可能的。改变你的观点。不要试图旋转世界——那是不可能的。改变你的观点。谢谢你的回答!我已经看过了这些链接,我想它们会对我有很大帮助!谢谢你的回答!我已经看过了这些链接,我想它们会对我有很大帮助!