在C#中键入动画

本文关键字:动画 | 更新日期: 2023-09-27 18:22:14

我一直在遵循一个教程,并对其进行修改以制作自己的游戏。我来到这一部分,正在致力于实现抛射体的创建和动画。

在他的教程中,他用public Animation LaserAnimation;开始上课,但我似乎没有"Animation"类型的命名空间。

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

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

public Texture2D BulletTexture;

在主游戏课上,我将他的两个函数转换为…

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);

但它似乎不起作用。我的意思是,当我按下空格键以使其着火时,什么都没有画出来。这次转换的哪一部分我错了,或者我错过了一些基本的东西。

编辑:好吧,所以我似乎太匆忙了,没有看到我需要添加的最后一部分…

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

所以我继续做了这件事(尽管我把"1"改成了另一个名字,因为我遇到了错误(我不知道他是怎么做到的))。

现在子弹实际上是在发射,但它不是一次射出一颗,而是连续射出几颗。

我想知道这是否与他在课堂上制作的Update函数有关。因为我把它改成了Texture2D,它不像他在动画类型中那样工作。

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

这就是他的样子。但在我的问题上,我不得不注释掉第2行和第3行,因为Texture2D没有这些函数调用。那些人在做什么,会让我的子弹"幽灵般",而不是在新子弹被拔出之前消失。

在C#中键入动画

现在子弹实际上在发射,但没有射出一颗一次,它会连续显示几个。

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

    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()将在每次空格键点击时调用一次