XNA - 无法更改角色位置(通过键盘输入移动)



对于我的第一个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方法中的类变量。您不必向DrawFrameUpdateFrame添加其他参数,您已经拥有了所需的参数。

编辑

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

最新更新