2012-04-28 5 views
1

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

私はまだ列挙型を使用していないし、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); 
     } 
    } 
} 
+0

選択解除されたパワーアップのイベントハンドラの登録を解除するにはどうすればよいですか? – Oded

+0

申し訳ありませんが、私はまだプログラミングの面白いです。イベントハンドラの登録を解除するとどういう意味ですか? –

+0

このコード行では、 'powerup.Activated + = PowerupActivated;' PowerupActivated'イベントハンドラを 'Activated'イベントにサブスクライブしています(' Powerup'で 'Activated'が発生したときに' PowerupActivated'が呼び出されます)。このサブスクリプションをどのように削除しているのか尋ねています。 – Oded

答えて

1

はカップル:

  • あなたはすぐにHUDを呼び出し ことにより、パワーアップの一部を活性化しているように見えます、ボール、およびバットの方法。それは事実ですか?私は プレイヤーを手動でアクティブにしなければならないと思いましたか?これらの呼び出しは、PowerupのActivateイベントによって呼び出されるイベントハンドラに入ります。
  • input.RollPowerupとinput.ActivatePowerupをどこかにリセットしていますか?そうでなければ、予期せぬ問題が発生する可能性があります。新しい電源投入が各フレームで生成されるため、一度にすべてのパワーアップがアクティブになる可能性があります。
  • イベントの接続をゲームクラスのコンストラクタまたは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); 
} 

これよりそれにもっとあるかもしれませんが、それは私がこれまで見たものです。プロジェクトをどこかにアップロードして、私にリンクをメールしたいのであれば、それはいいです。

関連する問題