Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何有效地实现2D游戏的碰撞?_Java_Collision Detection_Lwjgl - Fatal编程技术网

Java 如何有效地实现2D游戏的碰撞?

Java 如何有效地实现2D游戏的碰撞?,java,collision-detection,lwjgl,Java,Collision Detection,Lwjgl,我刚刚用Java、LWJGL和Slick Util开始了一个新的2D游戏,但我似乎找不到一个好的方法来进行碰撞检测。 如果我愿意,使用矩形相交方法很容易检测两个实体之间的碰撞,但它只能检查与指定区域的碰撞。 我曾认为我可以在创建时列出每个实体及其坐标,然后在列表中运行intersect方法,但是每次游戏更新时,它都会检查与整个地图上的每个实体的碰撞,我认为这太低效了 有人知道创建碰撞检测的更有效的方法吗?如果有什么方法,我可以检查角色移动的每个点是否都有实体,这可能是最好的方法 如果我没有足够的

我刚刚用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;
        }
  }