【发布时间】:2014-07-27 23:31:44
【问题描述】:
在我想在 XNA 中创建的小型 2D 游戏中,我需要一些帮助。在对 XNA 和 C# 感兴趣之前,我几乎没有编程知识,所以也许我的问题很简单,但我就是想不通。
所以基本上,我有一个基类,并且我创建了一个附加类Animation 用于动画精灵。我实现了一些方法,这样当玩家按下“右”键时,它会改变动画的当前纹理并将 X 增加一个 xf;无论如何,主要思想是我只使用我的类的一个实例(基本上,一个动画类型的对象,它根据按下的键改变其纹理和属性)。
所以,让它向右或向左运行都没有问题。效果很好。当我想实现跳跃精灵时,大问题就开始了。所以我创建了精灵所需的 6 帧,但要为它制作动画,我几乎不知道该怎么做。
它现在唯一要做的就是循环遍历精灵的帧,但位置(.X 和 .Y)保持不变。问题是,我有一个 Vector2 位置,它保存动画的当前位置,运行它没问题,因为我只是增加它。但是,当涉及到跳跃时,我希望它增加 .X,但 .Y 应该减少(因此向上)直到第 3 帧;在第 3 帧之后,直到最后一帧,我希望 .Y 位置随着相应的动画(erm,帧)下降(因此下降)。
所以,基本上,我不知道如何修改 .X 和 .Y 以便它在我需要的时候显示我需要的帧。我不知道你是否真的明白我想说什么;基本上,当我按下“向上”键时,它会遍历帧,但位置保持不变。
我的想法是使用对保存动画当前位置的实际Vector2位置的引用并将其传递给另一个Animation.cs类中的方法,即PlayAnimJump,并在每一帧之后修改位置并通过引用将其返回给实际的Game1.cs。即使我会这样做(尽管我看不到它会有什么好处),它也不会像它应该那样更新位置。那么,有什么想法吗?
这是Animation 类中PlayAnimJump 方法的代码:
public void PlayAnimJump(GameTime gameTime)
{
elapsed += (float)gameTime.ElapsedGameTime.Seconds;
sourceRect = new Rectangle(currentFrame * frameWidth, 0, frameWidth, frameHeight);
currentFrame = 0;
if (elapsed >= frameTime)
{
if (currentFrame <=3)
{
if (looping)
{
currentFrame++;
}
}
else if (currentFrame > 3)
{
currentFrame++;
}
elapsed = 0;
}
}
该类的默认构造函数:
public Animation(ContentManager Content,string asset,float frameSpeed, int numbOfFrames, bool looping,Vector2 positionIT)
{
this.assetName = asset;
this.frameTime = frameSpeed;
this.numbOfFrames = numbOfFrames;
this.looping = looping;
this.animation = Content.Load<Texture2D>(asset);
frameWidth=(animation.Width / numbOfFrames);
frameHeight=animation.Height;
position = positionIT;
}
这是按下向上键时的代码(来自main):
else if (up)
{
check = animation1.GetAsset();
if (check == "eright")
{
animation1.SetFrameSpeed(0.8f);
animation1.SetNumbOfFrames(6);
animation1.ChangeTexture(Content, "SarimCumVreJiorjica");
animation1.PlayAnimJump(gameTime);
/*position1.x +=2f;
position1.Y -=2f;
*/
}
所以,我不知道怎么做,但我应该根据那一秒动画显示的帧来更改position1。我错过了什么吗?
【问题讨论】: