我正在尝试开发碰撞检测。由于某种原因,冲突正在为LinkedList中的最后一个实体工作。我已尽力使用控制台调试它以查看它停止的位置,但我没有运气。所有其他实体都不工作,只有最后一个实体。这是代码:
public class Player implements Entity {
Image player;
public float x = 100f;
public float y = 100f;
public boolean canGoLeft = true;
public boolean canGoRight = true;
public boolean canGoUp = true;
public boolean canGoDown = true;
public float speed = 0.15f;
public Rectangle leftRect;
public Rectangle rightRect;
public Rectangle topRect;
public Rectangle bottomRect;
int i = 0;
Entities entities = new Entities();
public Player() {
}
public void update(GameContainer game, int delta) {
if(Keyboard.isKeyDown(Keyboard.KEY_D)) {
if(canGoRight) {
x += speed * delta;
}
}
if(Keyboard.isKeyDown(Keyboard.KEY_A)) {
if(canGoLeft) {
x -= speed * delta;
}
}
if(Keyboard.isKeyDown(Keyboard.KEY_W)) {
if(canGoUp) {
y -= speed * delta;
}
}
if(Keyboard.isKeyDown(Keyboard.KEY_S)) {
if(canGoDown) {
y += speed * delta;
}
}
for(Entity entity : Game.entities.entities) {
checkCollisions(entity);
}
}
public void render(GameContainer game, Graphics g) {
leftRect = new Rectangle(x, y + 5, 2, 80);
rightRect = new Rectangle(x + 45, y + 5, 2, 80);
topRect = new Rectangle(x + 6, y, 36, 2);
bottomRect = new Rectangle(x + 6, y + 90, 36, 2);
//rect = new Rectangle(200, 100, 60, 88);
try {
player = new Image("res/Player.png");
player.setFilter(Image.FILTER_NEAREST);
} catch (SlickException e) {
e.printStackTrace();
}
player.draw(x, y, 60, 88);
//g.draw(leftRect);
//g.draw(rightRect);
//g.draw(topRect);
//g.draw(bottomRect);
}
public void checkCollisions(Entity entity) {
// Collision Detection
if(leftRect.intersects(entity.getRect())) {
canGoLeft = false;
}
if(rightRect.intersects(entity.getRect())) {
canGoRight = false;
}
if(topRect.intersects(entity.getRect())) {
canGoUp = false;
}
if(bottomRect.intersects(entity.getRect())) {
canGoDown = false;
}
if(!leftRect.intersects(entity.getRect())) {
canGoLeft = true;
}
if(!rightRect.intersects(entity.getRect())) {
canGoRight = true;
}
if(!topRect.intersects(entity.getRect())) {
canGoUp = true;
}
if(!bottomRect.intersects(entity.getRect())) {
canGoDown = true;
}
}
public Rectangle getRect() {
return null;
}
}
这有什么问题?
答案 0 :(得分:1)
您正在设置是否可以左右上下的全局值。因此,每个实体都覆盖相同的全局变量,导致其状态处于检查的最后一个实体的状态。我认为最好的方法是确保所有bool都开始为真,然后只在碰撞发生时将它们设置为false。
public void update(GameContainer game, int delta) {
//...
canGoLeft = true;
canGoRight = true;
canGoDown = true;
canGoUp = true;
for(Entity entity : Game.entities.entities) {
checkCollisions(entity);
}
public void checkCollisions(Entity entity) {
// Collision Detection
if(leftRect.intersects(entity.getRect())) {
canGoLeft = false;
}
if(rightRect.intersects(entity.getRect())) {
canGoRight = false;
}
if(topRect.intersects(entity.getRect())) {
canGoUp = false;
}
if(bottomRect.intersects(entity.getRect())) {
canGoDown = false;
}
}
(请确保在非交叉的情况下摆脱将canGoDirection
设置为true的条件,因为这会导致它不起作用。)
答案 1 :(得分:0)
每次都要覆盖布尔值。相反,请事先将它们全部设置为true
,然后在每次检测到碰撞时标记相应的false
。