在我正在建造的游戏中,我制作了一个基本的碰撞检测系统。
我目前的方法解释如下:
我锻炼玩家将进入游戏的下一步:
double checkforx = x+vx;
double checkfory = y+vy;
然后我检查mapArray中与块(1)的碰撞。
public static Boolean checkForMapCollisions(double character_x,double character_y){
//First find our position in the map so we can check for things...
int map_x = (int) Math.round((character_x-10)/20);
int map_y = (int) Math.round((character_y-10)/20);
//Now find out where our bottom corner is on the map
int map_ex = (int) Math.round((character_x+10)/20);
int map_ey = (int) Math.round((character_y+10)/20);
//Now check if there's anything in the way of our character being there...
try{
for(int y = map_y; y <= map_ey; y++){
for(int x = map_x; x <= map_ex; x++){
if (levelArray[y][x] == 1){
return true;
}
}
}
}catch (Exception e){
System.out.println("Player outside the map");
}
return false;
}
如果返回true {nothing}
如果返回false {Player physics}
我需要玩家能够在一个街区上降,然后能够四处走动,但我找不到足够的教程。
有人可以告诉我如何进行碰撞检测和/或移动吗?
答案 0 :(得分:1)
这个问题分为两部分。碰撞检测,意味着确定体积是否接触或交叉另一个体积。第二个是碰撞响应。碰撞响应是物理部分。
我将在这里讨论碰撞检测,因为这主要是你所询问的。
为地图定义一个类,如下所示:
int emptyTile = 0;
//this assumes level is not a ragged array.
public boolean inBounds(int x, int y){
return x>-1 && y>-1 && x<levelArray[0].length && y<levelArray.length;
}
public boolean checkForCollisions(Rectangle rectangle){
boolean wasCollision = false;
for(int x=0;x<rectangle.width && !wasCollision;x++){
int x2 = x+rectangle.x;
for(int y=0;y<rectangle.height && !wasCollision;y++){
int y2 = y+rectangle.y;
if(inBounds(x2,y2) && levelArray[y2][x2] != emptyTile){
//collision, notify listeners.
wasCollision=true;
}
}
}
}
不要让你的方法保持静态。你可能想要一个级别的多个实例吗?静态用于当您需要共享状态时,该状态在类的多个实例中保持不变。每个级别的级别数据肯定不会保持不变。
尝试传入整个矩形,而不是传入坐标。这个矩形将是你角色的边界框(边界框有时也被称为AABB,这意味着轴对齐的边界框,只是因为你正在网上阅读教程这样的事情。)让你的精灵class决定它的边界矩形是什么,这不是map类的责任。所有地图都应该用于渲染,以及矩形是否重叠非空的拼贴。
答案 1 :(得分:0)
我很抱歉有一个非常糟糕的解释,但这是我的github代码,它会有所帮助。
https://github.com/Quillion/Engine
只是为了解释我的所作所为。我有角色对象(https://github.com/Quillion/Engine/blob/master/QMControls.java),它有向量和一个名为standing的布尔值。每次布尔站立都是假的。然后我们将它传递给引擎以检查是否发生冲突,如果发生碰撞则静止并且y向量为0.对于x向量,只要按任意箭头键,就可以使对象的xvector成为您想要的任何值。在更新循环中,您将以给定的速度移动给定的框。