KlivenPL Opublikowano 27 Grudnia 2013 Udostępnij Opublikowano 27 Grudnia 2013 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) 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 Więcej opcji udostępniania...
Threef Opublikowano 27 Grudnia 2013 Udostępnij Opublikowano 27 Grudnia 2013 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 Więcej opcji udostępniania...
I am Lord Opublikowano 27 Grudnia 2013 Udostępnij Opublikowano 27 Grudnia 2013 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 Więcej opcji udostępniania...
KlivenPL Opublikowano 27 Grudnia 2013 Autor Udostępnij Opublikowano 27 Grudnia 2013 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 Więcej opcji udostępniania...
I am Lord Opublikowano 27 Grudnia 2013 Udostępnij Opublikowano 27 Grudnia 2013 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę