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

时间:2013-12-09 01:08:18

标签: c# animation xna position sprite

对于我在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;移动动画纹理,但它根本不动...

框架有什么变化?我的意思是,当我用位置调用平局时,帧会如何影响它?如果确实......

2 个答案:

答案 0 :(得分:0)

在您使用batch.Draw的{​​{1}}方法中,它会作为参数传递,但我希望有一个screenPos类变量代表您的精灵在屏幕上的当前位置。 (我不知道你在哪里称之为Vector2
如果要更新该位置,则需要在类的DrawFrame方法中更改该类变量。您不必将其他参数添加到UpdateDrawFrame,您已经拥有了所需的参数。

修改

在Class2 UpdateFrame中,你只需要这样做:

Update

我不知道ActiveSpriteTexture.Position += /* whatever you need */ 做了什么。

并且Movement * (float)gameTime.ElapsedGameTime.TotalMilliseconds / 15不需要UpdateFrame参数,该方法应该只更新精灵的动画。
同样适用于Position,你必须绘制类变量Position,但你应该已经完成​​了这个编辑。

答案 1 :(得分:0)

解决。

问题是该位置是在DrawFrame方法中分配的,并且在每次更新时它都会自行恢复,所以我只是在结构中移动了这个赋值。它有效。

因此...

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