Skocz do zawartości

Przestawianie instancji


Riot

Rekomendowane odpowiedzi

Chciałem zrobić tak, że jeśli kliknie się LPM na danej instancji to podświetla się ona na zielono. Potem, jeśli znów się na nią kliknie to się odświetla. A jeśli jest podświetlone i kliknie się gdzieś poza instancją, to ta się przenosi tam gdzie się kliknie.

 

Kod:

GML
{

var inst;

 

inst=(100003);

if (mouse_check_button_pressed(mb_left))

{

 

//================================================================================

===========================

if ( ( mouse_x < inst.x ) || ( mouse_x > inst.x+32 ) || ( mouse_y < inst.y ) || ( mouse_y > inst.y+64 ) )

{

 

if ( inst.stan == 1 )

{

 

inst.x=mouse_x-16;

inst.y=mouse_y-32;

inst.image_blend=c_white;

inst.stan=0;

 

};

 

 

 

};

//================================================================================

===========================

 

//================================================================================

===========================

if ( (mouse_x > inst.x) && (mouse_x < inst.x+32) && (mouse_y > inst.y) && (mouse_y < inst.y+64) )

{

 

if ( inst.stan == 1 )

{

 

inst.image_blend=c_white;

inst.stan=0;

 

};

if ( inst.stan == 0 )

{

 

inst.image_blend=c_green;

inst.stan=1;

 

};

 

 

 

};

//================================================================================

===========================

 

};

}

 

Problemy:

-po pierwszym kliknięciu na instancję wszystko jest ok jednak gdy kliknę drugi raz nie odświetla się ani zmienna stan nie zmienia wartości

-po podświetleniu i kliknięciu gdzieś na wolnym miejscu instancja się przenosi ale nie odświetla się a zmienna stan nie zmienia wartości

 

 

Dodatkowo mam kilka pytań:

-Czy zamiast podświetlania da się po prostu zmienić grafikę danej instancji?

-W moim kodzie warunki na sprawdzenie czy mysz jest nad obiektem są dobre dla prostokąta, czy dałoby się coś zrobić dla obiektów mniej regularnych, o mniej przewidywalnych kształtach (gwiazdki, wielokąty itp)

Odnośnik do komentarza
Udostępnij na innych stronach

po pierwszym kliknięciu na instancję wszystko jest ok jednak gdy kliknę drugi raz nie odświetla się ani zmienna stan nie zmienia wartości

GML
if ( inst.stan == 1 )

{

 

inst.image_blend=c_white;

inst.stan=0;

 

}

else

if ( inst.stan == 0 )

{

 

inst.image_blend=c_green;

inst.stan=1;

 

}

Odnośnik do komentarza
Udostępnij na innych stronach

Czemu ustawiasz id na instancję ??

 

GML
if mouse_check_pressed(mb_left)

{

if inst and not collision_point(mouse_x,mouse_y,inst,1,1)

{

inst.x=mouse_x;

inst.y=mouse_y;

inst.image_blend=c_white;

inst=-1;

}

else if collision_point(mouse_x,mouse_y,obj,1,1)

{

inst=collision_point(mouse_x,mouse_y,obj,1,1);

inst.image_blend=c_green;

}

}

 

Teraz nie potrzebna jest zmienna stan, a przechowywanie ID w zmiennej pozwoli ci na operowanie danym typem instancji.

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki za pomoc.

 

Łącząc wasze odpowiedzi i dodają trochę od siebie stworzyłem takie coś:

 

GML
{

if (mouse_check_button_pressed(mb_left))

{

//================================================================================

===========================

if ( global.inst and not collision_point(mouse_x,mouse_y,global.inst,1,1) )

{

if ( global.inst.image_blend == c_green )

{

global.inst.x=mouse_x-16;

global.inst.y=mouse_y-32;

global.inst.image_blend=c_white;

global.inst=0;

}

}

//================================================================================

===========================

else

//================================================================================

===========================

if ( collision_point(mouse_x,mouse_y,global.inst,1,1) )

{

 

if ( global.inst and global.inst.image_blend == c_green )

{

 

global.inst.image_blend=c_white;

global.inst=0;

 

}

else

if ( instance_position(mouse_x,mouse_y,object0).image_blend == c_white )

{

 

global.inst=instance_position(mouse_x,mouse_y,object0)

global.inst.image_blend=c_green;

 

}

 

 

 

}

//================================================================================

===========================

}

 

}

 

I wygląda na to, że spełnia moje wymagania. Jeszcze raz dzięki.

Odnośnik do komentarza
Udostępnij na innych stronach

może ci wywalać errory. W linijce z else if masz wcześniej warunek z global.inst

Jeżeli global.inst będzie = 0, to else zadzaiała, a tam masz sprawdzanie wartości zawartej w global.inst ... W tym momencie BOOM!

 

 

Chodzi ci o:

 

GML
if ( collision_point(mouse_x,mouse_y,global.inst,1,1) )

 

Czy o:

 

GML
if ( global.inst and global.inst.image_blend == c_green )

 

?

 

W każdym razie, mam na mapie obiekt który po utworzeniu ustawia global.inst na 0 właśnie. Czy to wystarczy?

Odnośnik do komentarza
Udostępnij na innych stronach

niet.

 

masz:

GML
if ( global.inst and not collision_point(mouse_x,mouse_y,global.inst,1,1) )

Po czym:

GML
else if ( collision_point(mouse_x,mouse_y,global.inst,1,1) )

 

z tego wynika, że jeśli będzie kolizja myszki z ową instancją, bądź zmienna global.inst będzie mniejsza równa zeru, to sprawdzi kolizję myszy z instancją, której ID jest zapisane global.inst.

 

W wypadku gdy wychodzi ta pierwsza opcja, to sprawdzi kolizję z instancją, dla której ID=0. Jak wiemy, ID instancji zaczynają się od 10000 (albo 100000, nie pamiętam). Czy istnieje instancja z ID=0 ? NIE! I tutaj wywala errora.

 

MOJA RADA:

GML
else if ( collision_point(mouse_x,mouse_y,global.inst,1,1) )

// ZAMIEŃ NA

else if (global.inst and collision_point(mouse_x,mouse_y,global.inst,1,1))

Odnośnik do komentarza
Udostępnij na innych stronach

@Mentoss - źle.

GML
else if (global.inst and collision_point(mouse_x,mouse_y,global.inst,1,1))

też może wywalić errora, gdyż w przeciwieństwie do większości języków programowania, GML sprawdza każdy warunek, nawet jeśli już wykluczona została możliwość inicjowania kodu.

Tak naprawdę powinno być:

GML
else if(global.inst)

if(collision_point(mouse_x,mouse_y,global.inst,1,1))

{

kod

}

Odnośnik do komentarza
Udostępnij na innych stronach

Hmmm, wyszło mi coś takiego:

 

GML
{

//================================================================================

===========================

if (mouse_check_button_pressed(mb_left))

{

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++

if ( global.inst )

{

 

if ( not collision_point(mouse_x,mouse_y,global.inst,1,1) and global.inst.image_blend == c_green )

{

global.inst.x=mouse_x-16;

global.inst.y=mouse_y-32;

global.inst.image_blend=c_white;

global.inst=0;

}

 

if ( global.inst.image_blend == c_green and collision_point(mouse_x,mouse_y,global.inst,1,1) )

{

global.inst.image_blend=c_white;

global.inst=0;

}

 

}

else

if ( collision_point(mouse_x,mouse_y,instance_position(mouse_x,mouse_y,object0),1,1) )

{

 

if ( instance_position(mouse_x,mouse_y,object0).image_blend == c_white )

{

global.inst=instance_position(mouse_x,mouse_y,object0);

global.inst.image_blend=c_green;

}

 

}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++

 

}

//================================================================================

===========================

}

 

 

Może być?

Odnośnik do komentarza
Udostępnij na innych stronach

@Mentoss - Zauwaz ze instancja nie jest polskim slowem do angielskiego slowa instance, i dlatego prosze nie przyzwyczajaj sie do niego. Mozliwe ze kiedys bedziesz chcial tlumaczyc jakies tutoriale czy cos i bedziesz wszedzie pisal instancja. Ciezko to zrozumiec. Z tego co wiem instancja nawet oznacza po polsku cos kompletnie innego.

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