MonoGame - 从不同的类调用相同的函数会导致不同的行为

时间:2014-11-05 23:31:09

标签: c# debugging animation monogame

我正在使用XNA / MonoGame开发游戏,我遇到了一个bug。

我有这个函数Expload,它使用精灵表显示一个非常简单的动画。

public void Exploade(Rectangle explosionRect)
    {
        ex = new ExpolsionAnimation(content, "Explsion4", explosionRect,
            _frameWaiteTime:50,
            _frameWidth:90 , _frameHeight: 45,
            _rows: 4       , _culloms: 3,
            _rotation: 0
            );

        playAnimation = true;
    }

我从2个类中调用此函数:

  • 该功能的类被称为箭头
  • 一个名为 OnCollsionEvents
  • 的另一个类,调用currentArrow.Explode(并且正常工作)

这是我如何调用不同类中的函数: 在班级箭头(给我问题/错误:

 public override void Update(GameTime gt)
    {
        if (!MonsterHit)
        {
            this.location.Y -= movmentSpeed;
        }


 //when the arrow touch the top of the window, it need to expload, but for some reason when i start the animation here, it just doesn't work.

       if (ReachedTheTop)
            this.Exploade(new Rectangle(location.X - 10, 1, 30, 30));

       //here i start updating the animation
        if (playAnimation)
            ex.Update(gt);

        base.Update(gt);
    }
OnCollsionEvents

中的

public void Update(SpaceShip _spaceShip, Monsters _monsters)
{
    List<Arrow> gameArrows = player.Gun.ArrowList;

    if (MonsterCount > 0)
    {
            foreach (var monster in monsters.MonstersList)
            {

                if (monster.ReachedTheButtom)
                {
                    MonsterHitTheFloor = true;
                }

                if (monster.CollsionWith(player))
                {
                    MonsterHitTheSpaceship = true;
                }

                foreach (var currentArrow in gameArrows)
                {
                if (currentArrow.CollsionWith(monster))
                {
                    currentArrow.MonsterHit = true;
                    currentArrow.Exploade(new Rectangle(monster.Location.X, monster.Location.Y, monster.AreaRect.Width, monster.AreaRect.Height));

                    monster.GotHit = true;
                }
            }
    }
}

这里是调用Arrow.Update的地方(在类Gun中)

      public override void Update(GameTime gt)
        {
            if (arrowsNotEmpty)
            {
                for (int i = 0; i < ArrowList.Count; i++)
                {
                    ArrowList[i].Update(gt);
//because of the bug, i cant even remove an arrow afther it reach the top of the window
//because the animation is not Ended.
                    if ((ArrowList[i].IsOverTheTop || ArrowList[i].MonsterHit) && ArrowList[i].AnimationEnded)
                        ArrowList.RemoveAt(i);
                }
            }
    }

现在我遇到的问题是这样的。 在动画类中,我有一个得到毫秒传递的整数,所以我可以创建一种计时器来运行动画。 当我调用函数Exploade,并开始在 OnCollsionEvents 类中更新动画时,整数值为64并正确启动动画。

当我从箭头调用Exploade并开始更新时,整数值为16,这不会启动动画。

我不明白的是,如何从不同的类调用相同的函数,并在创建它的同一个类中更新函数,并得到不同的结果。

  • 我错过了什么?
  • 或者我应该在哪里寻找?
  • 测试这类东西的好方法是什么?

1 个答案:

答案 0 :(得分:1)

我发现了我的问题。

当箭头到达屏幕顶部时,它不断发出爆炸声。 所以我只是添加另一个if statment,来检查是否有没有探索动画allrdy runing。