Skocz do zawartości

Zawansowane obracanie przeciwników


dexter19

Rekomendowane odpowiedzi

Witam

 

Wiem że pisałem już podobny temat ale ten jest bardziej złożony. Chciałbym zrobić bossa który obraca się we wszystkie strony czyli że np. odbije się od ściany to obje się w do tyłu po skosie. Jednego bossa mam takiego ale on nie ma zmienianej animacji.

 

Tak to wygląda i powiedzcie i proszę jak to zmienic na takie aby było dobrze i wiem że brakuje kilku elementów

[PLIK]

 

PS.Robię na GM8 Lite i wiem zrobiłem to klockami z jakiegoś przykładu dla początkujących ale kodem też przyjmę.

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli chcesz żeby boss obracał się w kierunku w którym idzie?

GML (step)
image_angle=direction // rotacja obrazu jest równa kierunkowi</span></span>

Tylko, że wtedy musi się poruszać poprzez zmienną direction np.

GML (step)
ii-=1 // co step zmniejsza licznik

if ii < 0 // sprawdza czy licznik doszedł do zera

{

ii =30 // od nowa ustawia licznik

speed = 2 // ustawia prędkość

direction=random(360) // losowy kierunek

}

Ale taki kod tylko jeśli na bossa nie działa grawitacja. Jeśli masz grawitację to musisz zrobić inny kod na poruszanie. Wtedy możesz zmieniać image_angle (kierunek od 0 do 360). Do wersji lite chyba musisz dodać w sprite klatki, za pomocą jakichś funkcji. Jest to w FAQ, dokładnie nie pamiętam przepraszam. Gra to platformówka? Odpisz, to postaram się coś zrobić :)

P.S. Czy ty tam masz object258? Zwariowałeś czy jak? ;O

Odnośnik do komentarza
Udostępnij na innych stronach

W step masz klocek "Start moving in direction". Może spróbuj to zamienić na ten drugi klocek, niebieski. A żeby wartość była losowa:

Ponieważ u Ciebie się chyba rusza po kątach prostych, to możesz w direction dać : choose(90, 180, 270, 360).

Odnośnik do komentarza
Udostępnij na innych stronach

Hmmm na klockach się znam jak osioł na szczekaniu, nie będę potrafił Ci pomóc. Mogę jedynie polecić przerzucenie się na kod.

Oczywiście możesz zrobić tak aby np. zmienna __nazwa__ w momencie wylosowania szansy miała __nazwa__=choose(90, 180, 270, 360), a w tym klocku w direction dał __nazwa__. Chciałem pomóc ale używanie klocków przerasta moje możliwości ;P

Odnośnik do komentarza
Udostępnij na innych stronach

Ok tłumaczę jak bym to zrobił, wykorzystasz lub nie, takie kopiuj-wklej, jest bez sensu.

GML (create)
ii=5

GML (step)
ii-=1 // co step zmniejsza licznik

if ii < 0 // sprawdza czy licznik doszedł do zera

{

ii =30 // od nowa ustawia licznik

speed = 2 // ustawia prędkość

direction=choose(90, 180, 270, 360) // losowy kierunek

}

Jeśli chcesz mieć wyrównane do siatki to musiałbyś pokombinować z tym

GML
x = x div 32 * 32

y = y div 32 * 32

Ale za bardzo to nawet nie wiem.

No i to

GML (step)
image_single = direction * image_number/360;

Odsyłam do artykułu Z klocków na kod. Mam nadzieję, że pomogłem, chociażby w małym stopniu.

Edit: Fragment

GML
ii=30
oznacza, że co około sekundę (przy 30fps) zmienia kierunek. Jeśli dasz 60, to 2s, 90 to 3s, itd.

Kolejny Edit: Zamiast wyrównywania siatki, możesz po prostu losować od 0 do 4, i przeskakiwać o 32 pixele, tzn. jeśli będzie 0 to przeskakuje o 32 pixele w lewo, jeśli 1 to 32 pixele w prawo. Myślę, że wiesz co mam na myśli.

Odnośnik do komentarza
Udostępnij na innych stronach

Coś pozmieniałem i został ostatni problem a mianowicie boss nie zmienia obrazka zgodnie z kierunkiem.

Chciałem pozmieniać

GML
image_single = direction * image_number/360;

 

na

GML
image_single = direction * image_number/-360;

 

Ponieważ dotyczy ten kod obrotu tego sprajta, ale powodowało to tylko że co jakiś czas boss obracał się woku własnej osi.

A dodanie kodu:

GML
direction=point_direction(x,y,object258.x,object258.y);

 

powoduje że boss idzie po lini prostej i zaraz się zacina.

Odnośnik do komentarza
Udostępnij na innych stronach

Coś pozmieniałem i został ostatni problem a mianowicie boss nie zmienia obrazka zgodnie z kierunkiem.

Chciałem pozmieniać

GML
image_single = direction * image_number/360;

 

na

GML
image_single = direction * image_number/-360;

 

Ponieważ dotyczy ten kod obrotu tego sprajta, ale powodowało to tylko że co jakiś czas boss obracał się woku własnej osi.

A dodanie kodu:

GML
direction=point_direction(x,y,object258.x,object258.y);

 

powoduje że boss idzie po lini prostej i zaraz się zacina.

Nie jestem pewien na 100%, ale jak się ustawia obrót sprite w edytorze, to trzeba ustawić 361, lub 360 klatek. Tyle ustawiłeś?

Odnośnik do komentarza
Udostępnij na innych stronach

ustawiłem 4 ponieważ ma on się obracać tylko w 4 strony. W przykładzie było tak i tam nie było problemu. Nawet nie rozumiem po co aż 360 obrazków. Sprawdziłem to i nie działa.

To jak masz 4 obrazki, to dziel przez 4, a nie 360. Robi się przez 360, bo chodzi o cały obrót wokół własnej osi, a nie 4 stopnie.

EDIT. W sumie jak masz tylko obracanie tylko w 4 strony, to możesz nawet tak zrobić. Mieć 4 różne sprite (nie jest to zbyt dobry sposób, ale i tak robisz na klockach, więc co tam) każdy na inny kierunek. W step tylko sprawdzaj kierunek i na jego podstawie zmieniaj sprite. Wyglądałoby to tak

GML (step)
if direction=0

sprite_index = spr_skeleton_right

if direction=90

sprite_index = spr_skeleton_down

if direction=180

sprite_index = spr_skeleton_left

if direction=270

sprite_index = spr_skeleton_left

Odnośnik do komentarza
Udostępnij na innych stronach

Jeszcze jedno pytanie. Jeżeli sprite postać jest ruchomy to jak należy zmienic ten kod:

 

GML
if direction=0

sprite_index =spr_skeleton_right;

if direction=90

sprite_index = spr_skeleton_up;

if direction=180

sprite_index = spr_skeleton_left;

if direction=270

sprite_index = spr_skeleton_down;

Animacja jest tylko wtedy gdy porusza się w dół i do góry

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki, ale teraz wywaliło mi GM i musze to nadrobic bo zapomniałem zapisac. Poczekaj chwile.

 

 

EDIT. Dzięki, udało się :)

 

EDIT.2 Jeszcze jedno pytanie. Jeżeli sprite postać jest ruchomy to jak należy zmienic ten kod:

GMLif direction=0

sprite_index =spr_skeleton_right;

if direction=90

sprite_index = spr_skeleton_up;

if direction=180

sprite_index = spr_skeleton_left;

if direction=270

sprite_index = spr_skeleton_down;

 

Animacja jest tylko wtedy gdy porusza się w dół i do góry

Hmmm, wiem, że też miałeś kiedyś taki problem, ale nie mogę znaleźć, gry w której to rozwiązałem, ale zdaje mi się, że tak.

GML
if (direction=0) and !(sprite_index=spr_skeleton_right)

sprite_index=spr_skeleton_right

Ale nie jestem pewien, czy w dobry sposób użyłem negacji ( '!' ). Powinno to działać tak. Jeżeli kierunek jest równy 0 oraz indeks jest inny od spr_skeleton_right, to zmienia indeks. Jeśli chcesz spowolnić sprite, to dodaj image_speed = (od 0 do 1, np. 0.3)

EDIT; Tylko ten image_speed, jak coś dodaj w CREATE, bo bez sensu cały czas ustawiać na nowo.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie ma po prostu animacji, zrobiłem dokładnie jak napisałeś i jest to samo. Boss skręca zmienia się ale animacja nie chce się poruszać

 

EDIT. Tak to wygląda:

 

GML
if (direction=0) and !(sprite_index=spr_skeleton_right)

sprite_index =spr_skeleton_right

image_speed=0.3;

if (direction=90) and ! (sprite_index=spr_skeleton_up)

sprite_index = spr_skeleton_up

image_speed=0.3;

if (direction=180)and !(sprite_index=spr_skeleton_left)

sprite_index = spr_skeleton_left

image_speed=0.3;

if (direction=270) and !(sprite_index=spr_skeleton_down)

sprite_index = spr_skeleton_down

image_speed=0.3;

 

Napisz co mam źle.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie ma po prostu animacji, zrobiłem dokładnie jak napisałeś i jest to samo. Boss skręca zmienia się ale animacja nie chce się poruszać

 

EDIT. Tak to wygląda:

 

GML
if (direction=0) and !(sprite_index=spr_skeleton_right)

sprite_index =spr_skeleton_right

image_speed=0.3;

if (direction=90) and ! (sprite_index=spr_skeleton_up)

sprite_index = spr_skeleton_up

image_speed=0.3;

if (direction=180)and !(sprite_index=spr_skeleton_left)

sprite_index = spr_skeleton_left

image_speed=0.3;

if (direction=270) and !(sprite_index=spr_skeleton_down)

sprite_index = spr_skeleton_down

image_speed=0.3;

 

Napisz co mam źle.

 

Spróbuj tak :

 

GML
if (direction=0) && (!(sprite_index=spr_skeleton_right))

sprite_index =spr_skeleton_right

image_speed=0.3;

if (direction=90) && (!(sprite_index=spr_skeleton_up))

sprite_index = spr_skeleton_up

image_speed=0.3;

if (direction=180) && (!(sprite_index=spr_skeleton_left))

sprite_index = spr_skeleton_left

image_speed=0.3;

if (direction=270) && (!(sprite_index=spr_skeleton_down))

sprite_index = spr_skeleton_down

image_speed=0.3;

 

EDIT : Szybciej działa if (..) && (!(..)) niż if (..) and !(..)

 

(nie wiem szczerze jak w GML ale w JS lepiej działało ;))

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ę...