2016-12-05 7 views
0

Наконец-то я получил обнаружение столкновения, используя перекрестки() между двумя прямоугольниками и, похоже, работает. Однако игрок просто застревает в прямоугольнике и не может двигаться. Поэтому я пытаюсь проверить конфликт перед движением игрока.Обнаружение столкновений в Java до того, как вы переместились

Вот что я пробовал:

if(up == true){ 
     Rectangle futurerect = new Rectangle(px,py-=5,81,150); 
     if(!futurerect.intersects(wallexample)){ 
      py-=5; 
      repaint(); 
     } 
    } 
    if(down == true){ 
     Rectangle futurerect = new Rectangle(px,py+=5,81,150); 
     if(!futurerect.intersects(wallexample)){ 
      py+=5; 
      repaint(); 
     } 
    } 
    if(left == true){ 
     Rectangle futurerect = new Rectangle(px-=5,py,81,150); 
     if(!futurerect.intersects(wallexample)){ 
      px-=5; 
      repaint(); 
     } 
    } 
    if(right == true){ 
     Rectangle futurerect = new Rectangle(px+=5,py,81,150); 
     if(!futurerect.intersects(wallexample)){ 
      px+=5; 
      repaint(); 
     } 
    } 

Я просто создать новый прямоугольник, но в котором было бы, если игрок переехал, и проверить, если он сталкивается. Если это так, не двигайтесь.

Проблема в том, что когда игрок переходит в прямоугольник, он просто замедляется. Он по-прежнему движется через стену, но по какой-то причине просто движется медленнее.

В чем причина этой проблемы?

ответ

1

Похоже, что вы не проверяете правильную область, потому что ваш экземпляр нового Rectangle увеличивает/уменьшает py или px и присваивает ему это значение в конструкторе Rectangle.

Итак, если у вас есть игрок в 0,0 в картезианском, и вы хотите знать, будут ли они двигаться вверх, они попадут в стену.

if (up == true) { 

    Rectangle futurerect = new Rectangle(px,py-=5,81,150); 

    if(!futurerect.intersects(wallexample)){ 
     py-=5; 
     repaint(); 
    } 
} 

py теперь установлен на -5, как только вы создаете экземпляр прямоугольника.

Rectangle futurerect = new Rectangle(px,py-=5,81,150); 

по причине py- = 5 во втором параметре.

Когда вы выполняете проверку пересечения, он смотрит на 0, -5. Как только это говорит «Да, нет стены здесь», вы уменьшаете ручку еще 5. Теперь у нас есть игрок-координатор px, py 0, -10, и вы не проверяли стену в этом месте.

Попробуйте решить здесь логику, чтобы она не присвоить новое значение рх/Py:

Rectangle futureRect = new Rectangle(px, py - 5, 81, 150); 
+0

Ах, спасибо, я вижу свою ошибку прямо сейчас. – joey942