Skocz do zawartości

Deaktywacja danego obiektu


KlivenPL

Rekomendowane odpowiedzi

Witam, chcę, aby zasłaniany obiekt był automatycznie deaktywowany, a gdy się go odsłoni automatycznie aktywowany. Niestety mam kilkaset takich obiektow, i wszystkie się deaktywują i aktywują razem Jak odnieść się do danego obiektu? (Może odwołać się do ID, ale jak?)

Mam coś takiego:

 

GML
if place_meeting(x,y,obj_klocki) or place_meeting(x,y,obj_klocki_jasne)

{

instance_deactivate_object(obj_klocki_tla);

}

else if !place_meeting(x,y,obj_klocki) or !place_meeting(x,y,obj_klocki_jasne)

{

instance_activate_object(obj_klocki_tla);

}

 

Bardzo proszę o pomoc.

 

PS. Dodam jeszcze, ze ten skrypt mam w obiekcie-matce, do ktorej parentowane sa inne obiekty.

Odnośnik do komentarza
Udostępnij na innych stronach

Problem jest taki że ze dezaktywowanymi obiektami nie możesz sprawdzać kolizji. Opisz lepiej sytuację. Czy obiekty są wyrównane do siatki? Czy poruszają się swobodnie? Czy często się zasłaniają?

Odnośnik do komentarza
Udostępnij na innych stronach

Po 1 nie dezaktywuj obiektów a instance, bo dezaktywujesz wszystkie instance tego typu (obiektu).

Po 2 dezaktywowany instance nie wywołuje eventów więc nie możesz wykonać w nim żadnego kodu.

 

No to być może wystarczy żę zrobisz tak:

Stwórz nowy obiekt który będzie kontrolował dezaktywację obiektów

GML (Begin Step)
instance_activate_all()

with(obj_klocki_tla)

{

if place_meeting(x,y,obj_klocki) or place_meeting(x,y,obj_klocki_jasne)

{

instance_deactivate_object(id); //id czyli aktualny klocek

}

}

 

Jeżeli to nie zadziała to będziesz musiał przeiterować przez wszystkie instance używając instance_find()

 

Oczywiście w grze takiego rodzaju jaki robisz to co podałem nie jest zbyt dobrym pomysłem. Powinieneś robić na odwrót: dezaktywować wszystko, aktywować potrzebne obiekty (gracz, kontrolery), aktywować wszystko w zasięgu view, dezaktywować co nie potrzebne.

Odnośnik do komentarza
Udostępnij na innych stronach

Po 1 nie dezaktywuj obiektów a instance, bo dezaktywujesz wszystkie instance tego typu (obiektu).

Po 2 dezaktywowany instance nie wywołuje eventów więc nie możesz wykonać w nim żadnego kodu.

 

No to być może wystarczy żę zrobisz tak:

Stwórz nowy obiekt który będzie kontrolował dezaktywację obiektów

GML (Begin Step)
instance_activate_all()

with(obj_klocki_tla)

{

if place_meeting(x,y,obj_klocki) or place_meeting(x,y,obj_klocki_jasne)

{

instance_deactivate_object(id); //id czyli aktualny klocek

}

}

 

Jeżeli to nie zadziała to będziesz musiał przeiterować przez wszystkie instance używając instance_find()

 

Oczywiście w grze takiego rodzaju jaki robisz to co podałem nie jest zbyt dobrym pomysłem. Powinieneś robić na odwrót: dezaktywować wszystko, aktywować potrzebne obiekty (gracz, kontrolery), aktywować wszystko w zasięgu view, dezaktywować co nie potrzebne.

 

 

Aha, dzięki, ale czy jest jakiś inny sposób, aby gra się tak nie cięła niż dezaktywowanie klocków i usuwanie ich widzialności? (zrobiłem, że gdy jest kolizja z obiektem, to visible = false;.

Odnośnik do komentarza
Udostępnij na innych stronach

Musisz brać pod uwagę ile kodu wykonuje się w każdym step. Jeżeli masz na ekranie 20 obiektów ale każdy ma w sobie pętlę for(i=0;i<100;i+=1) to ten kawałek wykona się 2000 razy!

 

visible = false tylko wyłącza rysowanie, więc reszta kodu cały czas się wykonuje.

 

Jeżeli wykonujesz jakiś kod zależnie od tego jakie bloczki otaczają aktualny, to możesz spróbować updateować ten blok tylko gry jakiś z jego sąsiadów się zmienił. Tak robi Minecraft.

 

Optymalizacja nie jest prosta i nie ma gotowych przepisów. Trzeba się wszystkiego samemu nauczyć i kombinować, bo to co pomoże w jednej sytuacji w drugiej okaże się totalną klapą.

Odnośnik do komentarza
Udostępnij na innych stronach

nieczytalem dokladnie o co ci chodzi(i niechce sie teraz domyslac), ale dle dalszych postow proponuje pomyslec nad algorytmem ktory by:

- testowal caly screen z 1 instancji, ale tylko 1x . mozna wtedy cesto podzielic screen na segmenty ktore nietrza testowac i jesce zmiejsyc czas wykonywania kodu

- niezawse jest powinny deaktiwowac instancje.

-- jezeli jej nietrzeba to destroy

-- jezeli ma sie znow pojawic to visible=false lub zmiana depth zamiast deaktivate

- jezeli skryty blok ma byc tlo, to dlaczego go niewytwarzac az w dobie zniscenia bloku ktory go zaslanial? mozna tu uzyc file_

-- mozna wtedy pomyslec o wirtualnych testach. kody blokow so v datowej strukturze i testy tylko liczo id z tej struktury, nietrza vogule testowac instancje

 

jezeli bedzies chciec miec swiat 50000x50000 blokow to cos takiego bedzie trza :thumbsup:

Odnośnik do komentarza
Udostępnij na innych stronach

ale visible wyłącza wykonywanie eventu Draw a zmiana depth nic nie da oprócz zmiany kolejności.
tak, wiem i sugeruje, ze mozna pomyslec o innym rozwiozaniu niz deaktywacja za kazdo cene.

tym niemowie ze deaktywacja jest zla, tylko musi sobie dobrze pokombinowac co i jak.

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