玩家与敌人子弹的碰撞
本文关键字:碰撞 子弹 敌人 玩家 | 更新日期: 2023-09-27 18:09:03
我正在编写一款《Bullet Hell》游戏,我已经编写了检测碰撞的代码,它确实有效,但我认为有一种更简单的方法可以做到这一点。让我解释一下。
在代码中,有一个GameScreen,创建一个玩家类和一个敌人类的实例。
这个Enemy类创建了一个Bullet Pattern类的实例,而Bullet Pattern就是实例化这些子弹的类。不与敌人类一起生成它们的原因是一个敌人可以有多个模式。
所以,Bullet Pattern类是在屏幕上包含一个项目列表的类。所以,为了检查碰撞,GameScreen有一个方法,获取玩家位置(和碰撞器半径)并调用与敌人的碰撞检查,如果没有与敌人碰撞,则调用模式的碰撞检查,检查与子弹的碰撞。
GameScreen CheckCollision:
private void CheckCollision()
{
Vector2 playerPos = player.GetPosition();
float colSize = player.GetColliderSize();
bool isColliding = testEnemy.CheckCollision(playerPos, colSize);
if (isColliding) //If collides, the player do what it should do.
{
player.Collide();
}
}
Enemy CheckCollision,检查是否与敌人发生碰撞,如果没有,调用pattern方法:
public bool CheckCollision(Vector2 playerPos, float colSize)
{
float distance = Game1.DistanceBetween(playerPos, position);
float minDistance = colSize + colliderSize;
bool collision = distance <= minDistance;
if (collision)
{
return collision;
}
collision = patterns[actualPattern].CheckCollision(playerPos, colSize);
return collision;
}
Pattern CheckCollision:
public bool CheckCollision(Vector2 playerPos, float colSize)
{
//The pattern can have Sub Patterns, wich is the same pattern class...
for (byte i = 0; i < subPatterns.Count; i++)
{
subPatterns[i].CheckCollision(playerPos, colSize);
}
for (int i = 0; i < bullets.Count; i++)
{
Vector2 bulletPos = bullets[i].GetPosition();
float bulletSize = bullets[i].GetColliderSize();
float distance = Game1.DistanceBetween(playerPos, bullets[i].position);
float minDistance = colSize + bulletSize;
if (distance <= minDistance)
{
return true;
break;
}
}
return false;
}
正如我所说,它实际上是有效的,但我知道有一种更简单的方法……所以问题实际上是两个:
- 是否有更简单的方法来做碰撞检查?是否有一种方法可以让gamesscreen直接从模式中访问子弹列表?
有很多方法可以检测碰撞,而无需循环遍历每个游戏对象。
- 利用(http://en.wikipedia.org/wiki/Quadtree)
- 基于网格的碰撞检查,游戏被划分成网格,整个碰撞检测是通过迭代不同的网格来完成的。
还有其他我不知道的方法。除此之外,你还需要确定碰撞检测是continuous
还是discrete
,特别是当使用子弹时,因为这些是快速移动的物体。
对于GameScreen访问这些子弹的方式,使用GameObjectManager来跟踪游戏中的所有对象。将这个类作为一个单例实例保存在你的游戏注册表中,这样你就可以很容易地跟踪需要不断更新的元素。