C# 中的动画类型

Animation Type in C#

我一直在学习教程并修改它来制作我自己的游戏。我来到 this 部分,正在致力于实现射弹创建和动画。

在他的教程中,他以 public Animation LaserAnimation; 开头 class,但我似乎没有 "Animation" 类型的名称 space。

所以我决定尝试使用常规 Texture2D 类型来实现它,并想出了以下...

这是项目符号中声明的纹理 class。

public Texture2D BulletTexture;

而在主游戏class中,我将他的两个功能转换为...

protected void FireBullet(GameTime gameTime) {
        if(gameTime.TotalGameTime - previousBulletSpawnTime > bulletSpawnTime) {
            previousBulletSpawnTime = gameTime.TotalGameTime;
            AddBullet();
        }
    }

    protected void AddBullet() {

        //Load Bullet Texture
        Texture2D bulletAnimation = Content.Load<Texture2D>("Graphics\bullet2");

        //Draw Bullet
        spriteBatch.Begin();
        spriteBatch.Draw(bulletAnimation, player.Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
        spriteBatch.End();

        Bullet bullet = new Bullet();

        var bulletPosition = player.Position;
        bulletPosition.Y += 60;
        bulletPosition.X += 44;

        bullet.Initialize(bulletAnimation, bulletPosition);
        bullets.Add(bullet);

但它似乎不起作用。我的意思是,当我按下 space 栏以使其启动时,没有绘制任何东西。这个转换的哪一部分我错了,或者我错过了一些基本的东西。

编辑:好吧,看来我太急于测试这部分而没有看到我需要添加的最后一部分...

// Draw the lasers.
foreach (var l in laserBeams)
{
    l.Draw(spriteBatch);
}

所以我继续这样做了(虽然我将“1”更改为不同的名称,因为我遇到了错误(我不知道他是如何让它工作的))。

现在子弹确实在发射,但不是一次发射一颗,而是连续发射几颗。

我想知道这是否与他在 class 中创建的更新功能有关。因为我把它改成了 Texture2D,所以它不像他的动画类型那样工作。

public void Update(GameTime gameTime)
{
    Position.X += laserMoveSpeed;
    LaserAnimation.Position = Position;
    LaserAnimation.Update(gameTime);
}

这就是他的样子。但在我的身上,我不得不注释掉第 2 行和第 3 行,因为 Texture2D 没有那些函数调用。那些人在做什么,会导致我的子弹 "ghost" 并且在绘制新子弹之前不会消失。

And now the bullets are in fact firing, but instead of coming out one at a time, it shows several in a row.

如果您查看 Game1 UpdatePlayer() 中的 FireLaser() 调用 class

    if (_currentKeyboardState.IsKeyDown(Keys.Space) || _currentGamePadState.Buttons.X == ButtonState.Pressed)
    {
        FireLaser(gameTime);
    }

您会看到在 按下/按下 空格键或游戏手柄的 X 按钮时调用 FireLaser()。由于 MonoGame 的 Update 每秒被调用 60 次,因此它会导致 FireLaser 被调用多次,直到您释放按钮。

如果你想避免它,保存之前的状态并检查它之前没有被按下。

    if (_currentKeyboardState.IsKeyDown(Keys.Space) && _previousKeyboardState.IsKeyReleased(Keys.Space))
    {
        FireLaser(gameTime);
    }
    _previousKeyboardState = _currentKeyboardState;

FireLaser() 将在每次单击空格键时调用一次