Kąt odbicia

11

Mam tę grę typu „Breakeout”.

Na środku mam armatę, bloki wokół armaty i podkładki wokół bloków. Tak wygląda gra:

Okrągła gra Breakout

Udało mi się uzyskać zderzenie na piksel, a moja kula „ odbija ” się w kontakcie z blokami o następującej matematyce:

Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;

Obraz przedstawiający obliczenie kąta odbicia

Gdzie niebieska linia jest kierunkiem kuli, a czarna linia (linia bazowa) jest powierzchnią bloku.

Kierunek to kąt wyrażony w radianach (który oczywiście można przeliczyć na stopnie).
Piłka jest poruszana przez:

// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;

Na razie w porządku.

Mój problem przychodzi teraz z padem (3 ciemne i duże bloki wokół małych kolorowych klocków).

Gdy się odwracają, zmienia się kąt powierzchni.
Co więcej, piłka powinna również uderzać w boki, więc jak mogę zmierzyć kierunek uderzenia i nowy kierunek ruchu piłki?

ps : W razie potrzeby mogę podać kod i plik SWF do gry.


Edytować

Ok problem z kątami został rozwiązany za pomocą wektorów , ale nadal mam problem z kolizją boków i pleców.

Otworzę kolejne pytanie i link tutaj.

NemoStein
źródło
3
Jeśli ponownie połączysz swoje konta, powinieneś otrzymać premię reputacyjną +100. Powinna to być opcja na karcie Konta Twojego profilu. W międzyczasie opublikuję te zdjęcia.
Grace Note
Rozumiem, że twój kierunek to kąt między 0 a 360 i aby przesunąć piłkę używasz trygonometrii?
Jonathan Connell,
@Grace, bardzo dziękuję za zdjęcia ... @ 3nixios, dodałem więcej informacji o kącie i ruchu.
NemoStein
Jeśli przechowujesz tylko jeden „kierunek” na blok, być może ponownie wyobrażasz sobie każdy czarny blok jako grupę czterech pojedynczych bloków, przy czym twarz „kierunku” jest zawsze skierowana na zewnątrz. Prawdopodobnie w czterech rogach byłyby skrzynie.
horatio

Odpowiedzi:

8

Nie jestem pewien, czy poprawnie zrozumiałem twój problem, ale założyłem, że to, co chcesz zrobić, to znaleźć wynikowy kierunek twojej piłki po zderzeniu.

Oto szybki rysunek na mojej białej tablicy, który pokazuje możliwe rozwiązanie tego:

wprowadź opis zdjęcia tutaj

Zielone strzałki reprezentują prędkość piłki (jako wektor), niebieskie bloki reprezentują duże czarne bloki, a czerwona strzałka jest wypadkowym wektorem.

W pierwszym przypadku niebieski blok ma nachylenie 30 stopni. Jednym ze sposobów rozwiązania problemu kolizji jest przywrócenie wszystkiego z powrotem do osi poziomej. To, co musisz zrobić, to obrócić wszystko o 30 stopni (nachylenie bloku) (możesz do tego użyć macierzy).

Następnie sprawdzasz, skąd pochodzi kolizja . Jeśli zderzenie było poziome, odwróć składową x prędkości. Jeśli był pionowy (jak w tym przypadku), składnik y ( ball.Velocity.Y = -ball.Velocity.Y). Dzięki temu piłka będzie działać poprawnie, gdy uderzy w narożniki (odwróci oba elementy). Następnie wystarczy obrócić z powrotem do rzeczywistej sytuacji (której nie ma na rysunku).

W drugim przypadku jest to to samo, z tym wyjątkiem, że prędkość piłki nie jest prostopadła do bloku. Obracasz o 70 stopni, sprawdzasz skąd kolizja i odwracasz odpowiednie komponenty. Następnie wracasz do swojej prawdziwej sytuacji.

Uwaga: zauważyłem, że używasz kąta do reprezentowania kierunku zamiast wektora. Możesz po prostu stworzyć wektor dla tych obliczeń lub zachować ten sam ogólny pomysł, ale pracując z kątami.

Z pewnością nie jest to najlepszy sposób i jestem pewien, że możesz to w jakiś sposób obliczyć, ale myślę, że jest to możliwe rozwiązanie twojego problemu.

Jesse Emond
źródło
Dzięki ... Podobało mi się twoje forum. Spróbuję za chwilę ... Ahn, i czy uważasz, że wektory mogłyby być lepsze do utrzymania / pracy z?
NemoStein
Haha wybacz moje słabe umiejętności rysowania.
Jesse Emond
Ups, właściwie zapomniałem ważnego kroku podczas rysowania .. Musisz się odwrócić, -block inclination angleżeby mieć odpowiednią reakcję na kolizję .. Głupiutko.
Jesse Emond
Chyba chodzi o osobiste preferencje, ale wolę wektory dużo. Po prostu nie musisz przez większość czasu myśleć o matematyce, która zwykle czyści kod. Więc można zachować Direction(jako wektor) i aktualizowania położenia piłki tak: ball.Position += ball.Direction * ball.Speed;.
Jesse Emond
@Jesse, do tej pory nie mogłem tego zrobić. Doskonale zrozumiałem twoją metodę, ale nie mogłem jej wdrożyć. Aby to zrobić, będę musiał przepisać całą część, która używa kątów radianów do używania wektorów (w rzeczywistości nie jest to dużo). Na razie wypróbuję inne alternatywy, a jeśli masz inną, chętnie spróbuję. Dzięki.
NemoStein