gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:28:29 24 4
gpt4 key购买 nike

我想在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com