Tak naprawdę potrzebujesz sprawdzać zakres kątów który jest między kursorem a postacią. 8 kierunków N/S/E/W/NE/NW/SE/SW wyznaczają Ci nie granice przedziałów a ich środki, każdy przedział ma rozpiętość 45 stopni więc od kąta danego kierunku idziesz w lewo i prawo o 22,5 stopnie i stąd masz prawdziwe granice. Skąd jednak wziąć kąt do porównań by wiedzieć którą klatkę załadować? Tu się zaczyna wolna część.
Było w szkołach coś takiego jak funkcje trygonometryczne i ich tutaj można użyć. Jak sobie policzysz delty między kursorem a postacią to dostaniesz dx i dy. Można zauważyć że na bazie pozycji postaci i kursora można narysować trójkąt prostokątny, gdzie fi to szukany kąt. Stosunek dx/dy to nic innego jak
tangens kąta fi w takim trójkącie, ale tangensy działały tak że wrzucamy kąt i dostajemy wartość stosunku, a my chcemy w drugą stronę bo znamy dx i dy, więc stosunek możemy policzyć a nie mamy kąta. No to jest funkcja odwrotna do tangensa o nazwie
arcus tangens, tylko że ona ma pewien problem, bo jak dy u nas będzie zero to dx/dy spowoduje dzielenie przez zero. Żeby tego typu jazd uniknąć stosuje się dwuargumentowy arcus tangens (atan2) gdzie podaje się w osobnych parametrach dy i dx.
Atan2 tam sobie wewnętrznie szaleje warunkami co do wartości dx,dy i z tego Ci wypluwa kąt od -180 do 180, a właściwie w radianach od -pi do pi. Jak do wyniku dodasz pi to masz bardziej ludzki zakres od 0 do 2pi, a jak chcesz operować nie na radianach tylko na stopniach to skalujesz to dzieląc wynik przez 2pi (masz teraz zakres od 0 do 1) i mnożąc przez 360 (masz zakres 0..360).
Ufff... jeśli coś niejasne to pisz, będę rozjaśniał w miarę potrzeb. ;)
Tu masz funkcję w C getAngleBetweenPoints() która robi to co mówiłem że robi. Korzysta z liczb stałoprzecinkowych żeby było ciut szybciej (o parę rzędów wielkości HE HE HE...) niż na floatach, przez co kod trochę traci na czytelności, ale tam masz komentarz który zawiera w sobie czyściej same obliczenia.
W OF mam 128 kierunków wieżyczki i tam po prostu pamiętam jej obecny kąt w zakresie 0..127 bez żadnych ułamków, po prostu na jednym bajcie. Numer klatki robię sobie własną funkcją angle2frame(), która dzieli tę liczbę np. na 4, przez co trzymam "tylko" 32 klatki wieżyczki, same obliczenia logiki gry robię już na bardziej dokładnej wartości z pierwotnego, większego zakresu.
Ostatnia aktualizacja: 21.10.2018 21:37:41 przez teh_KaiN