Skocz do zawartości

Obracające się ostrze, sterowane myszką.


MeloPL

Rekomendowane odpowiedzi

Witam, od niedawna postanowiłem stworzyć grę, ciachankę, czy jak by to nazwać. No, w każdym razie mam problem właśnie z tym ciachaniem (brak wiedzy/umiejętności :( ). Jak (dla mnie :>) wiadomo, jestem bardzo początkujący, no i nieraz mam problemy z drobnostkami. W tym momencie mam jednak problem z (moim zdaniem) większym kawałkiem do zgryzienia, no... Koniec przedmowy.

 

A więc problem polega na tym, że kompletnie nie potrafię zrobić skryptu dla ostrza (tego: http://img40.imageshack.us/img40/3480/ostrze.png ), który ma odpowiadać za to, by przy ruchu myszką w tył, skręciło ono w dół (z punktem środka* w lewym, dolnym rogu sprite'a), ciachając przy tym przeciwnika, a przy ruchu myszki w przód, skręciło ono w górę, nic nie robiąc przeciwnikowi (znowu z tym samym punktem środka na sprite'cie).

 

* to, co nazywam punktem środka, ma odpowiadać temu, co (na przykład) jest w karuzeli, na jej środku; to, co się kręci, do czego są przypięte wagony (taki jakby kręcący się drążek). Trzeba sobie to wyobrazić, jak wygląda, by zrozumieć, bo ja sam dobry w tłumaczeniu niestety nie jestem. :(

 

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

No, sporo jest rozwiązane dzięki tobie Matyxon, dzięki. :D

 

Jednak ten create nie jest mi potrzebny, bo nie chce, by ostrze chodziło w stronę kursora :P

Teraz tylko kwestia tego, żeby po dotknięciu przeciwnika od prawej strony sprite'a, on (przeciwnik) ginął, a przechodząc od lewej-do prawej strony sprite'a (poprzez przekręcenie się ostrza z dołu na górę), przeciwnikowi nic się nie stało. Sądzę, że z resztą sobie poradzę, tyle, że potrzebuję jedynie skryptu na to, by po dotknięciu maksymalnie prawego piksela sprite'a do przeciwnika, wróg ginął.

Odnośnik do komentarza
Udostępnij na innych stronach

Eh, nie działa. Błąd jest w linijce z "other.instance_destroy()", o treści "Variable name expected."

 

Gdy skrypt przepisalem zamiast na step ostrza, do step przeciwnika, "other" z "other.instance_destroy()" wymazałem, a inne "other" zastąpiłem nazwą ostrza "ostrze" (lub nawet bez wymazywania tych innych "other"), do błędu przy uruchamianiu nie było, ale gdy ostrze dotknęło przeciwnika, nic się nie działo. Dzięki za pomoc i tak :P

Odnośnik do komentarza
Udostępnij na innych stronach

Niby działa, ale tylko w jedną stronę, no i pod jednym, jedynym warunkiem.

 

W jedną stronę, czyli wtedy, gdy ostrze z prawej strony dotknie przeciwnika, nie ważne, czy wcześniej przejdzie w niego od lewej strony. Chodzi o to, żeby po przejściu przez lewą stronę sprite'a do prawej, przeciwnikowi nic się nie stało, a dopiero od prawej do lewej zostałby on (przeciwnik) przecięty.

 

A warunek, żeby to działało, to - trzeba powoli ruszać myszką, bo szybkim zamachem w cale nic się nie zrobi przeciwnikowi.

 

Jeśli nic się nie uda zrobić, to zmienię sprite ostrza, by atakowało ono z lewej i z prawej strony, a cały skrypt się uprości.

Odnośnik do komentarza
Udostępnij na innych stronach

Za bardzo nie mogę zaczaić tych Twoich wypowiedzi, MeloPL, ale wydaje mi się, że Tobie chodzi o to, że jak ostrze jest po prawej stronie przeciwnika, to mu nic się nie dzieje, a jak przejdzie od prawej do lewej, to go przecina. Dobrze mi się wydaje? xD Jeśli tak, to przy kolizji z wrogiem sprawdzaj, czy poprzednie x ostrza było za prawą połową, a aktualne x jest na lewej połowie, jeśli tak to go ucinaj, jeśli nie, to nic nie rób. Chyba dobrze :P

Odnośnik do komentarza
Udostępnij na innych stronach

No, napiszę dokładniej, bo faktycznie, czasami sam siebie nie rozumiem. :D

 

 

No, a więc, jeśli ostrze tylko dotknie prawą stroną, ale nie przejdzie z prawej do lewej, to nic się nie dzieje, tak samo, jak przejdzie z lewej do prawej - też nic się nie dzieje. Jedynie, jeśli ostrze przejdzie z prawej do lewej, to coś się stanie. No, to o to mi chodzi.

Odnośnik do komentarza
Udostępnij na innych stronach

Em, no to napisałem w ten sposób w obiekcie "ostrze", w kolizji z wrogiem:

GML
if (xprevious > obj_wrog.x && x < obj_wrog.x)

{with(obj_wrog) { instance_destroy() }}

 

wróg_spr ma wycentrowany origin.

 

Jednak wrogowi nic się nie dzieje, nie ważne, jak się najedzie tym ostrzem, czy się przetnie, czy nie. Mogę wysłać nawet projekt. :)

 

 

Edit.

 

Dodałem możliwość poruszania się ostrza za pomocą klawisza lewego i prawego (w prawą i lewą stronę).

Okazało się, że gdy przechodzę nie ruszając myszką w prawą stronę (z prawej, do lewej strony ostrza), nic się nie dzieje, ale za to, jeśli zajdę wroga (bez ruszania myszką, tylko samymi klawiszami, poruszając się w lewo/prawo, a nie obracając się) lewą stroną ostrza, idąc w lewo, to przy dotknięciu (lewej strony ostrza) wróg ginie.

Odnośnik do komentarza
Udostępnij na innych stronach

Oki, odwróciłem znaczki mniejszości/większości, i działa prawidłowo tylko przy ruszaniu klawiszami lewa-prawa, ale gdy ruszę ostrzem myszką za pomocą skryptu, który mi napisał Matyxon (dzięki)

"direction = point_direction(x,y,mouse_x,mouse_y)

image_angle = direction",

nic się nie dzieje.

Odnośnik do komentarza
Udostępnij na innych stronach

Ale wtedy, jeśli uderzę ten obiekt tyłem ostrza, to przeciwnik od razu ginie. Mogę to zastosować ew. wtedy, gdy będzie się miało miecz, a nie jedno ostrze. Nie ma naprawdę jakiegoś sposobu, by to zadziałało na tym ostrzu w taki sposób, jak tego chcę? ;/

 

Edit. A jeśli zastosuję miecz, to jeśli będę chciał, by jednym zamachem-dotykiem zabrało się 1 hp z 10, to przecież skrypt będzie się powtarzał w bardzo szybkim tempie, bo kolizja ostrza z wrogiem trwałaby dalej. Jest kolizja - traci się 1 hp, ale jeśli dalej jest kolizja, to dalej traci się po 1 hp, aż w krótkiej chwili przeciwnik ginie.

Odnośnik do komentarza
Udostępnij na innych stronach

Kolizja ostrza z głową:

GML
kierunek = point_direction(x,y,other.x,other.y)

if DirDiv(kierunek,direction+90)<DirDiv(kierunek,old_direction+90)>0

{with(other) { instance_destroy() }}

Create ostrza:

GML
old_direction=0

Step ostrza:

GML
old_direction= direction

direction = point_direction(x,y,mouse_x,mouse_y);

image_angle = direction;

Oraz skrypt "DirDiv"

GML
var dif

if(argument1>argument0+180)

{

dif=-((360-argument1)+argument0)

}

else{

if(argument0>argument1+180)

{

dif=((360-argument0)+argument1)

}

else{

dif=argument1-argument0

}

}

return dif

U mnie działa :)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...