как заставить игрока ударить препятствие и уйти (Java) - PullRequest
0 голосов
/ 07 мая 2018

Вот мой код, когда мой игрок пересекает GRect, но он работает только для 2 сторон прямоугольника. Другие 2 дают нежелательный эффект.

private void gameLoop() {
    boolean done = false;
    while (!done) {

        if (pan.getBounds().intersects(b.getBounds())) {

            pan.move(-10, -10);
        }

Как я могу заставить моего игрока "видеть" прямоугольник как препятствие и сталкиваться с ним? Я использую ключевые слушатели, чтобы переместить игрока.

EDIT

Я добавил следующие операторы if для проверки взаимодействия игрока с каждой стороной препятствия, но опять-таки, похоже, он работает для левой и нижней сторон. Мне нужно все четыре стороны .

Я использую pan.move, потому что это то, что я использую для перемещения игрока в первую очередь, когда нажата клавиша. Так, например, когда я нажимаю влево, я использую pan.move(-10,0) и поэтому, чтобы игрок не двигался влево, я использую pan.move(10,0)

    if (pan.getBounds().intersects(b1.getBounds())) {


        if ((pan.getX() +PAN_WIDTH ) > b1.getX()) {  // left
            pan.move(-10, 0);

        }
        if ((pan.getY() PAN_WIDTH ) > b1.getY()) {  //top
            pan.move(0, -10);

        }
        if ((pan.getY()) < b1.getY() + OBSTACLE_WIDTH) { // bottom
            pan.move(0, 10);

        }
        if ((pan.getX() PAN_WIDTH) < b1.getX() + OBSTACLE_HEIGHT) {  // right
            pan.move(10, 0);

        }
        }

1 Ответ

0 голосов
/ 09 мая 2018

Есть много проблем с вашим кодом, вот некоторые исправления. Вы путаетесь с width и height Но, не зная всего своего кода, я не гарантирую, что ваш способ сделать это хорошо.

if (pan.getBounds().intersects(b1.getBounds())) {

    if ((pan.getX() + pan.getWidth()) > b1.getX()) {  // left
        pan.move(-10, 0);
    } else if (pan.getX() < (b1.getX() + b1.getWidth())) { // right
        pan.move(10,0);
    }

    if ((pan.getY() + pan.getHeight()) > b1.getY()) {  //top
        pan.move(0, -10);
    } else if (pan.getY() < (b1.getY() + b1.getHeight())) { // bottom
        pan.move(0, 10);
    }
}

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

Кроме того, перемещение вашего игрока не является хорошим способом сделать это. У вашего игрока должно быть два поля, представляющих ходы, которые вы будете выполнять. Тогда в случае столкновения вам просто нужно установить эти поля на 0. Вы не хотите, чтобы ваш игрок двигался при столкновении, вы просто хотите, чтобы он перестал двигаться влево / вправо / вверх / вниз.

Например, если вы измените скорость своего игрока, вам придется изменить все эти pan() вручную. Это создаст вам проблемы, если вы этого не поймете.

...