[MMF2] Prosty strzał 360+ kierunków |
Autor |
Wiadomość |
jarlfenrir
Generał brygady
Pomógł: 82 razy Posty: 1731
37283 Prestiż
|
Wysłany: 01-01-2008, 12:50 [MMF2] Prosty strzał 360+ kierunków
|
|
|
Tyle na PSK można znaleźć przykładów dotyczących dokładnego strzału, ale wielu ludzi i tak ich nie rozumie. Poniżej pokażę jak w miarę szybko wykonać takie coś.
Potrzebny będzie obiekt [gracz] [kula] i [celownik]. Dla obiektu [celownik] ustalamy 3 wartości, niech się na przykład nazywają Angle (alterableValueA), PosX (alterableValueB) i PosY (alterableValueC). Do tego jeszcze rozszerzenie Advenced direction object lub coś innego zdolnego obliczyć kąt między dwoma punktami.
Na zdarzenie strzału, np kliknięcie myszą dajemy akcje:
create [kula] at (0,0) from [gracz]
Set Angle [kula] to Direction( "Advanced Direction Object", X( "gracz" ), Y( "gracz" ), X( "Celownik" ), Y( "Celownik" )) //Wartość Angle trzeba ustalić na wartość kąta między graczem a celownikiem, ewentualnie można odjać pewna wartość od kąta i dodać losową, by uzyskać efekt rozrzutu.
Set PosX [kula] to X("kula")*1.0
Set PosY [kula] to Y("kula")*1.0 //Mnożenie przez 1.0 ma nam zapewnić, że MMF będzie widział te wartości jako ułamki.
Potem na zdarzenie always lub ilość kul większa od zera dajemy akcję:
start loop "rusz_kulkę" 100 times //zalezni co wpiszemy zamiast 100 kula bedzie się poruszać szybciej lub wolniej
I na koniec na zdarzenie OnLoop ("Rusz_kulkę") zdarzenia:
add to PosX("kulka") Cos(angle("kulka"))
subtract from PosY("kulka") Sin(angle("kulka")) //Sin i Cos to funkcje wbudowane, nie trzeba żadnego rozszerzenia.
Oczywiscie by sprawdzić kolizje kuli z jakimś obiektem każde zdarzenie nalezy zacząć od zdarzenia "OnLoop("rusz_kulkę") i najlepiej zakonczyć akcją StopLoop("rusz_kulkę")
A teraz tak na chłopski rozum: tworzysz kulkę, zapisujesz w jej wartościach jej aktualną pozycję oraz kąt pod jakim ma lecieć i uruchamiasz pętlę, która do zapisanej pozycji X doda cosinus kąta oraz od pozycji Y odejmie sinus kąta po czym przesunie kulkę na nowo zapisane pozycje. |
|
|
|
|
Fadex
Legenda #4; #12; #18; #20; #21; #27
Pojedynki: nie
Pomógł: 105 razy Posty: 1773
51612 Prestiż
|
Wysłany: 01-01-2008, 13:14
|
|
|
nie jestem pewien, czy to będzie działać. ja bym wykorzystał do tego wartości A i B i dodawał do nich odpowiednio sinus*100 i cosinus*100, a jak wartość byłaby większa niż 100 - zmienić odpowiednio pozycję x/y i odjąć od wartości 100.
Tak naprawdę każdy kto rozumie sinusa i cosinusa nie powinien mieć z tym większych problemów. A teraz taki przykład:
Kod: | 0 sinus = 0
90 sinus = 1
180 sinus = 0
270 sinus = -1
0 cosinus = 1
90 cosinus = 0
180 cosinus = -1
270 cosinus = 0
45 sinus = 45 cosinus (w przybliżeniu 0,707) |
Na podstawie podanych wyżej równań można stwierdzić, że sinus to "tak jakby" przesunięcie po osi Y, a cosinus to "tak jakby" przesunięcie po osi X.
(oczywiście te wartości 0, 90... to miary kąta.) |
_________________ If it doesn't have to work, I can optimize any code to a runtime of zero. What's your superpower?
wat |
|
|
|
|
jarlfenrir
Generał brygady
Pomógł: 82 razy Posty: 1731
37283 Prestiż
|
Wysłany: 01-01-2008, 23:13
|
|
|
Gdybyś wartosci sinua i cosinusa mnożył przez 100 to straciłbyś dokładność ruchu (obiekt pod kątem 90stopni robiłby skoki co 100 pikseli i mógłby "przeskoczyć" jakąś przeszkodę). Sinus i Cosinus bazowo jest o tyle dobry, ze nie może mieć wartości większej od 1, czyli żadnego obiektu nie da sie przeskoczyć (nawet wielkości 1x1).
Do artykułu dodam tylko, że zastosowanie tej metody powoduje błędy przy strzale ze strzelby (kiedy to na raz pojawia się kilka pocisków na raz i lecą mniej więcej w tym samym kierunku). Strzelba jest słaba z bliska i daleka, a w projekcie, który robiłem najsilniejsza okazywała się w odległości mniej więcej 100-150px od wroga.
zdarzenie: OnLoop "rusz_kulke"; [kula] colides with [enemy]
akcja: stop loop "rusz kulke"
i kolejne zdarzenie: [kula] is overlaping [enemy] subtract 1 from HP("enemy"); destroy("kula")
Chodzi o to, że jeżeli kolizja zachodzi w pętli, to należy pętle zatrzymać i potem sprawdzić jeszcze raz kolizje poza pętlą i wtedy zniszczyć kulę iodjąćwrogowitrochę życia.
Ne wiedzieć czemu jeżeli w pętli się zniszczy kulę i odejmie życie wrogowi, to tak jakby są niszczone wszystkie kule, które z wrogiem kolidują, ale życie jest odejmowane tylko raz. |
|
|
|
|
Minty
Stwórczyni omc dr fizyki
Pojedynki: być może
Pomogła: 259 razy Posty: 3446
33789 Prestiż
|
Wysłany: 02-01-2008, 09:38
|
|
|
Cytat: | Gdybyś wartosci sinua i cosinusa mnożył przez 100 to straciłbyś dokładność ruchu (obiekt pod kątem 90stopni robiłby skoki co 100 pikseli i mógłby przeskoczyć jakąś przeszkodę). Sinus i Cosinus bazowo jest o tyle dobry, ze nie może mieć wartości większej od 1, czyli żadnego obiektu nie da sie przeskoczyć (nawet wielkości 1x1). |
Najlepiej mnożyć przez 10000, są IMO łatwiejsze do wykorzystania liczby. A metody chyba nie zrozumiałeś Dodajemy wartość np. 100 razy większą, ale też sprawdzamy, czy wartość bezwzględna zmiennej, do której się dodało, jest większa niż 100. Wychodzi na to samo bez względu na mnożnik.
Przy zderzeniach trzeba uwzględnić, że pociski nie są niszczone w pętli, tylko oznaczane do zniszczenia - znikają dopiero później. Trzeba dodać warunek do pętli, żeby pocisk miał wyłączoną flagę - i włączać ją przy kolizji.
MMF2 - najprostszy ruch 360 - bez kolizji i określania kierunku. |
|
|
|
|
Fadex
Legenda #4; #12; #18; #20; #21; #27
Pojedynki: nie
Pomógł: 105 razy Posty: 1773
51612 Prestiż
|
Wysłany: 02-01-2008, 14:39
|
|
|
Nie chodziło mi o dodawanie 100 pixeli... tylko że można zrobić to z wykorzystaniem zmiennej bez większych problemów (no i z fast loopem oczywiście). z mnożnikiem przez 100 to był tylko przykład, polecam wykorzystywać większe.
Swoją drogą sam miałem napisać artykuł o strzale 360*, ale jak widać odkładałem to na później, aż ktoś mnie ubiegł |
_________________ If it doesn't have to work, I can optimize any code to a runtime of zero. What's your superpower?
wat |
|
|
|
|
Tropik
Plutonowy
Posty: 79
4246 Prestiż
|
Wysłany: 23-04-2008, 13:29
|
|
|
RomanX Twój przyqad po przeróbce (określanie kierunku) nie działa jak należy. Pocisk pojawia się w dziwnych miejscach od gracza. Sam zobacz:
http://www.tropikgames.yo...tszyruch360.mfa |
_________________ tamtomasz.pl |
|
|
|
|
Minty
Stwórczyni omc dr fizyki
Pojedynki: być może
Pomogła: 259 razy Posty: 3446
33789 Prestiż
|
|
|
|
|
Tropik
Plutonowy
Posty: 79
4246 Prestiż
|
Wysłany: 25-04-2008, 16:29
|
|
|
A. Sory nie zauważyłem
Ale za to kolizja nie działa Nawet jak dam On loop |
_________________ tamtomasz.pl |
|
|
|
|
jarlfenrir
Generał brygady
Pomógł: 82 razy Posty: 1731
37283 Prestiż
|
Wysłany: 25-04-2008, 19:50
|
|
|
Tropik napisał/a: | A. Sory nie zauważyłem
Ale za to kolizja nie działa Nawet jak dam On loop |
On loop ma być pierwszym warunkiem w zdarzeniu, inaczej nie zadziała. |
|
|
|
|
Minty
Stwórczyni omc dr fizyki
Pojedynki: być może
Pomogła: 259 razy Posty: 3446
33789 Prestiż
|
Wysłany: 25-04-2008, 20:06
|
|
|
I tak zadziała, ale bez 'On loop' tylko wtedy, gdy pętla się skończy nad przeszkodą... |
|
|
|
|
Tropik
Plutonowy
Posty: 79
4246 Prestiż
|
Wysłany: 30-04-2008, 08:37
|
|
|
fenrir: Mam poprawną kolejność warunków.
Nadal nie działa... |
_________________ tamtomasz.pl |
|
|
|
|
Fadex
Legenda #4; #12; #18; #20; #21; #27
Pojedynki: nie
Pomógł: 105 razy Posty: 1773
51612 Prestiż
|
Wysłany: 30-04-2008, 13:41
|
|
|
Zamiast kolizji musisz dać "zachodzi na", bo według klików obiekt się nie porusza. |
_________________ If it doesn't have to work, I can optimize any code to a runtime of zero. What's your superpower?
wat |
|
|
|
|
Tropik
Plutonowy
Posty: 79
4246 Prestiż
|
Wysłany: 05-05-2008, 13:47
|
|
|
Również tak mam. Nadal przelatuje... |
_________________ tamtomasz.pl |
|
|
|
|
jarlfenrir
Generał brygady
Pomógł: 82 razy Posty: 1731
37283 Prestiż
|
Wysłany: 05-05-2008, 17:05
|
|
|
To pokaż, jak to zrobiłeś, bo link kilka postów wyżej nie działa. |
|
|
|
|
Minty
Stwórczyni omc dr fizyki
Pojedynki: być może
Pomogła: 259 razy Posty: 3446
33789 Prestiż
|
|
|
|
|
|