[#1] okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.
Czesc,
jak szybko policzyc oktane w ktorej jest kursor myszki wzgledem jakiegos punktu na ekranie?
Oktany w przedzialach:
1=0<>44
2=45<>89
3=90<>135
...
8=315<>359

Czy najszybszym rozwiazaniem bedzie uzycie czegos na wzor Select i porownac znaki z odejmowania:
xPunktu - xMyszki
yPunktu - yMyszki

tylko ze wtedy dostane cwiartki a nie oktany... wiec jeszce pewnie musze uwzglednic kat ?

Topornie mi to dzis idzie.
Chce uzyskac tak jak jest w Cannon Fodder by gostek krecil sie za myszka.
[#2] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@peceha, post #1

nie wiem co to "oktana" ale zapytaj tehKaina on zrobil cos takiego w OF.
[#3] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@selur, post #2

wlasciwie to sam nie wiem czy oktana to wlasciwa nazwa :)
chodzi mi tu o polowe cwiartki :)
[#4] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@peceha, post #1

Twoja postać ma dwa kierunki - góra/dół i lewo/prawo. Z tego na obu kierunkach może też być zero jeśli w danym kierunku nie idzie. Więc masz 3 możliwości na kierunkach: góra/zero/dół, lewo/zero/prawo. Daje Ci to 3*3=9 kombinacji.

Każdą z tych rzeczy sprawdzasz deltami na danym kierunku. dy ujemne to góra, dodatnie to dół. Dx ujemne to lewo, dx dodatnie to prawo. Delty zerowe to zero na danym kierunku. Te dwie informacje możesz złożyć w klatkę która Cię interesuje gigantyczną ifologią lub trochę sprytniej:

Zakładasz sobie tablicę 3x3 wskaźników na bitmapy klatek lub ich indeksów, nie wiem jak je trzymasz w ramie. Zakładam że w blitzu jest jak w C, czyli indeksy rzeczy w tablicach zaczynają się od 0. Jak masz zmienne fdx i fdy (frame dx, frame dy) z zakresu -1..1 to dodajesz do nich 1 i masz z zakresu 0..2. Wtedy możesz uzyskać numer klatki lub jej adres (zależy co trzymasz z tablicy) robiąc: tablica[fdx+1][fdy+1].

Dla fdx = 1 (prawo) i fdy = -1 (góra) będziesz miał tablica[1+1][-1+1] = tablica[2][0] i w tym elemencie tablicy trzymasz numer klatki (czy tam jej adres) odpowiedzialny za klatkę kierunku prawo-góra.

Nie wiem czy wyraziłem się dostatecznie jasno. Jak nie zrozumiesz to krzycz, napiszę bardziej przystępnie. ;)

Takie rozwiązanie ma parę wad, m.in. to że jak kursor nie jest idealnie z prawej postaci a np. jeden pixel w górę czy w dół to od razu Ci wskoczy skośny kierunek. Możesz z tym walczyć porównując ze sobą delty kursor - postać na kierunkach - jeśli dx jest znacznie większy od dy to np. dy olewasz. Zaraz Ci też narysuję coś z OpenFire co naprowadzi Cię na rozwiązanie cud miód i orzeszki, ale będzie wolne - przynajmniej na tę chwilę nie umiem wymyślić szybkiego wariantu.

Ostatnia aktualizacja: 21.10.2018 20:50:25 przez teh_KaiN
[#5] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@teh_KaiN, post #4

Jasne ze jasne OK
Dzieki.

edyt
chetnie zobacze tez te druga metode

Ostatnia aktualizacja: 21.10.2018 20:59:39 przez peceha
[#6] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@peceha, post #5

Zmodyfikowałbym metodę KaiNa w ten sposób:

Otóż na początek legenda:
abs(x) - wartość bezwzględna z x: x, gdy x >= 0 oraz -x, gdy x < 0
znak(x) - znak liczby: 0 gdy liczba >= 0 i 1, gdy liczba < 0.

A oto obliczenia:
dx = x1 - x0
dy = y1 - y0

sx = znak(dx) << 2 ; przesuwam bitowo w lewo o 2 bity
sy = znak(dy) << 1 ; przesuwam bitowo w lewo o 1 bit
sd = znak(abs(dy) - abs(dx))

oktana = sx + sy + sd

W zmiennej oktana otrzymasz liczbę z zakresu 0-7, która oznacza odpowiedni numer oktany.

Teraz interpretujesz tę wartość według reguł:

Otrzymasz 0, gdy sx >= 0, sy >= 0 i sd >= 0 (oktana 2)
Otrzymasz 1, gdy sx >= 0, sy >= 0 i sd < 0 (oktana 1)
itd.

Inny sposób to zastosowanie drzewka IFów.

Ostatnia aktualizacja: 21.10.2018 21:28:23 przez Hexmage960
[#7] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@peceha, post #5



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
[#8] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@peceha, post #1

Dzieki za rozwiazania.
Uzylem pierwszej przedstawionej metody.
[#9] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@Hexmage960, post #6

@Hexmage960
abs(x) - wartość bezwzględna z x: x, gdy x >= 0 oraz -x, gdy x < 0
znak(x) - znak liczby: 0 gdy liczba >= 0 i 1, gdy liczba < 0.


dziwnym trafem Twoja wypowiedz mi umknela.
Chcialem sprawdzic, to co napisales bo wlasciwie wynikiem jest oktana (to o co pytalem),
Mam jednak problem ze zrozumieniem legendy a dokladnie sposobu jaki podales przy wartosci bezwzglednej.
[#10] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@peceha, post #9

Wartość bezwzględna (inaczej moduł) z liczby to jej wartość bez uwzględnienia znaku minusa, tzn. jest to wartość przeciwna do tej liczby (-x), gdy x jest mniejsze od zera:

Przykłady (pionowe kreski oznaczają wartość bezwzględną):
|3| = 3
|-3| = 3
|x| = x, gdy x >= 0 oraz (-x), gdy x < 0.

Inna definicja, to taka, że moduł z liczby to jej odległość od punktu 0 na osi liczb.

Czy zrozumiałeś już to pojęcie?
[#11] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@Hexmage960, post #10

hahahaha,
haha,
sorry za to :)
Jak patrzylem na to:
...oraz -x, gdy x < 0

to uciekl mi minus przed X i dlatego pomyslalem ze to moze masz jakas "zmodyfikowana" wersja wartosci bezwzglednej, ktora nie zwraca wartosci bezwzglednej :)

Dzieki
[#12] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@peceha, post #11

Jak będziesz ustalał, którą oktaną jest ta wartość obliczana za pomocą mojego wzoru to najpierw rozpisz sobie zależności:
\    |    /
 \   |   /
  \3 | 2/
   \ | /
  4 \|/ 1
------------
  5 /|\ 8
   / | \
  /6 | 7\
 /   |   \
/    |    \

OKTANA 1: sx = 0, sy = 0, sd = 1, oktana = %001 = 1
OKTANA 2: sx = 0, sy = 0, sd = 0, oktana = %000 = 0
OKTANA 3: sx = 1, sy = 0, sd = 0, oktana = %100 = 4
OKTANA 4: sx = 1, sy = 0, sd = 1, oktana = %101 = 5
OKTANA 5: sx = 1, sy = 1, sd = 1, oktana = %111 = 7
OKTANA 6: sx = 1, sy = 1, sd = 0, oktana = %110 = 6
OKTANA 7: sx = 0, sy = 1, sd = 0, oktana = %010 = 2
OKTANA 8: sx = 0, sy = 1, sd = 1, oktana = %011 = 3
[#13] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@Hexmage960, post #12

A czy nie lepiej ustalić kolejność i kierunek zwiększania numerów tych stref podobnie jak godziny na tarczy zegara?
[#14] Re: okreslanie w jakiej oktanie jest kursor wzgledem jakiegos punktu.

@ZbyniuR, post #13

obawiam sie ze ustwaienie uzyskanie "ciaglosci" nie jest bezposrednio mozliwe.
Hexmage960 calkiem sprytnie to wymyslil: sklada po kolei ze soba kolejno znak x znak y i znak ich roznicy. Dwie pierwsze daja cwiartke a ostatnie oktane. Zmieniajac kolejnosc tych dzialan przypisze inne numery (cyfry) do oktan ale nie ustawi ich np rosnaco.
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem