Skocz do zawartości

Mouse_x i y


Gość

Rekomendowane odpowiedzi

Witam, po długiej przerwie wróciłem do zabawy w GM i na dzień dobry mam problem..

Chcę przerobić skrypt z "Animacja Szkieletowa Top-Down RPG" tak, aby ludek podążał za myszką bez potrzeby klikania prawego klawisza. Udało mi się to, lecz teraz chcę zrobić warunek:

 

JEŚLI pozycja myszy x i y jest równa x i y obiektu o_gracz

to działanie 0

 

Create:

GML
scr_deklaracja_masek();

 

var playerpos;

playerpos=instance_nearest(x,y,o_gracz);

xx=playerpos.x;

yy=playerpos.y;

 

 

dir = 0;

 

sinus = 0;

sin_p = 0;

 

dzialanie = 0;

ruch = false;

 

pred_ruch = 0;

 

sin_ruch = 0;

sin_ruch_p = 0;

 

max_pred_ruch = 5;

 

kasiora = 0;

 

wyzeruj = false;

 

Step:

GML
scr_deaktywacja_obiektow();

 

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

 

if dzialanie = 0 // Stanie

{sinus = sin(degtorad(sin_p))*7;

sin_p += 5;}

if dzialanie = 1 // Ruch

{sinus = sin(degtorad(sin_p))*15;

sin_p += pred_ruch*4;}

if dzialanie = 2 // Atakowanie

{sinus = sin(degtorad(sin_p))*35;

sin_p += 20;}

if dzialanie = 3 // Czarowanie

{sinus = sin(degtorad(sin_p))*27;

sin_p += 17;}

 

if (mouse_x)=xx

 

 

if (mouse_y)=yy

 

if mouse_check_button(mb_none)

{

ruch = true;

wyzeruj = true;

}

else

{

if mouse_check_button(mb_left)

{dzialanie = 2;scr_wyzeruj();}

if mouse_check_button(mb_right)

{dzialanie = 3;scr_wyzeruj();}

}

 

if ruch = true

{

pred_ruch = min(pred_ruch,max_pred_ruch);

x+= lengthdir_x(pred_ruch,dir+sinus);

y+= lengthdir_y(pred_ruch,dir+sinus);

pred_ruch+= 0.3;

sin_ruch = sinus*0.65;

}

else

{

pred_ruch = 0;

sin_ruch = 0;

}

 

I teraz pytanie:

Co zrobić, by dać dwa warunki? Co robię źle i jak powinno to być? I będę wdzięczny jeśli dostanę od razu wyjaśnienie, dlaczego tak, a nie inaczej. Z góry dziękuję.

 

@EDIT

 

I jeszcze jedno pytanie, co zrobić by po naciśnięciu lewego/prawego klawisza animacja ataku/czarowania wykonała się tylko raz i wróciła do animacja chodzenia lub stania?

Odnośnik do komentarza
Udostępnij na innych stronach

Tylko animacja jest tworzona przez skrypty.. Więc to nie będzie chyba działać, nie?

 

@EDIT

Z animacjami sobie poradziłem. Teraz mam problem ze staniem gdy kursor jest na obiekcie.

GML
scr_deaktywacja_obiektow();

 

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

 

if dzialanie = 0 // Stanie

{sinus = sin(degtorad(sin_p))*7;

sin_p += 5;}

if dzialanie = 1 // Ruch

{sinus = sin(degtorad(sin_p))*15;

sin_p += pred_ruch*4;}

if dzialanie = 2 // Atakowanie

{sinus = sin(degtorad(sin_p))*35;

sin_p += 20;}

 

if mouse_check_button(mb_none)

{

if ( ( mouse_x = xx ) || ( mouse_y = yy ) )

{

ruch = false;

dzialanie = 0

}

else

{

ruch = true;

wyzeruj = true;

dzialanie = 1

}

}

{

ruch = false;

dzialanie = 0

{

 

 

};

 

};

 

if mouse_check_button(mb_left)

{ruch = false;

dzialanie = 2}

 

 

if ruch = true

{

pred_ruch = min(pred_ruch,max_pred_ruch);

x+= lengthdir_x(pred_ruch,dir+sinus);

y+= lengthdir_y(pred_ruch,dir+sinus);

pred_ruch+= 0.3;

sin_ruch = sinus*0.65;

}

else

{

pred_ruch = 0;

sin_ruch = 0;

}

 

Tak wygląda skrypt Step. Co jest źle? Postać cały czas stoi, może atakować, lecz nie podąża za kursorem..

Odnośnik do komentarza
Udostępnij na innych stronach

Do administracji, można podbijać? W regulaminie nie znalazłem zakazu na to, jeśli jest to proszę o usunięcie tego posta i jeśli uznacie to za stosowne to warn.

Podbijam, pomoże mi ktoś z tym skryptem? Chodzi mi teraz tylko o ustawienie dla postaci ruch = false i animację stania, gdy kursor będzie nad obiektem o_gracz. Skrypt jest powyżej.

Odnośnik do komentarza
Udostępnij na innych stronach

GML
scr_deaktywacja_obiektow();

 

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

 

if dzialanie = 0 // Stanie

{sinus = sin(degtorad(sin_p))*7;

sin_p += 5;}

if dzialanie = 1 // Ruch

{sinus = sin(degtorad(sin_p))*15;

sin_p += pred_ruch*4;}

if dzialanie = 2 // Atakowanie

{sinus = sin(degtorad(sin_p))*35;

sin_p += 20;}

 

if mouse_check_button(mb_none)

{

if point_distance(x,y,mouse_x,mouse_y)<1

{

ruch = false;

dzialanie = 0

}

else

{

ruch = true;

wyzeruj = true;

dzialanie = 1

}

 

}

 

 

{

ruch = false;

dzialanie = 0

{

 

 

};

 

};

 

 

if mouse_check_button(mb_left)

{

ruch = false;

dzialanie = 2

}

 

 

if ruch = true

{

pred_ruch = min(pred_ruch,max_pred_ruch);

x+= lengthdir_x(pred_ruch,dir+sinus);

y+= lengthdir_y(pred_ruch,dir+sinus);

pred_ruch+= 0.3;

sin_ruch = sinus*0.65;

}

else

{

pred_ruch = 0;

sin_ruch = 0;

}

Postać cały czas stoi.
Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem czemu tak sie dzieje, ale tez nie wiem po co utrudniasz sobie zycie cosinusami i sinusami jak masz do tego lengthdir_x(kat,dlugosc) i lengthdir_y(kat, dlugosc)?

e: w sprawie pytania: moze zamiast

GML
[...]mouse_x,mouse_y)<1

daj wieksza wartosc np. 10

Odnośnik do komentarza
Udostępnij na innych stronach

  • 6 miesięcy temu...

I interesuje mnie jak rozwiązałeś ten problem aby animacja była odegrana jeden raz gdy klikniesz, a nie że jest odgrywana gdy masz wcisniętą myszke. Jedno klikniecie i odgrywa się sekwencja, po czym wraca do pozycji sprzed klikniecia.

Odnośnik do komentarza
Udostępnij na innych stronach

Mouse pressed... to wiem :) ale jak powiedzmy ja rysuję w draw jakiś tam atak za pomocą draw_sprite_ext i tam mam lenghtdiry różne, i to działa na takiej zasadzie, że jak mam wciśniety przycisk myszki to wiadomo animacja idzie zgodnie z lenghtdirami i image angle, ale jak zmienię to na mouse pressed, to wyglada to w ten sposób, ze widać tylko podczas klikniecia że coś tam się zmieniło, ale od razu wraca animacja do początkowej, a ja chcem aby wykonała sie sekwencja faza uderzenia mieczem i faza powrót, jak to zrobić? Mniej więcej. Myślę, że mnie zrozumieliście.

Odnośnik do komentarza
Udostępnij na innych stronach

1. Zamiast zrzynać z przykładu powinieneś stworzyć sobie nowy projekt i w nim nauczyć się( a raczej zrozumieć ) jak działają lengthdir'y

2. Zrób sobię zmienną animacja=false; Po przyciśnięciu myszy( pressed ) zmień zmienną animacja na true; jeśli animacja=true to ma się wykonać seria zmiany wartości danych do lengthdir( czyli poprostu animacja ) i na koniec animacja=false;

Odnośnik do komentarza
Udostępnij na innych stronach

Kto ci powiedział, że zrzynam z przykładu?

 

To co mówisz, to ja wiem, tylko jak ustawie na true, to animacja - bardziej poruszanie za pomocą image angle i dir - będzie się odgrywała, ok, ale jak zrobić aby w pewnym momencie przestała.. nie za bardzo chcę ustawiać tego w alarmach, wolałbym taki warunek: jeżeli obiekt A znajdzie się w takim a takim miejscu w swoim ruchu ( określonym lenghdirami i cos ) to ma się zatrzymać i więcej nie ruszać, Jak to zrobić? jak sprawdzać w jakim miejscu jestw danym momencie obiekt który rysuję za pomocą draw_sprite_ext?

 

draw_sprite_ext(miecz,global.typ_broni,x+lengthdir_x(-27,(image_angle+80)+30*cos(degtorad(anim))),y+lengthdir_y(-27,(image_angle+80)+30*cos(degtorad(anim))),image_xscale,image_yscale,(image_ang

le-40)+60*cos(degtorad(10)),coll,alpha);

 

Raz sprite miecz jest w takim położeniu a raz w takim:

 

 

|

|

|

|

|

---------------

 

Jak sprawdzić w którym w danym momencie?

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