Mam tę grę typu „Breakeout”.
Na środku mam armatę, bloki wokół armaty i podkładki wokół bloków. Tak wygląda gra:
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;
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.
źródło
Odpowiedzi:
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:
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.
źródło
-block inclination angle
żeby mieć odpowiednią reakcję na kolizję .. Głupiutko.Direction
(jako wektor) i aktualizowania położenia piłki tak:ball.Position += ball.Direction * ball.Speed;
.