球员和敌人子弹之间的碰撞?

时间:2013-04-15 01:07:47

标签: c# xna xna-4.0 visual-c#-express-2010

所以,我正在编写一种Bullet Hell游戏,我已经制作了代码来检测碰撞,它确实有效......但我认为有一种更简单的方法可以做到这一点。让我解释一下。

在代码中,有GameScreen,它创建了Player类和Enemy类的实例...... Enemy Class创建Bullet Pattern Class的实例,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,检查是否与敌人发生碰撞,如果没有,则调用模式方法:

    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;
    }

正如我所说,它确实有效,但我知道有一种更简单的方法可以做到这一点...... 所以问题实际上是两个:  1.有一种更简单的方法来进行碰撞检查吗?  2. GameScreen可以直接从模式中访问子弹列表吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

有许多方法可以在不绕过每个游戏对象的情况下检测碰撞。

  1. 四叉树(http://en.wikipedia.org/wiki/Quadtree
  2. 基于网格的碰撞检查,将游戏划分为网格,并通过迭代不同的网格完成整个碰撞检测。
  3. 还有其他方法我不知道。除此之外,您还需要确定碰撞检测是continuous还是discrete,特别是在使用项目符号时,因为它们是快速移动的对象。

    至于GameScreen访问这些项目符号的方式,请使用GameObjectManager跟踪游戏中的所有对象。将该类作为单例实例保留在游戏注册表中,以便跟踪需要不断更新的元素。