0

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

玩家踩到 Switch-Tile,它变成了false

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

2)但是当敌人踩到它并且玩家没有踩到它时,敌人就会逃脱。

3) 如果 Switch-Tile 条件为,那么什么也没有发生。当 Switch tile 为 false(玩家踩到 Switch-Tile)时,效果会被激活。

因为有很多 Enemy 和很多 Switch-Tile,我不得不使用foreach循环。

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

我不知道出了什么问题。效果应该是一样的,但是敌人像什么都没发生一样通过 Switch tile(他们应该被困住)

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

这是代码:

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 循环只是解决此类问题的一种方法,只是因为它们可以使用,并不意味着您需要使用它们;)

于 2012-12-04T11:32:58.490 回答