对于我的第一个XNA项目,我遵循了一个教程,该教程解释了如何使一个小方块面在随机放置的瓷砖之间跳跃。是的,很酷!嗯,没有那么多,但它起了作用,而且很好。
我不明白职位更新是怎么回事。我的意思是,我本来希望绘制每一帧,但draw函数只在刚开始时调用,当从内容加载纹理时,它只是通过添加矢量值来更新位置。
下一步:我尝试实现(我自己,这就是我在这里的原因)一个动画精灵,而不是第一个项目的正方形精灵已设置动画(它是一个在现场行走的人),但它不再通过键盘输入移动。。。
更新
好的,我想我找到问题了。我下载的类有一个Draw方法,比我以前使用的方法更复杂。。。
batch.Draw(myTexture, Position, sourcerect, Color.White, Rotation, Origin, Scale, SpriteEffects.None, Depth);
因为有一个"位置",但甚至还有一个"原点",我没有尝试更新。如果它不重要,我甚至想删除它。。。我会试试的!
编辑:我做了那些尝试,还是一样。。。
更新
问题已清除,这里是我的应用程序的完整代码:
主要类别:http://pastebin.com/EUexh9H1
控制器类别:http://pastebin.com/ZEcY0DXT
下载的类:http://pastebin.com/H2ZDu6bs
(在这个例子中,我刚刚添加了一个"位置"和Draw调用)
更新
我试图从一开始就开始整个项目,以获得更好、更干净的代码,但它仍然是一样的。我只是想用Position += Vector2.UnitX;
移动动画纹理,但它根本不会移动。。。
它会随着框架而改变什么?我的意思是,当我调用"位置"绘制时,帧是如何影响它的?如果是。。。
在您的batch.Draw
方法中,您使用screenPos
,它是作为参数传递的,但我希望有一个Vector2
类变量来表示您的精灵在屏幕上的当前位置。(我不知道你在哪里叫DrawFrame
)
如果要更新该位置,则需要更改类的Update
方法中的类变量。您不必向DrawFrame
和UpdateFrame
添加其他参数,您已经拥有了所需的参数。
编辑
在Class2Update
中,您只需要执行以下操作:
ActiveSpriteTexture.Position += /* whatever you need */
我不知道Movement * (float)gameTime.ElapsedGameTime.TotalMilliseconds / 15
是干什么的。
并且UpdateFrame
不需要Position
参数,该方法应该只更新精灵的动画
与DrawFrame
相同,您必须绘制类变量Position,但您应该已经完成了此编辑。
已解决。
问题是,这个位置是在DrawFrame方法中分配的,每次更新时它都会恢复自己,所以我只是在costructor中移动了这个分配。它有效。
所以。。。
public void DrawFrame(SpriteBatch batch, int frame, Vector2 screenPos)
{
Position = screenPos;
int FrameWidth = myTexture.Width / framecount;
Rectangle sourcerect = new Rectangle(FrameWidth * frame, 0, FrameWidth, myTexture.Height);
batch.Draw(myTexture, Position, sourcerect, Color.White, Rotation, Origin, Scale, SpriteEffects.None, Depth);
}
变成。。。
public void DrawFrame(SpriteBatch batch, int frame)
{
//Position = screenPos;
int FrameWidth = myTexture.Width / framecount;
Rectangle sourcerect = new Rectangle(FrameWidth * frame, 0, FrameWidth, myTexture.Height);
batch.Draw(myTexture, Position, sourcerect, Color.White, Rotation, Origin, Scale, SpriteEffects.None, Depth);
}