c# - 使用动画类的跳跃动画

标签 c# animation xna

我想在 XNA 中创建我的小型 2D 游戏,需要一些帮助。在对 XNA 和 C# 感兴趣之前,我几乎没有编程知识,所以也许我的问题很简单,但我就是想不通。

基本上,我有一个基类,我创建了一个附加类 Animation 来为 Sprite 设置动画。我实现了一些方法,以便当玩家按下“向右”时,它会更改动画的当前纹理并将 X 递增 xf;无论如何,主要思想是我只使用我的类的一个实例(基本上,一个动画类型的对象,它根据按下的键改变其纹理和属性)。

因此,我可以毫无问题地让它向右或向左运行。效果很好。当我想实现跳跃 Sprite 时,大问题就开始了。因此,我创建了 Sprite 所需的 6 帧,但要为其制作动画,我几乎不知道该怎么做。

它现在唯一要做的就是遍历 Sprite 的帧,但位置(.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。我错过了什么吗?

最佳答案

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

关于c# - 使用动画类的跳跃动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24986700/

相关文章:

ios - 带动画的自动布局 View

c# - 反弹旋转边界球体

c# - 将嵌套 XML 转换为 3d 数组

c# - 如何修复 “A reference to ' Audio Precision AP2700 3.00对象库'无法添加”

c# - 在 linq c# 中从包含全名的字段中搜索名字和姓氏

当 View 离开屏幕时,Android 动画停止在 recyclerview 中工作

c# - XNA GameTime Windows 手机

c# - 检测诚实的网络爬虫

c# - WPF 设置用户控件依赖属性

android - Android AnimationSet 是否会覆盖子动画的持续时间和插值器?