列表中的敌人:与其他敌人发生碰撞的问题
Enemies in a list: issue with colliding the enemies with the other enemies
我目前正在开发一个游戏,其中敌人列表在 x 轴上随机生成到关卡中,使用的列表达到最大生成数量(当前设置为 10)我有很大一部分游戏在运行,但是我目前遇到的问题是敌人可以 overlap/stack 相互叠加。
我想要的是,如果敌人的碰撞盒与列表中的另一个敌人相交,则不会重叠。 (如果这有意义的话)这是我到目前为止的代码。
foreach (EnemyClass enemy1 in enemies)
{
if (enemy1.position.X < myPlayer.position.X - 10 && !enemy1.stopMoving)
{
enemy1.position.X += enemy1.amountToMove;
}
if (enemy1.position.X > myPlayer.position.X - 50 && !enemy1.stopMoving)
{
enemy1.position.X -= enemy1.amountToMove;
}
foreach (EnemyClass enemy2 in enemies)
{
if (enemy1 != enemy2 && enemy1.collisionBox.Intersects(enemy2.collisionBox))
{
System.Console.WriteLine("Collision Detected");
}
}
enemy1.collisionX = (int)enemy1.position.X;
enemy1.Update(graphics.GraphicsDevice);
}
如有任何帮助,我们将不胜感激。
编辑:我错过的是它们在技术上确实会发生碰撞,但是当它们相距 1000 像素时它们会发生碰撞,而精灵实际上是 50 像素宽。
编辑:这是更改后的碰撞代码..
foreach (EnemyClass enemy in enemies)
{
enemy.collisionX = (int)enemy.position.X;
if (enemy.position.X < myPlayer.position.X - 10 && !enemy.stopMoving)
{
enemy.position.X += enemy.amountToMove;
}
if (enemy.position.X > myPlayer.position.X - 50 && !enemy.stopMoving)
{
enemy.position.X -= enemy.amountToMove;
}
for (int i = 0; i < enemies.Count; i++)
{
for (int j = i + 1; j < enemies.Count; j++)
{
if (enemies[i].collisionBox.Intersects(enemies[i].collisionBox))
{
System.Console.WriteLine("Collision Detected");
}
}
}
enemy.Update(graphics.GraphicsDevice);
}
编辑:这是 EnemyClass,其中包含 collisionBox:
public EnemyClass(Texture2D newTexture, Vector2 newPosition)
{
texture = newTexture;
position = newPosition;
collisionBox = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);
randX = random.Next(1, 3);
speed = new Vector2(randX, 0);
}
public void Update(GraphicsDevice graphics)
{
collisionBox = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(texture, position, Color.White);
}
似乎在所有碰撞框更新之前检测到碰撞。
我对如何订购东西的建议:
- 根据position.X和position.Y定义碰撞框所以
它始终准确反映正确的位置。
- 更新所有敌人的 x 和 y 位置。
- 在所有敌人位置更新后执行下面的代码片段。
foreach (EnemyClass enemy in enemies)
{
if (enemy.position.X < myPlayer.position.X - 10 && !enemy.stopMoving)
{
enemy.position.X += enemy.amountToMove;
}
if (enemy.position.X > myPlayer.position.X - 50 && !enemy.stopMoving)
{
enemy.position.X -= enemy.amountToMove;
}
enemy.Update(graphics.GraphicsDevice);
}
for (int i = 0; i < enemies.Count; i++)
{
for (int j = i + 1; j < enemies.Count; j++)
{
if (enemies[i].collisionBox.Intersects(enemies[j].collisionBox))
{
System.Console.WriteLine("Collision Detected");
}
}
}
上面的代码还有一个优点是不会检测到两次相同的碰撞(即enemy1/enemy2和enemy2/enemy1)。
我目前正在开发一个游戏,其中敌人列表在 x 轴上随机生成到关卡中,使用的列表达到最大生成数量(当前设置为 10)我有很大一部分游戏在运行,但是我目前遇到的问题是敌人可以 overlap/stack 相互叠加。
我想要的是,如果敌人的碰撞盒与列表中的另一个敌人相交,则不会重叠。 (如果这有意义的话)这是我到目前为止的代码。
foreach (EnemyClass enemy1 in enemies)
{
if (enemy1.position.X < myPlayer.position.X - 10 && !enemy1.stopMoving)
{
enemy1.position.X += enemy1.amountToMove;
}
if (enemy1.position.X > myPlayer.position.X - 50 && !enemy1.stopMoving)
{
enemy1.position.X -= enemy1.amountToMove;
}
foreach (EnemyClass enemy2 in enemies)
{
if (enemy1 != enemy2 && enemy1.collisionBox.Intersects(enemy2.collisionBox))
{
System.Console.WriteLine("Collision Detected");
}
}
enemy1.collisionX = (int)enemy1.position.X;
enemy1.Update(graphics.GraphicsDevice);
}
如有任何帮助,我们将不胜感激。
编辑:我错过的是它们在技术上确实会发生碰撞,但是当它们相距 1000 像素时它们会发生碰撞,而精灵实际上是 50 像素宽。
编辑:这是更改后的碰撞代码..
foreach (EnemyClass enemy in enemies)
{
enemy.collisionX = (int)enemy.position.X;
if (enemy.position.X < myPlayer.position.X - 10 && !enemy.stopMoving)
{
enemy.position.X += enemy.amountToMove;
}
if (enemy.position.X > myPlayer.position.X - 50 && !enemy.stopMoving)
{
enemy.position.X -= enemy.amountToMove;
}
for (int i = 0; i < enemies.Count; i++)
{
for (int j = i + 1; j < enemies.Count; j++)
{
if (enemies[i].collisionBox.Intersects(enemies[i].collisionBox))
{
System.Console.WriteLine("Collision Detected");
}
}
}
enemy.Update(graphics.GraphicsDevice);
}
编辑:这是 EnemyClass,其中包含 collisionBox:
public EnemyClass(Texture2D newTexture, Vector2 newPosition)
{
texture = newTexture;
position = newPosition;
collisionBox = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);
randX = random.Next(1, 3);
speed = new Vector2(randX, 0);
}
public void Update(GraphicsDevice graphics)
{
collisionBox = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(texture, position, Color.White);
}
似乎在所有碰撞框更新之前检测到碰撞。
我对如何订购东西的建议:
- 根据position.X和position.Y定义碰撞框所以 它始终准确反映正确的位置。
- 更新所有敌人的 x 和 y 位置。
- 在所有敌人位置更新后执行下面的代码片段。
foreach (EnemyClass enemy in enemies)
{
if (enemy.position.X < myPlayer.position.X - 10 && !enemy.stopMoving)
{
enemy.position.X += enemy.amountToMove;
}
if (enemy.position.X > myPlayer.position.X - 50 && !enemy.stopMoving)
{
enemy.position.X -= enemy.amountToMove;
}
enemy.Update(graphics.GraphicsDevice);
}
for (int i = 0; i < enemies.Count; i++)
{
for (int j = i + 1; j < enemies.Count; j++)
{
if (enemies[i].collisionBox.Intersects(enemies[j].collisionBox))
{
System.Console.WriteLine("Collision Detected");
}
}
}
上面的代码还有一个优点是不会检测到两次相同的碰撞(即enemy1/enemy2和enemy2/enemy1)。