XNA 2D Top Down游戏 - FOREACH无法检查Enemy和Switch-Tile

时间:2012-12-04 06:08:52

标签: c# xna xna-4.0

这是游戏玩法。有三个条件。

玩家踏上Switch-Tile,它变为 false

1)当敌人踩到它(被困)并且玩家也踩到它时,敌人将被摧毁。

2)但是当敌人踩到它并且玩家DIDN也踩到它时,敌人将被逃脱。

3)如果Switch-Tile条件为 true ,则没有任何反应。当Switch tile为false(Switch-Tile上的播放器步骤)时,效果被激活。

因为有很多Enemy和很多Switch-Tile,所以我必须使用 foreach 循环。

问题是在Enemy被ESCAPED(案例2)并再次踩到另一个Switch-Tile之后,敌人什么都没发生!

我不知道出了什么问题。效果应该是相同的,但敌人通过Switch瓦片就像没有发生任何事情(他们应该被困)

有人可以告诉我出了什么问题吗?

以下是代码:

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

            }
        }

1 个答案:

答案 0 :(得分: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;                            
            }

此代码永远不会成立,因为您只有在交换机未处于活动状态时才设置敌人是否被困。一旦你将它设置为真,你应该真正打破循环,然后再次测试,看看你是否应该摧毁敌人。

重新思考你想要做的逻辑,并确保在每个阶段你都可以获得敌人的正确信息等。

P.S你不需要使用foreach循环。您可以轻松地使用for循环并迭代容器,或者如果您真的很虐待,您可以自己简单地为每个敌人编写硬编码。 Foreach循环只是解决这类问题的一种方法,因为它们可以被使用,并不意味着你需要使用它们;)