2013-12-20 5 views
-1

Я пытаюсь разработать обнаружение столкновений. По какой-то причине столкновение работает для последнего объекта в LinkedList. Я попытался изо всех сил отладить его, используя консоль, чтобы увидеть, где она останавливается, но мне не повезло. Все остальные объекты не работают, только последний. Вот код:Почему 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; 
} 

}

Что не так с этим?

ответ

1

Вы устанавливаете глобальные значения для того, можете ли вы подниматься влево и вправо. Таким образом, каждый объект переписывает одни и те же глобальные переменные, заставляя их состояние находиться в состоянии последней сущности. Я думаю, что лучший подход, поскольку этот момент состоит в том, чтобы гарантировать, что все bools начнут истинно, тогда установите их только в 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 к истине в случае отсутствия пересечения, поскольку это приведет к тому, что не работает).

+0

Это не работает. – romofan23

+0

Извините, я полностью неверно истолковал то, что вы пытались сделать, позвольте мне уточнить свой ответ. –

+0

@ romofan23 ОК, извините, что другой ответ был действительно правильным в вашей проблеме (я не просмотрел весь код, чтобы полностью понять вашу цель). Я обновил образец того, что * должен * исправить вашу проблему. –

0

Вы каждый раз переписываете логические значения. Вместо этого заранее установите их на true, а затем отметьте соответствующий номер false каждый раз, когда вы обнаруживаете столкновение.

+0

Я не понимаю. Не могли бы вы объяснить больше? – romofan23

Смежные вопросы