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

Slick2d how to check if a shape contains any object? Java

我是 Slick2d 的新手,也是这个页面的新手,我尝试询问 slick 论坛,但是人不多,所以我无法得到答案

无论如何,我一直在尝试在 Slick2d java 游戏库中创建一个平台游戏引擎,并且我正在考虑使用 Shape class.[=15] 的包含和相交方法=]

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

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){

    }



}

}

编辑:我想我已经找到了解决方案,但我不确定它是否最有效。

基本上,我将把相同 class 的所有对象保存在 ArrayList 中:

ArrayList<bloque> bloques = new ArrayList<>();
 bloques.add(new bloque(50,50,100,100));
     bloques.add(new bloque(100,100,100,100));

然后,我要做的是每次调用 intersects 方法时检查整个数组列表:

  public boolean intersecta(){
    boolean devuelve=false;
   for(int i=0; i<bloques.size(); i++){          
       if(hitbox.intersects(bloques.get(i).bloque)){

           devuelve=true;
       }

   }

    return devuelve;

}

然后我将使用我从相交处获得的值来决定玩家是否可以移动

 public void update(GameContainer gc, int i) throws SlickException {

    Input entrad = gc.getInput();
   if(entrad.isKeyDown(Input.KEY_RIGHT) && player.X<600 && intersecta()==false){

       player.X+=3;
       player.sprite.update(1);
       hitbox.setX(player.X);
   }

等等其他键.... 所以我不确定它是否是最好的解决方案,但据我所知它似乎有效。我希望这个结果对其他人有用。

我建议创建一个新的 Class。 这个class需要继承一个Slick2d Shape,比如:

public class ShapeWithReference extends Rectangle{}

此 class 可以有一个列表或单个对象引用:

public class ShapeWithReference Rectangle{
Object reference = new String("hello"); //This is dirty and can be replaced by any object.
}

由于您的新 class 是一个 Slick2D 形状,您现在可以查明它是否包含在另一个形状中:

Rectangle rec = new Rectangle();
if(rec.contains(ShapeWithReference)){
   if(ShapeWithReference.reference instanceof String){
       System.out.println((String)ShapeWithReference.reference);
   }
}

包含检查形状是否真的包含另一个形状。所以它们不只是相交。所以这是您检查的第一部分,第二部分是形状的参考属性是否用于例如一个字符串。因此,如果我们的第一个矩形包含我们的新 class 并且此 class 的引用是字符串类型,则应该将此字符串写入控制台。

希望这对您有所帮助或给您提示。


编辑:

public class SlickGame extends BasicGame {

static AppGameContainer appgc;
Rectangle rec;
ShapeWithReference swr;

public SlickGame(String title) {
    super(title);
}

@Override
public void render(GameContainer container, Graphics g) throws SlickException {

}

@Override
public void init(GameContainer container) throws SlickException {
    rec = new Rectangle(0, 0, 64, 64);
    swr = new ShapeWithReference(0, 0, 1, 1);
}

@Override
public void update(GameContainer container, int delta) throws SlickException {
    if(rec.intersects(swr)){
       if(swr.reference instanceof String){
           System.out.println((String)swr.reference);
       }
       else if(swr.reference instanceof Integer){
           System.out.println((Integer)swr.reference);
       }
       else if(swr.reference instanceof Shape){
           Shape temp = (Shape)swr.reference;
           System.out.println(temp.getWidth());
       }
    }
}

public static void main(String[] args) {
    try {

        appgc = new AppGameContainer(new SlickGame("title"));
        appgc.setDisplayMode(800, 600, false);
        appgc.setTargetFrameRate(60);
        appgc.setFullscreen(false);
        appgc.start();

    } catch (SlickException ex) {
        ex.printStackTrace();
    }
}

}

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

这是第二个class:

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");

}

这对你有用吗?