如何检查形状是否包含任何对象?JAVA

如何检查形状是否包含任何对象?JAVA,java,slick2d,Java,Slick2d,我不熟悉Slick2d,也不熟悉这个页面,我试着询问slick论坛,但是人不多,所以我找不到答案 无论如何,我一直在尝试在Slick2d java游戏库中创建一个platformer引擎,我正在考虑使用Shape类的contains和intersects方法 问题是,如果我想检查一个形状是否包含任何类型的对象(或某个特定类中的任何对象),有没有办法做到这一点?我找到的所有教程都解释了如何测试单个形状的碰撞,但是如果我想检查任何对象呢 package juegoconslick; import

我不熟悉Slick2d,也不熟悉这个页面,我试着询问slick论坛,但是人不多,所以我找不到答案

无论如何,我一直在尝试在Slick2d java游戏库中创建一个platformer引擎,我正在考虑使用Shape类的contains和intersects方法

问题是,如果我想检查一个形状是否包含任何类型的对象(或某个特定类中的任何对象),有没有办法做到这一点?我找到的所有教程都解释了如何测试单个形状的碰撞,但是如果我想检查任何对象呢

package juegoconslick;

import java.util.ArrayList;
import org.newdawn.slick.*;
import org.newdawn.slick.geom.Rectangle;
import org.newdawn.slick.geom.Shape;
public class JuegoConSlick extends BasicGame {

Jugador player;
Input entrada;
 Shape hitbox;
bloque bloq;
ArrayList<bloque> bloques = new ArrayList<>();
public JuegoConSlick(){

    super("Mi prueba");

}

public static void main(String[] args) {

    AppGameContainer juegito;
    try{
     juegito = new AppGameContainer(new JuegoConSlick());
     juegito.setDisplayMode(630,400,false);
     juegito.setMaximumLogicUpdateInterval(60);
     juegito.setMaximumLogicUpdateInterval(50);
     juegito.setAlwaysRender(true);
     juegito.setVSync(true);
     juegito.start();

    }catch(Exception ex){
        System.exit(0);
    }
}

@Override
public void init(GameContainer gc) throws SlickException {

     player = new Jugador();
     hitbox = new Rectangle(player.X, player.Y, 10, 10);
     bloq = new bloque(50,50,50,50);



}

@Override
public void update(GameContainer gc, int i) throws SlickException {
   intersecta();
    Input entrad = gc.getInput();
   if(entrad.isKeyDown(Input.KEY_RIGHT) && player.X<600){
       player.X+=3;
       player.sprite.update(1);
       hitbox.setX(player.X);
   }
   if(entrad.isKeyDown(Input.KEY_LEFT) && player.X>0){
       player.X-=3;
       player.sprite.update(1);
       hitbox.setX(player.X);
   }
   if(entrad.isKeyDown(Input.KEY_UP) && player.Y>0){
       player.Y-=3;
       player.sprite.update(1);
       hitbox.setY(player.Y);
   }
   if(entrad.isKeyDown(Input.KEY_DOWN) && player.Y<370){
       player.Y+=3;
       player.sprite.update(1);
       hitbox.setY(player.Y);
   }
}

@Override
public void render(GameContainer gc, Graphics grphcs) throws SlickException {
    grphcs.draw(bloq.bloque);
    grphcs.draw(hitbox);

    }

public void intersecta(){
    try{
if(hitbox.contains(null)){//i tried checking if it didnt contain any object,           

}else{
     System.exit(0);

}

    }catch(Exception ex){

    }



}
package-juegoconslick;
导入java.util.ArrayList;
导入org.newdawn.slick.*;
导入org.newdawn.slick.geom.Rectangle;
导入org.newdawn.slick.geom.Shape;
公共类JuegoConSlick扩展了BasicGame{
Jugador玩家;
输入entrada;
形状盒;
bloque bloq;
ArrayList bloques=新的ArrayList();
公共JuegoConSlick(){
超级(“Mi prueba”);
}
公共静态void main(字符串[]args){
AppGameContainer-juegito;
试一试{
juegito=new-AppGameContainer(new-JuegoConSlick());
setDisplayMode(630400,false);
juegito.setMaximumLogicUpdateInterval(60);
juegito.setMaximumLogicUpdateInterval(50);
juegito.setAlwaysRender(真);
juegito.setVSync(true);
juegito.start();
}捕获(例外情况除外){
系统出口(0);
}
}
@凌驾
公共void init(GameContainer gc)引发异常{
player=新的Jugador();
hitbox=新矩形(player.X,player.Y,10,10);
bloq=新bloque(50,50,50,50);
}
@凌驾
公共无效更新(GameContainer gc,int i)引发异常{
intersecta();
Input entrad=gc.getInput();
if(entrad.isKeyDown(Input.KEY_RIGHT)和&player.X0){
player.X-=3;
player.sprite.update(1);
hitbox.setX(player.X);
}
if(entrad.isKeyDown(Input.KEY_UP)和&player.Y>0){
player.Y-=3;
player.sprite.update(1);
hitbox.setY(player.Y);
}

if(entrad.isKeyDown(Input.KEY_DOWN)&&player.Y我建议创建一个新类。 此类需要继承一个光滑的2D形状,例如:

public class ShapeWithReference extends Rectangle{}
此类可以具有列表或单个对象引用:

public class ShapeWithReference Rectangle{
Object reference = new String("hello"); //This is dirty and can be replaced by any object.
}
由于您的新类是一个光滑的2D形状,您现在可以确定它是否包含在另一个形状中:

Rectangle rec = new Rectangle();
if(rec.contains(ShapeWithReference)){
   if(ShapeWithReference.reference instanceof String){
       System.out.println((String)ShapeWithReference.reference);
   }
}
Contains检查形状是否真的包含另一个形状。因此,它们不只是相交。因此,这是您检查的第一部分,第二部分是形状的引用属性是否用于例如字符串。因此,如果我们的第一个矩形包含我们的新类,并且该类的引用是字符串类型,则假定该字符串写入控制台

希望这对你有所帮助或给你一个提示


编辑:

}

这是您应该能够直接复制和粘贴的代码。 它确实对我有用,我不确定是否正确解决了您的问题,但是在instanceof操作符之后,您可以添加类名并检查它,我添加了一些带有整数和形状的示例

这是二等舱:

public class ShapeWithReference extends Rectangle {

private static final long serialVersionUID = 1L;

public ShapeWithReference(float x, float y, float width, float height) {
    super(x, y, width, height);
}

Object reference = new String("hello");
}


这对您有用吗?

我建议创建一个新类。 此类需要继承一个光滑的2D形状,例如:

public class ShapeWithReference extends Rectangle{}
此类可以具有列表或单个对象引用:

public class ShapeWithReference Rectangle{
Object reference = new String("hello"); //This is dirty and can be replaced by any object.
}
由于您的新类是一个光滑的2D形状,您现在可以确定它是否包含在另一个形状中:

Rectangle rec = new Rectangle();
if(rec.contains(ShapeWithReference)){
   if(ShapeWithReference.reference instanceof String){
       System.out.println((String)ShapeWithReference.reference);
   }
}
Contains检查形状是否真的包含另一个形状。因此,它们不只是相交。因此,这是您检查的第一部分,第二部分是形状的引用属性是否用于例如字符串。因此,如果我们的第一个矩形包含我们的新类,并且该类的引用是字符串类型,则假定该字符串写入控制台

希望这对你有所帮助或给你一个提示


编辑:

}

这是您应该能够直接复制和粘贴的代码。 它确实对我有用,我不确定是否正确解决了您的问题,但是在instanceof操作符之后,您可以添加类名并检查它,我添加了一些带有整数和形状的示例

这是二等舱:

public class ShapeWithReference extends Rectangle {

private static final long serialVersionUID = 1L;

public ShapeWithReference(float x, float y, float width, float height) {
    super(x, y, width, height);
}

Object reference = new String("hello");
}


这对你有用吗?

好的,我想我已经找到了解决方案,但我不确定这是否是最有效和节省内存的方法……我会编辑这个问题好的,我想我已经找到了解决方案,但我不确定这是否是最有效和节省内存的方法……我会编辑这个问题它似乎对我不起作用,因为它说没有变量带有类名称的ble(ide查找对象时将其视为变量而不是类)我尝试在结尾添加一个.class,如:ShapeWithReference.class,但它不起作用,因为contains方法需要一个形状而不是类。我只是复制和粘贴了代码,但它仍然不起作用,但无论如何,感谢您抽出时间,并为延迟回复而道歉,到目前为止它似乎起作用了。谢谢!它似乎对我不起作用,因为它说没有具有类名称的变量(ide查找对象时,就好像它是一个变量而不是一个类)我尝试在结尾添加一个.class,如:ShapeWithReference.class,但它不起作用,因为contains方法需要一个形状而不是类。我只是复制和粘贴了代码,但它仍然不起作用,但无论如何,感谢您抽出时间,并为延迟回复而道歉,到目前为止它似乎起作用了。谢谢!