Skocz do zawartości

Skalowanie obiektów


peterz_pl

Rekomendowane odpowiedzi

Cześć.

 

A więc w swojej grze zrobiłem (myślę, że dość "okrężną drogą") stały panel w opcjami (stały tj. przy przesuwaniu ekranu panel jest cały czas na górze ekranu). Do rysowania zastosowałem draw_sprite_ext, ale aby przycisk był "klikalny", położyłem obiekt na tej samej pozycji:

 

Step:

GML
x=view_xview[0]+6

y=view_yview[0]+6

 

Problem leży jednak w skalowaniu ekranu (przy użyciu rolki przybliżam i oddalam ekran). Przy pomniejszaniu lub powiększaniu ekranu, obiekt zmienia wielkość.

Zgaduję, że można tylko narysować ten przycisk Drawem i zrobić aby był klikalny. But how? ;)

 

img111.png

Odnośnik do komentarza
Udostępnij na innych stronach

Zgadza się, skaluję view. Pomyślałem o image_x(y)scale (czyli oddala się view to obiekt się powiększa i odwrotnie).

 

Co do Draw GUI, to niestety prawdopodobnie nie wiem jak tego użyć, gdyż teraz jest zarówno narysowany obiekt jak i fizycznie za nim też jest widoczny.

 

@EDIT: Aby rysowane obiekty nie zmieniały wielkości, korzystam z przykładu Gnyska: http://www.gmclan.org/index.php?nius=437

 

@EDIT2: Rany.. "if mouse_check_button_pressed(mb_left)" w Draw i tyle w temacie. Dzięki za odp.

Odnośnik do komentarza
Udostępnij na innych stronach

Po prostu tylko GUI wstawiasz do Draw GUI czyli tylko interfejs, resztę do normalnego draw. Wszystko co jest w Draw GUI nie podlega skalowaniu ;) Aha i nie używaj raczej mouse_check_button i innych funkcji po za rysowaniem w evencie draw jeśli nie musisz - obciążasz tylko grafikę, to jest bardzo nie optymalne :/

Odnośnik do komentarza
Udostępnij na innych stronach

@MaxGaming

 

Dzięki, faktycznie działa. A czy jest możliwość wywołania jakiegoś kodu po najechaniu myszką na narysowany obiekt (w tym przypadku guzik)? Np żeby zmienił wartość zmiennej.

 

Próbowałem czegoś w stylu:

GML
if position_meeting(mouse_x,mouse_y,self)

Ale nie zdało egzaminu.

 

Niestety Event Mouse Enter działa chyba tylko na obiekty.

Odnośnik do komentarza
Udostępnij na innych stronach

1. Event mouse ->"Left pressed" ?

 

2.

GML
if(mouse_x >= x1 && mouse_x <= x2 && mouse_y >= y1 && mouse_y <= y2 && mouse_check_button_pressed(mb_left))
?

 

3.

GML
if(place_meeting(mouse_x, mouse_y, obj) && mouse_check_button_pressed(mb_left))
?

 

Wybierz sobie :)

 

E:na nie obiekty pan z numerem 2

Odnośnik do komentarza
Udostępnij na innych stronach

Chodzi teraz głównie o mouse_enter i mouse_leave dla Draw. Nie wiem jak to wytłumaczyć ;]

 

Jeżeli chodzi o opcję #2, również z tego korzystałem i była najbliżej celu, tylko że gdy przybliżam lub oddalam mapę (skaluję view) to znowu punkty x1, x2, y1 i y2 się rozjeżdżają (przez co po najechaniu gdzieś obok guzika zmienia się zmienna). Czy można w tym kodzie zastosować aby pomimo skalowania view x1..y2 były stałe?

 

GML
if(mouse_x >= STAŁEX1 && mouse_x <= STAŁEX2 && mouse_y >= STAŁEY1 && mouse_y <= STAŁEY2)

{

zmienna = 1;

}

 

Zgaduję, że nie zrozumiecie mojej wypowiedzi, sam ledwo ją rozumiem :D

Odnośnik do komentarza
Udostępnij na innych stronach

Ale zależnie od kodu skalowania możesz wyliczyć nowy x i y. Podaj kod skalowania jak nie wiesz jak i Ci pomożemy. Ew.tak jak piszę Amaterasu możesz spróbować. Powinno zdać egzamin, chociaż obawiałbym się osobiście jakiś bugów ewntualnych. Zrobiłbym to "staroszkolnie" np.

GML
x2=szerokosc_sprite*skala;
I dla przykładu:

GML
//x2=szerokosc*skala czyli szerokość to 64, skala 2 więc wysarczy pomnożyć przez skale szerokość

x2=64*2;

Myślę że dostatecznie prosto wyjaśniłem zasadę działania ;)

Odnośnik do komentarza
Udostępnij na innych stronach

To nie to, że idę na łatwiznę, ale nie mam pojęcia jak to połączyć.

 

Create:

GML
global.zoom=1;

zoom_min=.1;

zoom_max=10;

 

base_width=1024;

base_height=768;

 

Step:

GML
if (mouse_wheel_up() && global.zoom<zoom_max)

{

global.zoom+=.1;

event_user(0);

}

 

if (mouse_wheel_down() && global.zoom>zoom_min)

{

global.zoom-=.1;

event_user(0);

}

 

User Defined 0

GML
var _mouse_x,_mouse_y;

_mouse_x=(mouse_x-view_xview)/view_wview;

_mouse_y=(mouse_y-view_yview)/view_hview;

 

view_wview=base_width/global.zoom;

view_hview=base_height/global.zoom;

 

view_xview=mouse_x-view_wview*_mouse_x;

view_yview=mouse_y-view_hview*_mouse_y;

Odnośnik do komentarza
Udostępnij na innych stronach

No to "x2" mnożysz przez "zoom" i tyle filozofii z tym przyciskiem w zasadzie ;)

Tzn:

GML
if(mouse_x >= STAŁEX1 && mouse_x <= STAŁEX2 && mouse_y >= STAŁEY1*zoom && mouse_y <= STAŁEY2*zoom)

{

zmienna = 1;

}

Swoją drogą polskie znaki w nazwie zmiennej to coś czego nie polecałbym jednak :/

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