Skocz do zawartości
peterz_pl

Skalowanie obiektów

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeżeli to studio to po prostu walnij do w event "Draw GUI" zamiast "Draw". Jeżeli 8.1 to już musisz wyliczać wielkość, ale żeby Ci więcej powiedzieć muszę wiedzieć w jaki sposób skaluje to. Po prostu skalujesz view, czy jak?

Udostępnij tego posta


Odnośnik do posta
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.

Udostępnij tego posta


Odnośnik do posta
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 :/

Udostępnij tego posta


Odnośnik do posta
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.

Udostępnij tego posta


Odnośnik do posta
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

Udostępnij tego posta


Odnośnik do posta
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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Możesz korzystać z window_mouse_get_x/y()*, niezależnie od zooma zwróci pozycję myszy w osi X/Y relatywnie do lewego górnego rogu okna gry, nie do pozycji (0,0) w samej grze.

*albo window_get_mouse_x/y(), nie pamiętam

Udostępnij tego posta


Odnośnik do posta
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 ;)

Udostępnij tego posta


Odnośnik do posta
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;

Udostępnij tego posta


Odnośnik do posta
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 :/

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×