Skocz do zawartości

Problem z odległością myszy od gracza.


KlivenPL

Rekomendowane odpowiedzi

Witam, tworzę grę Minecraft 2D. Wszystko ładnie działa, generator terenu, oświetlenie itp, ale mam problem z mierzeniem odległości myszy od gracza. Nie chcę, aby gracz mógł rozwalać klocki oddalone od niego za daleko (96 px max). Napisałem coś takiego:

GML
if place_meeting(mouse_x,mouse_y,obj_gracz)

 

or place_meeting(mouse_x+32,mouse_y,obj_gracz)

or place_meeting(mouse_x-32,mouse_y,obj_gracz)

or place_meeting(mouse_x,mouse_y+32,obj_gracz)

or place_meeting(mouse_x,mouse_y-32,obj_gracz)

 

or place_meeting(mouse_x+96,mouse_y,obj_gracz)

or place_meeting(mouse_x-96,mouse_y,obj_gracz)

or place_meeting(mouse_x,mouse_y+96,obj_gracz)

or place_meeting(mouse_x,mouse_y-96,obj_gracz)

 

or place_meeting(mouse_x+96,mouse_y+96,obj_gracz)

or place_meeting(mouse_x-96,mouse_y-96,obj_gracz)

 

or place_meeting(mouse_x+16,mouse_y,obj_gracz)

or place_meeting(mouse_x-16,mouse_y,obj_gracz)

or place_meeting(mouse_x,mouse_y+16,obj_gracz)

or place_meeting(mouse_x,mouse_y-16,obj_gracz)

 

{

NieZaDaleko = true;

}

else

{

NieZaDaleko = false;

}

 

Wszystko to napisałem w obiekcie-matce, do której parentowane są wszystkie klocki. Ten skrypt działa, ale czasami nie (patrz obrazek)

31lv.png

 

Czasami w podziemiach również nie da się rozwalić niektórych klocków.

 

Teraz mam prośbę: czy mógłby ktoś napisać skrypt, dzięki któremu można byłoby rozwalić klocki w promieniu 96 px? Będę bardzo wdzięczny, jeżeli jeszcze mi ktoś go wytłumaczy :)

 

Pozdrawiam. :thumbsup:

Odnośnik do komentarza
Udostępnij na innych stronach

A nie wystarczy Ci sprawdzić odległości pomiędzy namierzonym przez myszkę (albo myszką) blokiem a graczem? Pitagoras albo point_distance() ułatwią wszystko. Potem możesz sprawdzić czy blok nie jest czymś zasłonięty funkcją !collision_line().

Odnośnik do komentarza
Udostępnij na innych stronach

W step gracza

GML
if ( mouse_check_button( mb_left ) )

{

// deklarowanie zmiennych tymczasowych

var dist = point_distance( x, y, mouse_x, mouse_y ), // odleglość myszki od gracza

klocek = noone;

 

if ( dist < 96 )

{

klocek = instance_position( mouse_x, mouse_y, parent_klockow ); // to zwróci id klocka lub noone jeśli żaden klocek nie został kliknięty

if ( klocek != noone )

with ( klocek ) instance_destroy();

}

}

 

Edit: poprawiłem kod.

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki, wszystko działa! Moja finalna wersja to:

 

GML
var dystansMyszki = distance_to_object(obj_gracz)

 

if (dystansMyszki < 96)

{

NieZaDaleko = true;

}

else

{

NieZaDaleko = false;

}

 

if (index < 5 and rozwalaSie and NieZaDaleko=1)

{

index++;

alarm[0] = (twardosc * 30)/6;

}

else if(rozwalaSie) and NieZaDaleko

{

index = 0;

rozwalaSie = false;

instance_destroy();

}

 

Nie mogłem dać tego do stepu gracza, bo jest to za bardzo rozbudowane. Bardzo dziękuję za funkcję distance_to_object() :)

Odnośnik do komentarza
Udostępnij na innych stronach

To była funkcja point_distance która to jest niczym innym jak twierdzeniem pitagorasa

GML
sqrt( sqr(mouse_x-x) + sqr(mouse_y-y) )

distance_to_object() uwzględnia maskę sprawdzanego obiektu i działa znacznie wolniej od point_distance dlatego jak nie potrzebujesz a w tym przypadku na pewno nie potrzebujesz takiej dokładności to użyj jednak point_distance

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