Нужен лучший способ сделать угол мяча в игре в понг

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

Моя текущая реализация имеет deltaX и deltaY для мяча, который перемещается вместе с игровым циклом для перемещения мяча. Я сделал это следующим образом: если вы ударяете по мячу во время движения ракетки, deltaY увеличивается или уменьшается в зависимости от направления ракетки, но это совсем не кажется естественным для игры.

Кто-нибудь знает лучший способ сделать это?


person Mr. Adobo    schedule 30.07.2012    source источник
comment
пожалуйста, предоставьте SSCCE (краткий, автономный, правильный пример)   -  person Harmeet Singh    schedule 30.07.2012
comment
Нарисуйте на бумаге: что должно произойти, если мяч ударится под углом 90 градусов? Что в 45? Что в -30? Затем напишите функцию, которая преобразует этот угол.   -  person Konerak    schedule 30.07.2012
comment
Как определяют угол? От весла или от нормали до весла?   -  person    schedule 30.07.2012
comment
Как я уже сказал, у меня есть дельта X и дельта Y для мяча, поэтому, если deltaX равно 3, а deltaY равно 1, он перемещается на 3 пикселя по x и на 1 пиксель по Y. На самом деле я не вычисляю сам угол, потому что я хочу, чтобы это было динамично и много углов, а не только 30/60 или 45s. Моя проблема заключается в том, чтобы правильно изменить дельту, чтобы она казалась естественной, а не такой дрянной, как она есть.   -  person Mr. Adobo    schedule 30.07.2012


Ответы (1)


Первое, что я бы сделал, это изменил deltaX и deltaY на ballAngle и deltaSpeed. Таким образом, вы перейдете от прямоугольной системы координат к полярной. Благодаря характеру движения мяча (идет по прямой линии и меняет угол линии при каждом ударе) это облегчит вашу работу. С этого момента вам нужно будет только изменить ballAngle, чтобы обновить направление мяча.

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

newPosition = oldPosition + movementVector

с участием:

movementVector.x = deltaSpeed*cos(ballAngle)
movementVector.y = deltaSpeed*sin(ballAngle)

Конечно, эти уравнения могут нуждаться в некоторой модификации, основанной на том, что вы измеряете угол мяча.

Теперь, чтобы изменить угол мяча при каждом столкновении с ракеткой, вам нужно только увеличить или уменьшить угол мяча в зависимости от того, какую часть ракетки он касается, а математика в функции рисования должна позаботиться об обновлении x и y. позиции реально.

Надеюсь, это поможет.

person Oday Mansour    schedule 30.07.2012
comment
Это звучит как отличная идея. Спасибо! - person Mr. Adobo; 30.07.2012
comment
Вы можете рассчитать новый угол после столкновения, просто вычитая 360 градусов из фактического угла (предположим, что 0º — это прямое направление). Кроме того, вы можете изменить это, если ваше весло движется. То есть, если в момент столкновения ракетка движется вправо, мяч в какой-то степени отклонится влево. - person polypiel; 30.07.2012
comment
Вычитание 360 заставило бы его пойти другим путем, но очень нереалистично. В идеале вам нужно выяснить, под каким углом мяч ударяется о ракетку, и отразить его относительно нормали ракетки. Своего рода отражение, зеркальное по отношению к нормали. Теперь то, что он хочет сделать, это еще больше исказить этот угол в зависимости от того, куда ударяется ракетка, что является стандартным, когда речь идет об обычных играх с разрушением кирпичей или понгом. - person Oday Mansour; 30.07.2012
comment
Сегодня я изначально планировал изменить угол в зависимости от того, движется ли ракетка, но мне нравится ваша идея изменить угол в зависимости от того, в какую часть ракетки попадает мяч. Так работает стандартный понг? - person Mr. Adobo; 02.08.2012
comment
Хотя зависимость угла от скорости весла интересна, большинство подобных игр с веслом, в которые я играл, делают это в зависимости от того, в какую часть весла ударяют. - person Oday Mansour; 03.08.2012
comment
Если кто-то хочет увидеть результат игры, zaiber.thepinkbananas.com/ZaiberPong.jar - person Mr. Adobo; 05.08.2012