Exigo Opublikowano 26 Lutego 2012 Udostępnij Opublikowano 26 Lutego 2012 Niektóre gry mają fajny sposób informowania gracza o pozycji obiektu, celu, czegokolwiek ważnego, mimo że nie widzimy tego "w rzeczywistości" (tzn. jest poza ekranem). Dobrym przykładem było by przytoczenie GTA, gdzie strzałeczki pokazywały kierunek do głównych celi znajdując się wokół gracza. Mi natomiast chodzi o reprezentację w taki sposób, aby symbole pokazywane były na krawędzi, nie w kole, ale dostosowując się do rozmiaru i proporcji okna. Tzn. w pewnym sensie "punkt dążący od środka ekranu, do celu, zatrzymywany przez krawędź okna". Rozrysowałem to mniej więcej tak: Jakiś pomysł, jak to napisać? ; ) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Tymon Opublikowano 26 Lutego 2012 Udostępnij Opublikowano 26 Lutego 2012 Tak na szybko. GML cx = room_width / 2; cy = room_height / 2; tx = mouse_x; ty = mouse_y; dir = point_direction( cx, cy, tx, ty ); dis = point_distance( cx, cy, tx, ty ); draw_sprite( sprite, 0, cx + max( -cx, min( cx, lengthdir_x( dis, dir ) ) ), cy + max( -cy, min(cy, lengthdir_y( dis, dir ) ) ), ); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Platyna Opublikowano 26 Lutego 2012 Udostępnij Opublikowano 26 Lutego 2012 Tymuś, Tymuś! Wyobraź sobie, że się mylisz, zły człowieku. Nie możesz obliczać pozycji x i y niezależnie od siebie. Jeśli ogranicza nas przykładowo prawa krawędź to przesunięcie w y też trzeba odpowiednio skrócić. Nie ma rady. Trzeba ifnąć przypadki, która krawędź nas ogranicza, albo sprawdzić czy bardziej przeskalowało w x czy w y i w ten sam sposób przeskalować drugą współrzędną. Uno momento... EDIT: Tadam! GML cx = room_width / 2; cy = room_height / 2; tx = mouse_x; ty = mouse_y; dir = point_direction( cx, cy, tx, ty ); dis = point_distance( cx, cy, tx, ty ); dx = lengthdir_x( dis, dir ); dy = lengthdir_y( dis, dir ); d2x = max(-cx, min(cx, dx)); d2y = max(-cy, min(cy, dy)); if(dx == 0) scale = d2y/dy; else if(dy == 0) scale = d2x/dx; else scale = min(d2x/dx, d2y/dy); newx = cx+scale*dx; newy = cy+scale*dy; draw_arrow( cx, cy, newx, newy, 5); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Tymon Opublikowano 26 Lutego 2012 Udostępnij Opublikowano 26 Lutego 2012 Ano, racja. To już chyba czyste lenistwo z mojej strony, że nie pomyślałem o tym. I nie jestem zły. 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ę