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");
}
这对你有用吗?
我是 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");
}
这对你有用吗?