Как сделать приращение, когда два прямоугольника пересекаются, предсказуемо? - PullRequest
0 голосов
/ 09 сентября 2011

Короче говоря, я делаю гоночную игру на Java.Я самоучка использую некоторые книги и мои знания математической логики, и я программирую только три недели, поэтому я все еще изучаю все тонкости этого.Вот некоторый фон:

У меня есть изображение игрока, окруженное ограничивающим прямоугольником, и код проверит, чтобы увидеть, когда этот прямоугольник игрока пересекает прямоугольник, который является финишной линией.Каждый раз, когда он успешно пересекает линию, p1Laps увеличивается.Когда значение достигает определенной точки, игра заканчивается, и игрок объявляется победителем.

Вот проблема и вопросы: Моя проблема в том, что Java подсчитывает множественные пересечения каждый раз, когда прямоугольники пересекаются.Обычно 8 пересекается, поэтому p1Laps увеличивается в 8 раз.Это не было бы проблемой, если бы это происходило последовательно, но иногда круг увеличивается на разные значения.Я столкнулся с приращениями 4,7 и 8, поэтому сложно установить значение, чтобы гонка закончилась после определенного количества кругов.

Мой первый вопрос - почему?Почему java считает так много пересечений, когда эти два прямоугольника пересекаются?Я предполагаю, что это как-то связано с тем, что они обе являются 2D-фигурами, но я могу ошибаться.

Мой второй вопрос: как сделать, чтобы приращения происходили при постоянном значении?Предпочтительно «1», но это не имеет первостепенного значения, так как я могу просто отрегулировать конечное значение.

Вот код, который кажется уместным (большая часть кода удалена):

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import java.applet.AudioClip;

public class RacerDoom extends JFrame {
//lap counter
int p1Laps=0;

//bouding rectangles
Rectangle p1 = new Rectangle(WIDTH/9,HEIGHT/2,WIDTH/30,WIDTH/30);
Rectangle finishtop = new Rectangle(WIDTH/9,(HEIGHT/2)-HEIGHT/9,(int)((WIDTH/9)*1.5),HEIGHT/70);

//check for intersect
if(p1.intersects(finishtop)&&p1Direction==UP){
                        p1Laps++;}
//choose winner
if(p1Laps>=24) {
                        if(!winnerChosen) {
                            winnerChosen = true;
                            break;
}
}

КакЗаявлено, что приращения обычно увеличиваются на 8, но я заставляю их увеличиваться на 7 без (по-видимому) причины, и они увеличиваются только на 4, если включен «Boost» (удваивает скорость игрока).Спасибо за вашу помощь.

Ответы [ 3 ]

3 голосов
/ 09 сентября 2011

Вероятно, причина в том, что машине требуется несколько кадров, чтобы пересечь финишную черту. Вы можете решить эту проблему, отслеживая, пересекла ли каждая машина финишную черту. Используйте переменную boolean для каждого автомобиля, например,

boolean p1IsOnFinishLine = false;
boolean p2IsOnFinishLine = false;

Измените ваш if, чтобы проверить, пересекает ли машина финишную черту , а p1IsOnFinishLine равно false - это означает, что это первый кадр, в котором автомобиль попадает на линию. Если это так, увеличьте p1Laps и установите p1IsOnFinishLine на true. Теперь, в следующем кадре, машина все еще будет пересекать финишную черту, но, поскольку p1IsOnFinishLine равен true, вы знаете, что вы уже пересчитали этот круг, поэтому вам не нужно делать это снова. Когда автомобиль больше не пересекает финишную черту, вы можете установить p1IsOnFinishLine на false, чтобы вы были готовы к следующему пересечению.

1 голос
/ 09 сентября 2011

Другие ответы сообщают вам, в чем проблема.

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

1 голос
/ 09 сентября 2011

Игрок действительно пересекает финишную черту для нескольких кадров.Каждое обновление вы проверяете, пересекает ли оно .Это означает, что вы на протяжении 8 кадров пересекаете финишную черту.Я предлагаю изменить способ проверки на пересечение линии.

  • Используйте линию вместо прямоугольника в качестве финишной линии.Это не означает, что вы не можете держать его в виде прямоугольника на экране.
  • Используйте систему проверки, например:
    If (игрок стоит перед строкой И следующий кадр игрокабудет после финишной черты) , затем круг ++

    Что-то вроде (предположим, вы мчитесь вниз):

    if (p1.y > finishLineY && p1.y + speedY < finishLine) lap++;
    
...