2014-02-03 3 views
0

Я использую Slick и Tiled2D для создания игры в стиле нисходящего RPG. Я пытаюсь сделать столкновение, но игрок, похоже, может пройти через блоки, которые находятся на левой стороне здания, или в левой половине блока. Полный проект здесь: http://github.com/Cj1m/RPG Вот мой код для обнаружения движения игрока и столкновения:Java Game Collision Slick2D

@Override 
public void update(GameContainer gc, int delta) throws SlickException { 
    input = gc.getInput(); 
     if(input.isKeyDown(Input.KEY_W)){ 
      if(!isBlocked(x, y - delta * 0.1f)){ 
       y-=0.1 * delta; 
       timer(0,1,delta); 
      } 
     }else if(input.isKeyDown(Input.KEY_S) && y < screenBottomEdge){ 
      if (!isBlocked(x, y + playerHeight + delta * 0.1f)){ 
       y+=0.1 * delta; 
       timer(0,0,delta); 
      } 
     }else if(input.isKeyDown(Input.KEY_A) && x > screenLeftEdge){ 
      if (!isBlocked(x - delta * 0.1f, y)){ 
       x-=0.1 * delta; 
       timer(0,2,delta); 
      } 
     }else if(input.isKeyDown(Input.KEY_D) && x < screenRightEdge){ 
      if (!isBlocked(x + playerWidth + delta * 0.1f, y)){ 
       x+=0.1 * delta; 
       timer(0,3,delta); 
      } 
     } 
} 

и

private boolean isBlocked(float x, float y) { 
    int xBlock = (int)x/30; 
    int yBlock = (int)y/30; 
    return blocked[xBlock][yBlock]; 
} 
+0

The заявления, используя '(целое) _/30', вероятно, возвращают 0, так как вы делите на целое число. – sdasdadas

+0

В isBlocked, вы бросаете слишком рано. Попробуйте float xBlock = x/30; (то же самое для yBlock), затем в возврате попробуйте вернуть заблокированный [(int) xBlock] [(int) yBlock]; – Samich

ответ

0

Я предполагаю, что х и у в isBlocked является игрок пикселей с точностью до х и y-позиции, в то время как xBlock и yBlock являются точками точности.

Когда вы говорите, они идут через половину блока этого, мне кажется, как загоном проблемы при

int xBlock = (int)x/30; 
int yBlock = (int)y/30; 

Попробуйте что-то вдоль линий

(int) Math.round(x/30.0);