2015-05-03 1 views
0

Я пытался сделать пересечение игроков небольшим проектом, который я делаю, и я не могу заставить его работать. Я получил Пересечение, чтобы работать с игроком и стеной, но это очень багги, багги, я имею в виду, он рисует игрока в стене, а затем мгновенно возвращает его обратно. (Проверьте Gyazo за gif этого). Я почти уверен, что проблема в том, что он проверяет только, находится ли игрок в стене, а не будет в стене, но я не могу понять, как это проверить. Это то, что я до сих пор:проверка, если 2 прямоугольника WILL перекрываются

public void intersectsBox2(Rectangle r, Rectangle r2) { 
    P1 = new Point((int) r.getMinX(), (int) r.getMinY()); 
    P2 = new Point((int) r.getMaxX(), (int) r.getMaxY()); 
    P3 = new Point((int) r2.getMinX(), (int) r2.getMinY()); 
    P4 = new Point((int) r2.getMaxX(), (int) r2.getMaxY()); 
    if ((P2.y < P3.y || P1.y > P4.y || P2.x < P3.x || P1.x > P4.x) 
      && !intersectsBox(playerRectangle(), noWalls[0])) { 
     isInsideWalls = true; 
    } 
} 

// Gets the players rectangle 
public Rectangle playerRectangle() { 
    return new Rectangle(9 + dx, 23 + dy, 54, 90); 
} 

Это сделать игрока Move:

public void playerMovement() { 
    if (isInsideWalls) { 
     System.out.println("YOU ARE IN THE BOX!"); 
     if (animation == down) { 
      dy -= moveSpeed; 
      isInsideWalls = false; 
     } else if (animation == up) { 
      dy += moveSpeed; 
      isInsideWalls = false; 
     } else if (animation == left) { 
      dx += moveSpeed; 
      isInsideWalls = false; 
     } else if (animation == right) { 
      dx -= moveSpeed; 
      isInsideWalls = false; 
     } 
    } else { 
     // Moves the player 
     if (moving == downMove) { 
      dy += moveSpeed; 
      moving = 0; 
     } else if (moving == upMove) { 
      dy -= moveSpeed; 
      moving = 0; 
     } else if (moving == leftMove) { 
      dx -= moveSpeed; 
      moving = 0; 
     } else if (moving == rightMove) { 
      dx += moveSpeed; 
      moving = 0; 
     } 
    } 

Это проверить для пересечения:

//Checks for intersection 
for (int i = 0; i < 9; i++) { 
    for (int j = 0; j < 9; j++) { 
     intersectsBox2(walls[i][j], playerRectangle()); 
    } 
} 

Не совсем уверен, если это необходимо, но нужно полное Game.java, если вам нужно это увидеть: http://pastebin.com/GrDy689d

Также здесь Gif проблемы: http://i.gyazo.com/1f31f739897af78f81e61cf22ac772db.mp4

P.S: Это специально я могу только перейти в 1 коробку на данный момент для целей тестирования.

+2

Просто общие комментарии - почему бы не вызвать 'intersectsBox2' прямо перед проверкой' if (isInsideWalls) ', вместо того, чтобы ждать следующего вызова' playerMovement'? И 'dy' и' dx' обычно относятся к * изменению * по y и x, а не к * значению * y и x. – gengkev

ответ

2

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

+0

1. Сначала запустите код с помощью // Перемещает проигрыватель, затем запустите код с помощью // Проверки для пересечения', затем запустите код с 'if (isInsideWalls)', чтобы потенциально отменить ход. – gengkev

+0

Это работает сейчас, но мне, возможно, потребуется изменить его позже для большей функциональности, спасибо большое! – joejoethemonkey