首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多目标碰撞检测

多目标碰撞检测
EN

Stack Overflow用户
提问于 2011-11-11 02:33:53
回答 3查看 14.1K关注 0票数 16

我主要集中在图形方面来创建一个小的2DGame。我看过几个教程,但没有一个是令人满意的。我已经有一个玩家(一个方块)移动并与屏幕上的其他方块发生碰撞。重力等也做了。

如果只有屏幕上看到的那么多对象(30*20),一切都会很好地工作。但是如果我将它增加到300*300,程序开始运行非常慢,因为它必须检查太多的对象。

我真的不明白像“我的世界”这样的游戏是如何处理所有这些块的,而我的程序已经放弃了300*300块。

我已经尝试过仅在对象可见时检查碰撞,但这会导致程序检查每个对象的可见性,从而导致相同的问题。我做错了什么?感谢你的帮助。

我将发布一些关于如何处理冲突的代码。

代码语言:javascript
复制
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++;
            }
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-11 03:02:28

优化碰撞检测的常用方法是使用space partition对对象进行分类/管理。

这种方法的总体思想是,您构建一棵表示空间的树,并根据对象的位置将对象放入该树中。当您计算碰撞时,您将遍历树。这样,与使用暴力方法相比,您必须执行的计算要少得多,因为您将忽略分支中除正在遍历的对象之外的所有对象。我的世界和类似的可能使用octrees进行碰撞(也可能用于渲染)。

最常见的空间分区结构是BSP-Treeskd-Trees (一种特殊类型的BSP树)。更简单的方法是使用统一的空间分区作为开始-将空间拆分为轴对齐的两半。

我发现的关于冲突的最好的资源是this book。它应该澄清你在这个主题上的所有问题。

这是如果你想做对的话。如果您想快速完成此操作,可以仅对角色周围的颜色缓冲区进行采样,或者仅在移动方向上采样以确定障碍物是否接近。

票数 31
EN

Stack Overflow用户

发布于 2011-11-11 05:14:02

正如Kostja提到的,对你的空间进行分区会很有用。然而,你将需要使用QuadTrees而不是八叉树,因为你只在2D而不是3D中。这里有一个很好的article,可以让你开始使用QuadTrees。

票数 4
EN

Stack Overflow用户

发布于 2011-11-11 03:05:57

您可以将开销减少4倍,而不是计算上/下/左/右的碰撞,只计算一次碰撞,并使用两个对象的相对位置来确定您是否撞到了地板、墙壁或天花板。另一个好主意是只关注附近的物体-也许每0.25秒一次,列出所有可能在接下来的0.25秒内发生碰撞的足够近的物体?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8084525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档