1

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

我对使用枚举还是个新手,在使用EventArgs.

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

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

类别:游戏1

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

1 回答 1

1

几件事:

  • 看起来您正在通过调用 hud、ball 和 bat 方法立即激活一些通电。是这样吗?我以为玩家必须手动激活它们?这些调用将进入由 powerup 的 Activate 事件调用的事件处理程序。
  • 您是否在某处将 input.RollPowerup 和 input.ActivatePowerup 重置为 false?如果不是,那可能会导致意想不到的问题,可能所有的电源都会同时激活,因为每帧都会生成一个新的电源。
  • 您可能还希望将事件连接移动到游戏类的构造函数或 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);
}

它可能比这更多,但这就是我到目前为止所看到的。如果您想在某处上传项目并将链接通过电子邮件发送给我,那很好。

于 2012-05-01T20:37:04.263 回答