Java - Физика на пробива, посока на топката при сблъсък с гребло?

Създавам игра Breakout, за да се запозная с Java. В момента всичко ми работи, но забелязах, че топката сякаш излита в същата посока.

Програмирах го така, че когато топката удари греблото, скоростта Y се обръща. Това работи, но топката изглежда следва същия маршрут...

Как ще направите сблъсъка да изглежда по-реалистичен?

Когато топката удари лявата страна на греблото, искам да я пренасоча обратно наляво, но не съм сигурен под кой ъгъл да я отразя. Може ли някой да предостави формула, която да ми помогне да определя ъгъла, под който трябва да насоча топката при контакт с лявата или дясната страна на греблото?


person user3422952    schedule 16.04.2014    source източник
comment
Бихте ли ни показали вашия код за сблъсък? Може да е по-лесно да видите какво питате с него.   -  person user3507600    schedule 16.04.2014
comment
възможен дубликат на Сблъсък от топка към топка – откриване и обработка   -  person Michael    schedule 16.04.2014
comment
Подозирам, че въпросът е как да се позволи на потребителя да променя малко посоката, вместо просто да обръща посоката Y, когато удари греблото. В противен случай топката просто попада в проста схема и е трудно или дори невъзможно да се ударят някои от тухлите. Срещнах същия проблем преди десетилетия на Apple ][, използвайки Integer BASIC.   -  person Fred Larson    schedule 16.04.2014
comment
@FredLarson - точно това имам предвид. Бихте ли предоставили вашето решение (въпреки че е било преди десетилетия)?   -  person user3422952    schedule 16.04.2014
comment
@user3422952: Не мисля, че някога съм го разрешил тогава. С 40x40 lo-res графики нямаше много добри опции за посока на топката. Топката беше буквално един голям дебел пиксел. Всичко различно от хоризонтално, вертикално или диагонално движение и топката ще изглежда така, сякаш наистина се изкачва по стълби. Съвременните разделителни способности на екрана предлагат по-добри възможности. Вижте моя отговор за предложение.   -  person Fred Larson    schedule 16.04.2014


Отговори (4)


Ако топката удари греблото отгоре, отхвърлете Y скоростта.

Ако топката удари греблото отстрани, отхвърлете X скоростта.

person thumbmunkeys    schedule 16.04.2014

Обръщането на вертикалната скорост е правилното нещо, което трябва да направите за перфектно еластичен сблъсък, което е, което искате в игра на пробив (топката запазва общата си скорост след сблъсъка).

Проблемът със следването на един и същ маршрут може да бъде избегнат или чрез рандомизиране на първоначалната позиция и скорост на топката, или чрез промяна на динамиката на сблъсъка, за да бъде нереалистична. Можете или да добавите малък случаен компонент към двете координати (като внимавате да запазите общата скорост еднаква), или да изпратите топката под различен ъгъл, в зависимост от това къде удря подложката (което правят много игри от този тип) .

За да направите това по-късно, трябва да изчислите абсолютната позиция, където топката удря подложката, да я нормализирате (като извадите позицията на подложката и разделите на дължината на подложката) и да я картографирате в ъглов диапазон (може би -80 до 80 градуса) . След това можете да изчислите желаните хоризонтални и вертикални скорости, като използвате тригонометрични функции.

person loopbackbee    schedule 16.04.2014

Една идея може да е да използвате движението на греблото, за да промените малко посоката. Да речем, ако греблото се движи надясно, когато удряте топката, променете скоростта на X на топката малко надясно в допълнение към обръщането на посоката Y. Това предоставя начин на потребителя действително да използва някакво умение, за да постави правилния „английски“ на топката.

person Fred Larson    schedule 16.04.2014

Има два отделни проблема, проблем с дизайна и проблем с физиката. В крайна сметка проблемът с физиката може да има по-лесното решение:

  1. Изчислете точката на сблъсък на греблото
  2. Изчислете моментната хоризонтална скорост pvx на греблото
  3. Изчислете нормалата на нормираната външна повърхност (nx,ny) в точката на удара. Това е дизайнерското решение, в средната част на греблото вероятно се иска (nx,ny)=(0,1), докато от лявата страна (nx,ny)=(-1,0) или като цяло в посока WNW , от дясната страна съответно (nx,ny)=(1,0) или в общата ENE позиция.
  4. Използвайте формулата на физиката за сблъсък с движещ се безкрайно масивен обект, за да изчислите новия вектор на скоростта (vx,vy):

    dot = nx*(vx-pvx)+ny*vy
    vx = vx - 2*dot*nx
    vy = vy - 2*dot*ny
    

    Може да се провери дали точковият продукт dot е положителен, за да се избегнат фалшиви изчисления на сблъсък, ако греблото и топката не се разделят достатъчно бързо след сблъсък.

person Lutz Lehmann    schedule 21.04.2014