这是游戏玩法。有三个条件。
玩家踏上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;
}
}
}
}
答案 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循环只是解决这类问题的一种方法,因为它们可以被使用,并不意味着你需要使用它们;)