Oto odpowiednia logika, której użyłem w pongu na mojej stronie głównej : (proszę, zagraj w nią przed przeczytaniem, abyś wiedział, jaki efekt osiągam dzięki poniższemu kodowi)
Zasadniczo, gdy piłka zderza się z łopatką, jej kierunek jest całkowicie ignorowany; otrzymuje nowy kierunek w zależności od tego, jak daleko od środka wiosła się zderzyło. Jeśli piłka uderzy w wiosło w środku, zostanie odesłana dokładnie poziomo; jeśli trafi w krawędź, odlatuje pod ekstremalnym kątem (75 stopni). I zawsze jedzie ze stałą prędkością.
var relativeIntersectY = (paddle1Y+(PADDLEHEIGHT/2)) - intersectY;
Weź środkową wartość Y wiosła i odejmij przecięcie Y piłki. Jeśli wiosło ma 10 pikseli wysokości, liczba ta będzie wynosić od -5 do 5. Nazywam to „przecięciem względnym”, ponieważ znajduje się teraz w „przestrzeni wiosła”, przecięciu piłki względem środka wiosła.
var normalizedRelativeIntersectionY = (relativeIntersectY/(PADDLEHEIGHT/2));
var bounceAngle = normalizedRelativeIntersectionY * MAXBOUNCEANGLE;
Weź względne skrzyżowanie i podziel je przez połowę wysokości łopatki. Teraz nasza liczba od -5 do 5 jest liczbą dziesiętną od -1 do 1; jest znormalizowany . Następnie pomnóż go przez maksymalny kąt, o który chcesz odbić piłkę. Ustawiłem na 5 * Pi / 12 radianów (75 stopni).
ballVx = BALLSPEED*Math.cos(bounceAngle);
ballVy = BALLSPEED*-Math.sin(bounceAngle);
Na koniec obliczyć nowe prędkości kuli za pomocą prostej trygonometrii.
Może to nie do końca efekt, którego szukasz, lub możesz również określić prędkość, mnożąc znormalizowane przecięcie względne przez prędkość maksymalną; sprawiłoby to, że piłka leciałaby szybciej, jeśli uderzyłaby w pobliżu brzegu wiosła, lub wolniej, gdyby uderzyła w pobliżu środka.
Chciałbym prawdopodobnie trochę kodu na temat tego, jak wyglądałby wektor lub w jaki sposób mogę zapisać zmienną wektora, w którym znajdują się kule (prędkość i kierunek).
Wektor zawiera zarówno prędkość, jak i kierunek. Przechowuję mój wektor jako „vx” i „vy”; to znaczy prędkość w kierunku x i prędkość w kierunku y. Jeśli nie odbyłeś wstępnego kursu fizyki, może ci się to wydawać obce.
Powodem, dla którego to robię, jest to, że zmniejsza to konieczne obliczenia dla poszczególnych klatek; każda klatka, którą właśnie robisz x += vx * time;
i y += vy * time;
gdzie czas jest czasem od ostatniej klatki, w milisekundach (dlatego prędkości są w pikselach na milisekundę).
Jeśli chodzi o wdrożenie zdolności do zakrzywiania piłki:
Przede wszystkim musisz znać prędkość wiosła w momencie uderzenia piłki; co oznacza, że musisz śledzić historię wiosła, abyś mógł poznać jedną lub więcej wcześniejszych pozycji wiosła, abyś mógł porównać je z bieżącą pozycją, aby sprawdzić, czy się poruszył. (zmiana pozycji / zmiana czasu = prędkość; więc potrzebujesz 2 lub więcej pozycji i czasów tych pozycji)
Teraz musisz także śledzić prędkość kątową piłki, która praktycznie reprezentuje krzywą, po której się porusza, ale jest równoważna obrotowi piłki w świecie rzeczywistym. Podobnie do interpolacji kąta odbicia od względnej pozycji piłki podczas zderzenia z łopatką, należy również interpolować tę prędkość kątową (lub obrót) od prędkości łopatki podczas zderzenia. Zamiast po prostu ustawić obrót, jak w przypadku kąta odbicia, możesz chcieć dodać lub odjąć istniejący obrót piłki, ponieważ zwykle działa to dobrze w grach (gracz może zauważyć, że piłka obraca się i powoduje jej obrót jeszcze bardziej dziko lub przeciwdziałaj spinowi, próbując sprawić, by podróż przebiegła prosto).
Zauważ jednak, że chociaż jest to najbardziej zdrowy rozsądek i prawdopodobnie najłatwiejszy sposób na jego wdrożenie, rzeczywista fizyka odbicia nie zależy wyłącznie od prędkości uderzanego obiektu; obiekt bez prędkości kątowej (bez spinu), który uderzy w powierzchnię pod kątem, będzie miał nadany spin. Może to prowadzić do lepszej mechaniki gry, więc możesz przyjrzeć się temu, ale nie jestem pewien fizyki stojącej za tym, więc nie zamierzam tego wyjaśniać.