NukeBoards - Kreatywność przede wszystkim
FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  DownloadDownload
RejestracjaRejestracja  ZalogujZaloguj

Odpowiedz do tematu
Poprzedni temat :: Następny temat
[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ł :P
_________________
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ż
Wysłany: 23-04-2008, 15:18   

Tropik napisał/a:
Pocisk pojawia się w dziwnych miejscach od gracza

No bo tak ustawiłeś, pojawia się na pozycji 42,239 i nie zależy ona od gracza :P http://img223.imageshack.us/img223/23/zlexx5.png
 
     
Tropik 
Plutonowy


Posty: 79

4246 Prestiż
Wysłany: 25-04-2008, 16:29   

A. Sory nie zauważyłem :P
Ale za to kolizja nie działa :P Nawet jak dam On loop :D
_________________
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 :P
Ale za to kolizja nie działa :P Nawet jak dam On loop :D

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... :P
_________________
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ż
Wysłany: 05-05-2008, 18:11   

Odgap sobie:
http://romanx.webd.pl/down/strzalplus.zip
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

PSK Cytaty Klikibaza - kopia wszystkich klików Klikipedia - encyklopedia o tworzeniu gier Discord KlikCzat Zaproszenie
Daj piniondza Wielkie Muzeum Klikowe

Powered by phpBB modified by Przemo © 2003 phpBB Group