1

問題: ランダムに選択 (ロール) された 1 つを保存してから、LeftCtrl キーを押してアクティブにするのではなく、すべてまたはほとんどの Powerup が一度にアクティブになります。

私はまだ列挙型を使用するのが初めてで、を利用することに関しては非常に初心者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 メソッドを呼び出して、パワーアップの一部をすぐに有効にしているようです。そうですか?プレイヤーが手動でアクティブ化する必要があると思いましたか? これらの呼び出しは、パワーアップの Activate イベントによって呼び出されるイベント ハンドラーに入ります。
  • input.RollPowerup と input.ActivatePowerup をどこかで false にリセットしていますか? そうでない場合、予期しない問題が発生する可能性があります。フレームごとに新しいパワーアップが生成されるため、すべてのパワーアップが一度にアクティブになる可能性があります。
  • また、イベントの接続をゲーム クラスのコンストラクターまたは Initialize メソッドに移動したい場合もあります。これにより、各フレームで発生していると思われるチェックが不要になります。
  • おそらく、毎回新しいパワーアップを作成する必要はありません。選択したタイプにリセットするだけです。これは、IsActive のようなプロパティを powerup クラスに追加することを意味します。コードは次のようになります。

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 に答える