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

时间:2016-04-30 16:16:00

标签: java slick2d

我是Slick2d和这个页面的新手,我试过询问光滑的论坛,但是没有很多人,所以我无法得到答案

无论如何,我一直试图在Slick2d java游戏库中创建一个平台游戏引擎,我正在考虑使用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){

    }



}

}

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

basiaclly,我将在ArrayList中保存同一类的所有对象:

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

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

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

等等其他键.... 所以我不确定它是否是最佳解决方案,但就我所见,它似乎正在起作用。我希望这个结果对其他人有用。

1 个答案:

答案 0 :(得分:0)

我建议创建一个新类。 这个类需要继承Slick2d Shape,例如:

public class ShapeWithReference extends Rectangle{}

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

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

由于您的新课程是Slick2D形状,您现在可以确定它是否包含在另一个形状中:

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

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

希望这有助于或给你一个提示。

编辑:

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运算符之后你可以添加类名并检查它,我添加了一些带有整数和形状的例子。

这是第二堂课:

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

}

这对你有用吗?