0

これがゲームプレイです。条件は3つ。

プレイヤーがスイッチ タイルを踏むとfalseになりました。

1) 敵がそれを踏むと (トラップされ)、プレイヤーも踏むと、敵は破壊されます。

2) しかし、敵がそれを踏み、プレイヤーも踏まなかった場合、敵は逃げます。

3) Switch-Tile 条件がtrue の場合、何も起こりません。この効果は、スイッチ タイルが偽の場合 (プレイヤーがスイッチ タイルを踏む) にアクティブ化されます。

Enemy と Switch-Tile が多いため、foreachループを使用する必要があります。

問題は、敵が逃走し (ケース 2)、別のスイッチ タイルを再び踏んだ後、敵に何も起こらなかったことです!

何が悪いのかわかりませんでした。効果は同じはずですが、敵は何事もなかったかのようにスイッチ タイルを通過します (トラップされるはずです)。

誰かが何が悪いのか教えてもらえますか?

コードは次のとおりです。

public static void switchUpdate(GameTime gameTime)
        {
            foreach (SwitchTile switch in switchTiles)
            {
                foreach (Enemy enemy in EnemyManager.Enemies)
                {
                    if (switch.Active == false)
                    {                    
                        if (!enemy.Destroyed)
                        {                                
                            if (switch.IsCircleColliding(enemy.EnemyBase.WorldCenter,
                                enemy.EnemyBase.CollisionRadius))
                            {                                    
                                enemy.EnemySpeed = 10; //reducing Enemy Speed if it enemy is step on the Tile (for about two seconds)
                                enemy.Trapped = true;
                                float elapsed = (float)gameTime.ElapsedGameTime.Milliseconds;
                                moveCounter += elapsed;
                                if (moveCounter> minMoveTime)
                                {
//After two seconds, if the player didn't step on Switch-Tile.
//The Enemy escaped and its speed back to normal
                                    enemy.EnemySpeed = 60f;
                                    enemy.Trapped = false;
                                }
                            }
                        }
                    }

                    else if (switch.Active == true && enemy.Trapped == true
                        && switch.IsCircleColliding(enemy.EnemyBase.WorldCenter,
                                enemy.EnemyBase.CollisionRadius)
                        )
                    {
//When the Player step on Switch-Tile and 
//there is an enemy too on this tile which was trapped = Destroy Enemy  

                        enemy.Destroyed = true;                            
                    }
                }

            }
        }
4

1 に答える 1

1
           else if (switch.Active == true && enemy.Trapped == true
                && switch.IsCircleColliding(enemy.EnemyBase.WorldCenter,
                        enemy.EnemyBase.CollisionRadius)
                )
            {
                //When the Player step on Switch-Tile and 
                //there is an enemy too on this tile which was trapped = Destroy Enemy  

                enemy.Destroyed = true;                            
            }

スイッチがアクティブでない場合にのみ、敵がトラップされるかどうかを設定するため、このコードは決して真になりません。true に設定したら、実際にループを抜け出してから、もう一度テストして、敵を破壊する必要があるかどうかを確認する必要があります。

やりたいロジックを再考し、各段階で敵などの正しい情報にアクセスできるようにします。

PS foreach ループを使用する必要はありません。for ループを簡単に使用してコンテナーを反復処理することも、非常にサディスティックな場合は、すべての敵を自分で単純にハードコードすることもできます。Foreach ループは、この種の問題を解決する 1 つの方法にすぎません。使用できるからといって、使用する必要があるわけではありません ;)

于 2012-12-04T11:32:58.490 に答える