【问题标题】:Jump animation using animation class使用动画类跳转动画
【发布时间】: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。我错过了什么吗?

【问题讨论】:

    标签: c# animation xna


    【解决方案1】:

    如果您的动画类引用了您想要移动的对象(即持有位置字段的对象),那么您可以在动画类中的 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) 的百分比并返回它。

    【讨论】:

      【解决方案2】:

      Y坐标的frуefall公式是

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

      字符从高度 y0 以起始速度 v0 沿 Y 轴跳跃,重力逐渐减慢并开始下降。 使用以下公式计算 deltaY

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

      首先显示角色被推离地面的帧,然后显示角色上升直到达到跳跃峰值的帧。一旦符号将 deltaY 从 + 更改为 - 显示角色如何改变姿势以适应秋季。类似的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-27
        • 2011-10-08
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 2022-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多