2017-01-06 9 views
0

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

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

Код настоящее время я использую для столкновений выглядит следующим образом:

if((ball.y+5) == (bat.y)) 
    { 
     if(ball.x >= bat.x && ball.x <= (bat.x+40)) 
     { 
      ball.dy = -ball.dy; 
      game.goingUp = true; 
     } 
    } 

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

Что я хочу сделать, так это заставить это столкновение работать со скоростью до 10 пикселей на фрейм, но я действительно не уверен, как это сделать, любая помощь будет действительно оценена.

+0

Вы могли оценить игру в 'x' раза скорость, где' x' является скорость шара в пикселях на кадр и только обновлять выходное изображение на каждом кадре 'x'. –

ответ

1

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

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

+0

Итак, я создал след за движущимся шаром, который простирается примерно на 5 пикселей за текущее положение мяча. Как мне теперь использовать это для проверки коллизий с точки зрения моего текущего кода столкновения, который выше? –

+0

@Ajek Вы можете протестировать каждый пиксель и на обнаружение сделать реакцию на фактический пиксель. Как правило, последняя позиция не должна быть видимой, но скорее сохраняется в движущемся объекте, но ваше решение должно работать. – JavaProphet

0

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

Использование > = сообщит вам, если бы вы столкнулись (предполагая, что вы были выстроены в оси х в то время):

if((ball.y+5) >= (bat.y) 

Тогда есть только вопрос обработки, как далеко влево и правильно, что вы были бы во время столкновения. Если вы отслеживаете, насколько далеко вы продвинулись по оси x, вы можете попытаться оценить, где бы вы были, когда (ball.y + 5) == bat.y. Возможно, что-то вроде:

// Assuming this is how you keep track of your old position: 
int x_difference = ball.x - ball.last_x; 
int y_difference = ball.y - ball.last_y; 

float percent = (bat.y - (ball.last_y+5))/float(y_difference); // how far through your last move were you when you crossed the bat's y position 
int x_at_collision = ball.x + (percent * x_difference); 

И теперь вы можете изменить свою вторую строку:

if(x_at_collision >= bat.x && x_at_collision <= (bat.x+40))