随机滚动的通电都会激活,而不是只激活一次

时间:2012-04-28 19:49:01

标签: c# xna

问题:我的所有/大多数Powerup都是立即激活,而不是仅存储随机选择(滚动)的1,然后按下LeftCtrl键激活。

我仍然不习惯使用枚举,而且在使用EventArgs时非常新手。

我已经读了很多,但仍然不确定它们是如何工作的,我相信这就是我的问题所在。

除了Powerup类之外,我还在下面的Game1类中添加了代码。

课程:Game1

if (input.RollPowerup == true)
{
    //generate a random powerup
    PowerupType type = (PowerupType)random.Next(Enum.GetNames(typeof(PowerupType)).Length);

    switch (type)
    {
        case PowerupType.BigBalls:
            {
                powerup = new Powerup(type, 10.0f, 1.0f);
                ball.GrowBall();
                break;
            }

         case PowerupType.ShrinkBalls:
            {
                powerup = new Powerup(type, 10.0f, 1.0f);
                ball.ShrinkBall();
                break;
            }
        case PowerupType.BigPaddle:
            {
                powerup = new Powerup(type, 10.0f, 1.0f);
                leftBat.GrowBat();
                break;
            }
        case PowerupType.ShrinkEnemy:
            {
                powerup = new Powerup(type, 10.0f, 1.0f);
                rightBat.ShrinkBat();
                break;

            }
        case PowerupType.SpeedBall:
            {
                powerup = new Powerup(type, 10.0f, 20.0f);
                ball.IncreaseSpeed();
               break;

            }
        case PowerupType.Heal:
            {
                powerup = new Powerup(type, 1.0f, 1.0f);
                hud.AddHealthP1();

                break;
            }
        case PowerupType.Regen:
            {
                powerup = new Powerup(type, 20.0f, 1.0f);

                break;
            }
    }

    powerupInitialized = false;

}
else if (input.ActivatePowerup == true)

{
    powerup.Activate();
}

if (powerup != null && IsActive)
{
    if (!powerupInitialized)
    {
        powerup.Activated += PowerupActivated;
        powerup.Deactivated += PowerupDeactivated;

        if (powerup.Type == PowerupType.Regen)
            powerup.Tick += PowerupTick;

        powerupInitialized = true;
    }

    powerup.Update((float)gameTime.ElapsedGameTime.TotalMilliseconds);
}

课程:通电

public void Activate()
{
    IsAlive = true;
     //   powerupActivate.Play(); // Plays the SFX to notify user that item has been selected

    if (Activated != null)
        Activated(this, eventArgs);

    if (Type <= PowerupType.ThreeBurst)
    {
        //no need to call Deactivated unless you really want to 
        IsAlive = false;
    }
}

      public virtual void Update(float elapsed)
{
    // Checks if the player is still alive or not   
    if (IsAlive)
    {
        elapsedLifetime += elapsed;

        if (elapsedLifetime >= maxLifetime)
        {
            IsAlive = false;

            if (Deactivated != null)
                Deactivated(this, eventArgs);
        }
        else if (elapsedLifetime >= (lastTick + 1) * 1000)
        {
            lastTick++;

            if (Tick != null)
                Tick(this, eventArgs);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

一些事情:

  • 看起来你正在激活一些通电 调用hud,ball和bat方法。是这样的吗?我以为 玩家必须手动激活它们?这些调用将进入由powerup的Activate事件调用的事件处理程序。
  • 您是否正在将input.RollPowerup和input.ActivatePowerup重置为某处?如果没有,那可能会导致意外问题,可能所有的上电都会立即激活,因为每帧都会产生一次新的上电。
  • 你也可能想把事件挂钩到游戏类的构造函数或Initialize方法。这将消除检查,我假设每帧都会发生。
  • 您可能不需要每次都创建新的通电。只需将其重置为所选类型即可。这意味着向powerup类添加属性 - 类似于IsActive。您的代码将如下所示:

if (input.RollPowerup == true)
{
    //generate a random powerup
    PowerupType type = (PowerupType)random.Next(Enum.GetNames(typeof(PowerupType)).Length);
   switch (type)
    {
        case PowerupType.BigBalls:
            {
                powerup.Reset(type, 10.0f, 1.0f);

                break;
            }

         case PowerupType.ShrinkBalls:
            {
                powerup.Reset(type, 10.0f, 1.0f);

                break;
            }
        case PowerupType.BigPaddle:
            {
                powerup.Reset(type, 10.0f, 1.0f);

                break;
            }
        case PowerupType.ShrinkEnemy:
            {
                powerup.Reset(type, 10.0f, 1.0f);

                break;

            }
        case PowerupType.SpeedBall:
            {
                powerup.Reset(type, 10.0f, 20.0f);

               break;

            }
        case PowerupType.Heal:
            {
                powerup.Reset(type, 1.0f, 1.0f);

                break;
            }
        case PowerupType.Regen:
            {
                powerup.Reset(type, 20.0f, 1.0f);

                break;
            }
    }

    powerupInitialized = false;

}
else if (input.ActivatePowerup == true)

{
    powerup.Activate();
}

if (powerup.IsActive)
{
    powerup.Update((float)gameTime.ElapsedGameTime.TotalMilliseconds);
}

可能还有更多,但这是我到目前为止看到的。如果你想在某个地方上传项目并给我发电子邮件链接,那很好。