我主要专注于Graphics方面来创建一个2DGame。我看过/看过几个教程,但没有一个是令人高兴的。我已经有一个玩家(一个正方形)移动并与屏幕上的其他方块相撞。重力等也完成了。
如果屏幕上只显示那么多物体(30 * 20),一切都很好。但是如果我把它增加到300 * 300,程序开始运行得非常慢,因为它必须检查这么多的对象。
我真的不知道像Minecraft这样的游戏如何与所有这些块一起使用,而我的程序已经放弃了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++;
}
}
}
答案 0 :(得分:29)
优化碰撞检测的常用方法是使用space partition对对象进行分类/管理。
该方法的一般概念是,您构建一个表示空间的树,并根据其位置将您的对象放入该树中。计算碰撞时,您将遍历树。这样,您将不得不执行比使用强力方法少得多的计算,因为您将忽略除了您正在遍历的分支之外的所有对象。 Minecraft和类似的东西可能使用octrees进行碰撞(也可能用于渲染)。
最常见的空间分区结构是BSP-Trees,kd-Trees(一种特殊类型的BSP树)。更简单的方法是在开始时使用统一的空间分区 - 以轴对齐的一半分割空间。
我发现的最佳碰撞资源是this book。它应该澄清你对这个主题的所有问题。
如果你想做得好的话。如果你想快速做,你可以只是在你的角色周围采样颜色缓冲区,或者只在运动方向上采样,以确定障碍物是否接近。
答案 1 :(得分:4)
答案 2 :(得分:0)
您可以将开销减少4倍,而不是计算上/下/左/右碰撞,计算一次碰撞并使用两个物体的相对位置来查明是否撞到了地板,墙壁或天花板。另一个好主意是只注意附近的物体 - 也许每0.25秒就会生成一个可能在接下来的0.25秒内与之碰撞的所有物体的列表?