使用动画类实现跳跃动画

3
我需要在XNA中创建一个小型2D游戏,但是我之前几乎没有编程知识,所以我的问题可能很简单,但我就是无法解决。基本上,我有一个基类,并为动画精灵创建了一个额外的类Animation。我实现了一些方法,以便当玩家按下“向右”时,它会更改动画的当前纹理并将X增加xf个数字;总之,主要思想是我只使用了一个类的实例(基本上是一种类型的动画对象),该对象根据按下的键更改其纹理和属性。
所以,我制作它向左或向右运行时没有任何问题。效果非常好。当我想要实现跳跃精灵时,大问题开始了。因此,我创建了6个必要的精灵帧,但是我几乎不知道如何对其进行动画处理。
它现在唯一做的事情就是循环播放精灵的帧,但是位置(.X和.Y)保持不变。问题是,我有一个Vector2位置,它保存动画的当前位置,对于运行来说,这很好,因为我只是增加它。然而,当涉及到跳跃时,我希望它递增.X,但是.Y应该递减(从而上升)直到第3帧;在第3帧之后,直到最后一帧,我希望.Y位置随着相应的动画(呃,帧)下降(从而掉落)。
因此,基本上,我不知道如何修改.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;
}

这是按下向上键时的代码(从主体中获取):
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。我有什么遗漏吗?
2个回答

0
如果您的动画类引用了您想要移动的对象(即持有位置字段的对象),那么您可以在PlayAnimJump方法中修改它。或者,为了减少耦合,您可以让PlayAnimJump返回一个变量,指示跳跃进行到了多远(可能是跳跃的百分比,从0到1)。然后,您可以在外部使用百分比来设置对象的位置。因此,如果跳跃完成了一半,返回值将是0.5f,您可以在方程式中使用它来确定玩家的y位置。一个例子方程式如下:
float percent = animation1.PlayAnimJump(gameTime);
float y = Math.Sin(percent * Math.PI) * maxJumpHeight;
player.positon.y = y;

这个程序使用正弦波来确定跳跃动画中玩家的高度。你只需要编写代码,在PlayAnimJump方法中确定跳跃的进度百分比(currentFrame),并将其返回。


0

自由落体的Y坐标公式为

y = g * t ^ 2 / 2 + v0 * t + y0

角色从高度y0以起始速度v0沿Y轴跳跃,重力逐渐减缓并开始下落。 使用以下公式计算deltaY

deltaY = g * t ^ 2 / 2 + v0 * t

首先展示角色从地面上起跳的帧,然后展示它上升到跳跃的最高点的帧。一旦 deltaY 的符号从 + 变为 -,就展示角色如何改变姿势以准备落下。就像这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接