我主要专注于图形方面,创建了一个简单的2D游戏。我观看/查看了几个教程,但没有一个让我满意的。我已经有一个玩家(一个正方形)在屏幕上移动并与其他正方形发生碰撞。包括重力等都已经完成。
如果只有那么少量的对象出现在屏幕上(30 * 20),一切都非常完美。但是如果我将它增加到300 * 300,程序开始运行得非常慢,因为它必须检查这么多对象。
我真的不明白像Minecraft这样的游戏可以处理所有这些块,而我的程序在300 * 300个块上已经放弃了。
我已经尝试仅在对象可见时检查碰撞,但这会导致程序检查每个单独的对象的可见性,从而导致同样的问题。我做错了什么?感谢帮助。
我将发布一些代码,展示如何处理碰撞。
如果只有那么少量的对象出现在屏幕上(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++;
}
}
}
Map.tileAmount
是什么?你是否检查了离问题对象太远的地方?碰撞检测实际上是如何工作的?你是否尽可能跳过了网格位置之间的空间? - Dave Newton