随机滚动的道具都会激活,而不仅仅是一个

本文关键字:不仅仅是 一个 激活 滚动 随机 | 更新日期: 2023-09-27 18:32:29

>问题:我的所有/大部分道具都会立即激活,而不仅仅是存储随机选择(滚动(的 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);
        }
    }
}

随机滚动的道具都会激活,而不仅仅是一个

几件事:

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

可能还有更多的东西,但这就是我目前看到的。如果您想将项目上传到某个地方并通过电子邮件将链接发送给我,那很好。