我正在编写一种子弹地狱游戏,我编写了代码来检测碰撞,它确实有效,但我认为有一种更简单的方法可以做到这一点。让我解释。
在代码中,有一个 GameScreen,它创建了 Player Class 和 Enemy Class 的实例。
那个 Enemy 类创建了一个 Bullet Pattern 类的实例,而 Bullet Pattern 是实例化子弹的类。不使用敌人类生成它们的原因是一个敌人可以有多个模式。
因此,Bullet Pattern 类是包含屏幕上的项目符号列表的类。因此,为了检查碰撞,GameScreen 有一个方法,它获取玩家位置(和碰撞器半径)并调用与敌人的碰撞检查,如果没有与敌人碰撞,则调用碰撞检查模式,它检查与子弹的碰撞。
游戏画面检查碰撞:
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,它检查它是否与敌人发生碰撞,如果没有,则调用模式方法:
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;
}
模式检查碰撞:
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;
}
正如我所说,它确实有效,但我知道有一种更简单的方法可以做到这一点......所以问题实际上是两个:
- 有没有更简单的方法来进行碰撞检查?
- 有没有办法让 GameScreen 直接从模式中访问项目符号列表?