Java 如何有效地实现2D游戏的碰撞?
我刚刚用Java、LWJGL和Slick Util开始了一个新的2D游戏,但我似乎找不到一个好的方法来进行碰撞检测。 如果我愿意,使用矩形相交方法很容易检测两个实体之间的碰撞,但它只能检查与指定区域的碰撞。 我曾认为我可以在创建时列出每个实体及其坐标,然后在列表中运行intersect方法,但是每次游戏更新时,它都会检查与整个地图上的每个实体的碰撞,我认为这太低效了 有人知道创建碰撞检测的更有效的方法吗?如果有什么方法,我可以检查角色移动的每个点是否都有实体,这可能是最好的方法Java 如何有效地实现2D游戏的碰撞?,java,collision-detection,lwjgl,Java,Collision Detection,Lwjgl,我刚刚用Java、LWJGL和Slick Util开始了一个新的2D游戏,但我似乎找不到一个好的方法来进行碰撞检测。 如果我愿意,使用矩形相交方法很容易检测两个实体之间的碰撞,但它只能检查与指定区域的碰撞。 我曾认为我可以在创建时列出每个实体及其坐标,然后在列表中运行intersect方法,但是每次游戏更新时,它都会检查与整个地图上的每个实体的碰撞,我认为这太低效了 有人知道创建碰撞检测的更有效的方法吗?如果有什么方法,我可以检查角色移动的每个点是否都有实体,这可能是最好的方法 如果我没有足够的
如果我没有足够的信息,或者我把这听起来太令人困惑,请告诉我,我可以尝试澄清事情。另一个附带问题是,使用slick util或slick 2D的好处是什么。谢谢你的帮助 解决这个问题的通常方法是场景图,一个游戏世界中对象的层次系统 你可能想看看和 缩短:在节点下对对象进行逻辑分组,并为节点指定一个包含其所有子节点和叶(对象)的边界矩形。所有内容再次分组到一个主节点下以访问树。现在可以测试对象与节点的碰撞,通常从主节点开始。如果你被击中,你会检查它的子节点并离开 这将需要一些时间来实现,但如果树结构/分组正确,则可以减少CPU使用。它的另一个好处是,您可以实现局部变换,从而使相对移动对象更容易。因为我讨厌“通常的方式”,我制作了一个所有坐标的数组,然后检查是否有一个点碰到坐标 下面是对我的代码的一点修改,以演示(它是3D的):
for(炮弹罐:GameServer.ballss){//检查所有炮弹
如果(can.owner!=cl){//can.owner是船,cl是检查炮弹是否相撞的玩家。
int距离x=(int)(can.x-cl.z);
int距离z=(int)(can.z-cl.x);
最终整数距离y=(整数)(can.y-cl.y);
double xRot=Math.cos(Math.toRadians(cl.rotation))*(distancex-0)-Math.sin(Math.toRadians(cl.rotation))*(distancez-0)+0;
双zRot=Math.sin(Math.toRadians(cl.rotation))*(distancex-0)-Math.cos(Math.toRadians(cl.rotation))*(distancez-0)+0;
距离x=(int)xRot;
距离z=(int)zRot;
试一试{
if(true){//跳过不同船舶的不同坐标,以便于演示
i=GameServer.coords[GameServer.DELTA+distancex][GameServer.DELTA+distancez][GameServer.DELTA+(distancey)];
}
如果(i==1){
如果(can.owner!=cl){
remcan.add(can);
如果(can.type==0){
双重伤害=(100+数学随机()*25);
如果(cl.type==1){
损伤/=2;
}
如果(cl.type==2){
损坏*=2;
}
cl.损坏-=损坏;
}
如果(can.type==1){
双重伤害=(数学随机()*500);
如果(cl.type==1){
损伤/=2;
}
如果(cl.type==2){
损坏*=2;
}
cl.损坏-=损坏;
}否则{
双重伤害=(100+数学随机()*25);
如果(cl.type==1){
损伤/=2;
}
如果(cl.type==2){
损坏*=2;
}
cl.损坏-=损坏;
}
崩溃=真;
如果(cl.损坏<1){
如果(!cl.sinking){
cl.下沉=真;
}
}
}
}
}捕获(例外e){
e、 printStackTrace();
}
}
GameServer.coords是一个int[][],其坐标如下:
public static int[][][] coords;
public void CollisionSetup(){
try{
File f = new File("res/coords.txt");
String coords = readTextFile(f.getAbsolutePath());
for (int i = 0; i < coords.length();){
int i1 = i;
for (; i1 < coords.length(); i1++){
if (String.valueOf(coords.charAt(i1)).contains(",")){
break;
}
}
String x = coords.substring(i, i1).replace(",", "");
i = i1;
i1 = i + 1;
for (; i1 < coords.length(); i1++){
if (String.valueOf(coords.charAt(i1)).contains(",")){
break;
}
}
String y = coords.substring(i, i1).replace(",", "");;
i = i1;
i1 = i + 1;
for (; i1 < coords.length(); i1++){
if (String.valueOf(coords.charAt(i1)).contains(",")){
break;
}
}
String z = coords.substring(i, i1).replace(",", "");;
i = i1 + 1;
//buildx.append(String.valueOf(coords.charAt(i)));
////System.out.println(x);
////System.out.println(y);
////System.out.println(z);
//x = String.valueOf((int)Double.parseDouble(x));
//y = String.valueOf((int)Double.parseDouble(y));
//z = String.valueOf((int)Double.parseDouble(z));
double sx = Double.valueOf(x);
double sy = Double.valueOf(y);
double sz = Double.valueOf(z);
javax.vecmath.Vector3f cor = new javax.vecmath.Vector3f(Float.parseFloat(x), Float.parseFloat(y), Float.parseFloat(z));
//if (!arr.contains(cor)){
if (cor.y > 0)
arr.add(new javax.vecmath.Vector3f(cor));
if (!ship.contains(new Vector3f((int) sx, (int) sy, (int) sz)))
ship.add(new Vector3f((int) sx, (int) sy, (int) sz));
Float.parseFloat(z)));
}
}
public void setUpPhysics() {
//coords = new int[20][20];
coords = new int[80][80][80];
coords1 = new int[80][80];
//coords[-5 + DELTA][7 + DELTA] = 11;
for (javax.vecmath.Vector3f vec : arr){
coords[DELTA+(int) vec.x][DELTA+(int) vec.z][DELTA + (int) vec.y] = 1; //This is line 124
coords1[DELTA+(int) vec.x][DELTA+(int) vec.z] = 1;
}
}
publicstaticint[]coords;
公共无效冲突设置(){
试一试{
文件f=新文件(“res/coords.txt”);
字符串coords=readTextFile(f.getAbsolutePath());
对于(int i=0;ipublic static int[][][] coords;
public void CollisionSetup(){
try{
File f = new File("res/coords.txt");
String coords = readTextFile(f.getAbsolutePath());
for (int i = 0; i < coords.length();){
int i1 = i;
for (; i1 < coords.length(); i1++){
if (String.valueOf(coords.charAt(i1)).contains(",")){
break;
}
}
String x = coords.substring(i, i1).replace(",", "");
i = i1;
i1 = i + 1;
for (; i1 < coords.length(); i1++){
if (String.valueOf(coords.charAt(i1)).contains(",")){
break;
}
}
String y = coords.substring(i, i1).replace(",", "");;
i = i1;
i1 = i + 1;
for (; i1 < coords.length(); i1++){
if (String.valueOf(coords.charAt(i1)).contains(",")){
break;
}
}
String z = coords.substring(i, i1).replace(",", "");;
i = i1 + 1;
//buildx.append(String.valueOf(coords.charAt(i)));
////System.out.println(x);
////System.out.println(y);
////System.out.println(z);
//x = String.valueOf((int)Double.parseDouble(x));
//y = String.valueOf((int)Double.parseDouble(y));
//z = String.valueOf((int)Double.parseDouble(z));
double sx = Double.valueOf(x);
double sy = Double.valueOf(y);
double sz = Double.valueOf(z);
javax.vecmath.Vector3f cor = new javax.vecmath.Vector3f(Float.parseFloat(x), Float.parseFloat(y), Float.parseFloat(z));
//if (!arr.contains(cor)){
if (cor.y > 0)
arr.add(new javax.vecmath.Vector3f(cor));
if (!ship.contains(new Vector3f((int) sx, (int) sy, (int) sz)))
ship.add(new Vector3f((int) sx, (int) sy, (int) sz));
Float.parseFloat(z)));
}
}
public void setUpPhysics() {
//coords = new int[20][20];
coords = new int[80][80][80];
coords1 = new int[80][80];
//coords[-5 + DELTA][7 + DELTA] = 11;
for (javax.vecmath.Vector3f vec : arr){
coords[DELTA+(int) vec.x][DELTA+(int) vec.z][DELTA + (int) vec.y] = 1; //This is line 124
coords1[DELTA+(int) vec.x][DELTA+(int) vec.z] = 1;
}
}