当前位置: 首页 > 面试题库 >

与许多物体的碰撞检测

莘钧
2023-03-14
问题内容

我主要专注于图形方面,以创建一些2DGame。我看过/看过几本教程,但是没有一部教程那么令人满意。我已经有一个玩家(一个正方形)在屏幕上移动并与其他正方形碰撞。重力等。

如果在屏幕上看到的对象太多(30 * 20),则一切正常。但是,如果我将其增加到300 * 300,则该程序开始运行非常慢,因为它必须检查许多对象。

我真的不知道Minecraft之类的游戏如何与ALL THOSE块一起使用,我的程序已经放弃了300 * 300块。

我已经尝试过仅在对象可见时检查冲突,但这导致程序检查每个对象的可见性,从而导致相同的问题。我究竟做错了什么?帮助表示赞赏。

我将发布一些有关如何处理碰撞的代码。

player.collision(player, wall);

public void collision(Tile object1, Tile[] object2){
    collisionCheckUp(object1, object2);
    collisionCheckDown(object1, object2);
    collisionCheckLeft(object1, object2);
    collisionCheckRight(object1, object2);  
}

public void collisionCheckDown(Tile object1, Tile[] object2){

    for (int i = 0; i < Map.tileAmount; i++){
        if(object2[i] != null && object2[i].visible)
        {
            if(object1.isCollidingDown(object2[i])){
                object1.collisionDown = true;
                return;
            }

        }
    }       
    object1.collisionDown = false;
}

public void compileHullDown(){

     collisionHull = new Rectangle((int)x+3, (int)y+3, width-6, height);
}

int wallCount = 0;
    for (int x=0;x<Map.WIDTH;x++) {
        for (int y=0;y<Map.HEIGHT;y++) {

            if (Map.data[x][y] == Map.BLOCKED) {
                wall[wallCount] = new Tile(x * Map.TILE_SIZE, y *  Map.TILE_SIZE);
                wallCount++;
            }
        }
    }

问题答案:

优化冲突检测的常用方法是使用空间分区对对象进行分类/管理。

这种方法的总体思路是,您要构建一棵代表空间的树,然后根据对象的位置将其放入该树中。计算碰撞时,将遍历树。这样,您将需要执行的计算比使用蛮力方法少得多,因为您将忽略分支中除遍历对象之外的所有对象。Minecraft和类似的应用可能使用八叉树进行碰撞(也可能用于渲染)。

最常见的空间分区结构是BSP树,kd树(BSP
树的一种特殊类型)。比较简单的方法是在开始时使用统一的空间分区-
将空间分成与轴对齐的两半。

我发现的关于碰撞的最佳资源是本书。它应阐明您对该主题的所有问题。

那是您想做对的事。如果要快速进行操作,则可以对角色周围的颜色缓冲区进行采样,或者仅在移动方向上进行采样,以确定障碍物是否在附近。



 类似资料:
  • 当我在中创建一个场景时,我经常需要两个节点在完全相同的或位置来创建一面墙。我添加了矩形物理体。它们都没有任何摩擦。 当我使一个spritendode在这些碰撞体上移动时(我对物理体使用冲量),它的行为就像在两个矩形之间有一个屏障,我需要“推”节点或使其跳过边界。正如我所说的,这些节点彼此完全一致,因此节点应该能够平滑地通过它们。 有什么建议吗? 如果你需要我正在使用的任何代码/图片,请询问。 编辑

  • 问题内容: 问题: 我知道这个问题已经问了很多遍了,但是我没有找到任何好的答案。 所以我有一些游戏实体,现在检查碰撞的最佳方法是什么? 链接: 游戏(完成) 代码说明: 我有一个世界一流的实体列表: 我使用以下代码更新它们(仅在视图范围内): 所以现在我想检查实体更新方法中是否存在冲突。 我尝试将其作为更新方法: 这是当前的昆虫方法: 当前,相交方法始终返回true。但为什么? 问题答案: 实现此

  • 我有两个身体,都是动态的,其中一个我已经关闭了重力,只有当它被我的另一个身体击中时才想打开它。我知道我可以设置自己的联系人侦听器,但我想指定一个动作,只有当两个特定的身体接触时。 有人有指导吗?

  • 我目前正在开发一款2D无休止跑者,用Swift3编写,并使用Spritekit。 简短的问题: 有没有办法只检查我的角色的矩形物理体右侧的碰撞? 更多信息: 角色运行的平台由拼图块组成,用户在游戏进行时在此基础上进行构建。角色从左到右,相对于背景(从右到左)。 我希望角色在与右侧的棋子相撞时自动跳跃。然而,玩家放在他右边的任何棋子(与角色的Y值相同)都与他下面的棋子属于同一等级。 因此,只要游戏检

  • 问题内容: 你好。 我有多个碰撞问题。有一颗子弹击中了敌人(红色矩形)。然后,它+分数。有一个螺旋线(红色圆圈) 被推测为当敌人(红色矩形)触摸场景时触发场景结束。 在这种情况下,当敌人击中螺旋桨时,螺旋桨将起作用,场景结束,然后我们进入菜单屏幕。但是,当子弹击中敌人时,同样的事情也会发生,我也不知道为什么。 现在,这是我的代码: 现在,我知道那是一团糟,但是有人可以帮助我吗?我认为问题与body

  • 我正在构建一个迷宫游戏,在这里我有一个简单的地图... 直到没有问题,但我的问题是碰撞 这是我的地图: 在这里,我用以下代码自己构建了地图: 此碰撞代码用于右上角矩形 我已经尝试了两种不同类型的碰撞代码,但都不起作用 碰撞码: 在这里,当玩家从左侧击中矩形时,玩家向下移动,当玩家从底部击中矩形时,玩家向左移动。 我用if, else if语句尝试过相同的代码,但仍然不起作用。当玩家点击左侧时,它可