Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的动画类型#_C#_Animation_Visual Studio 2015_2d_Monogame - Fatal编程技术网

C# C语言中的动画类型#

C# C语言中的动画类型#,c#,animation,visual-studio-2015,2d,monogame,C#,Animation,Visual Studio 2015,2d,Monogame,我一直在遵循一个教程,并修改它,使我自己的游戏。我来到这里,正在致力于实现投射物的创建和动画 在他的教程中,他以公共动画激光动画开始上课但我似乎没有“动画”类型的名称空间 所以我决定尝试使用常规的Texture2D类型来实现它,并提出了以下建议 这是bullet类中声明的纹理 public Texture2D BulletTexture; 在主游戏课上,我把他的两个函数转换成 protected void FireBullet(GameTime gameTime) { if(g

我一直在遵循一个教程,并修改它,使我自己的游戏。我来到这里,正在致力于实现投射物的创建和动画

在他的教程中,他以
公共动画激光动画开始上课但我似乎没有“动画”类型的名称空间

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

这是bullet类中声明的纹理

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);
因此,我继续这样做(尽管我把“1”改成了另一个名字,因为我遇到了错误(我不知道他是怎么做到的))

现在这些子弹实际上正在发射,但不是一次发射一颗,而是连续发射几颗

我想知道这是否与他在课堂上使用的更新函数有关。因为我把它改成了纹理2D,它不像他的动画类型

public void Update(GameTime gameTime)
{
    Position.X += laserMoveSpeed;
    LaserAnimation.Position = Position;
    LaserAnimation.Update(gameTime);
}
这就是他的样子。但在我的文章中,我不得不注释掉第2行和第3行,因为Texture2D没有这些函数调用。是什么让我的子弹“鬼魂”并在新子弹被取出之前不消失

现在,子弹实际上正在发射,但不是一颗出来 一次,它会连续显示几个

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

    if (_currentKeyboardState.IsKeyDown(Keys.Space) || _currentGamePadState.Buttons.X == ButtonState.Pressed)
    {
        FireLaser(gameTime);
    }
您将看到,当空格键或gamepad的X按钮按下时,会调用FireLaser()。由于MonoGame的
Update
每秒调用60次,因此会导致
FireLaser
被多次调用,直到您松开按钮

如果要避免此操作,请保存以前的状态,并检查之前是否未按下

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

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

我想知道的是,是否不是一个子弹正在重影,而是一次可以激活多少子弹的限制不起作用。有人有什么想法吗?你是对的,他没有检查空格键是否在那里被释放。但他在FireLaser功能中控制着它。他检查以确保子弹发射之间的时间是一个可接受的值。对我来说,这种方法更有意义,因为如果你只是检查了钥匙的状态,有人可能会很快给按钮发送垃圾邮件,这会使游戏失去平衡。不管我怎么想,我还是设法通过注释或取消注释一些我遗留下来的旧代码来解决我遇到的问题。所以我将继续,并将此标记为答案。是的,我错过了这一部分,这确实是一个更适合的方法。我很高兴它能为您解决问题,但请记住避免巧合编程:)
    if (_currentKeyboardState.IsKeyDown(Keys.Space) && _previousKeyboardState.IsKeyReleased(Keys.Space))
    {
        FireLaser(gameTime);
    }
    _previousKeyboardState = _currentKeyboardState;