Skocz do zawartości
  • 0
nowy_user

Jak zrobić sprytną pętlę?

Pytanie

Cześć, zastanawiam się nad zrobieniem sprytnej pętli która obejmowałaby kilka obiektów tego samego typu ( potencjalnie nieskończoną ilość). Głowie się nad tym już od kilku godzin i niestety nie potrafię wymyślić eleganckiego rozwiązania... oczywiście mogę to wykonać naokoło, umieszczając trochę kodu w Evencie Step, ale wiecie, staram się to oganiczać aby program nie zamulał. Już wyjaśniam o co chodzi:

 

Mam obiekt o nazwie Obj_kwadrat . Tych obiektów na planszy jest ok 15 - 20 , ale mam możliwość tworzenia nowych lub kasowania starych, więc liczba się zmienia. Obiekty te mogą być ze sobą powiązane, tak że jeden jest podrzędny do drugiego, drugi do trzeciego itp. Tworzy się zatem taka hierarchia.  Do tego celu, Obj_kwadrat ma zadeklarowaną zmienną :  inferiorTo=0  . W takiej sytuacji, gdy inferiorTo=0 to nie ma on żadnego innego Obj_kwadrat nad sobą w hierarchii . Jeśli jednak jego zmienna inferiorTo=( id innego Obj_kwadrat) to wtedy jest podrzędny do tego kwadratu z tym id.  Oprócz tego każdy Obj_kwadrat ma zmienną click, która może być 0 lub 1, w tym momencie nie jest ważne za co jest odpowiedzialna ta zmienna.

 

Chciałbym  aby po kliknięciu lewym przyciskiem myszy w Obj_kwadrat wykonał on następującą akcję w Evencie: Mouse button pressed (Left):

 

Cytuj


if instance_exists(inferiorTo)

with (inferiorTo) click=1

 

 

i teraz chciałbym, aby ten sam kod był wykonany dla następnego Obj_kwadrat którego ID jest takie samo jak zmienna inferiorTo, i tak to zapętlić do czasu, gdy któryś z tych obiektów  ma w zmiennej inferiorTo=0

 

 

Czy mogę to zrobić jakąś sprytną pętlą?

 

Oczywiście mogę to zrobić naokoło i napisać coś takiego:

Cytuj

 

if instance_exists(inferiorTo)

with (inferiorTo) click=1;

 

if instance_exists(inferiorTo).inferiorTo

with (inferiorTo).inferiorTo click=1;

 

if instance_exists(!inferiorTo).inferiorTo).inferiorTo

with ((inferiorTo).inferiorTo)inferior.to click=1;

 

 

i tak jeszcze możnaby pisać godzinę, zważywszy na to, że hierarchia może mieć potencjalnie nieskończoną ilość stopni, sami widzicie, że lepiej to rozwiązać jakąś pętlą...

 

Jakieś pomysły?

 

 

 

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

5 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Załóżmy, że masz 10 obiektów w hierarchi. Rozumiem, że każdy ma numerek od 1 do 10. (albo 0 - 9). Czy zawsze kasujesz ostatni, czy też ze środka?

 

Jeśli kasujesz ostatni, to robisz dwie zmienne:

global.ilosc_kwadratow = 0; global.kwadraty = [];

i jak tworzysz kwadrat to robisz: global.kwadraty[global.ilosc_kwadratow] = instance_create_layer(0,0,kwadrat,"layer"); global.ilosc_kwadratow++;

i potem zwykły for od 0 do global.ilosc_kwadratow załatwia sprawę :) Oczywiście kasując zmieniasz tylko global.ilosc_kwadratow--;

 

Jeśli możesz kasować te ze środka, no to musisz dorobić obsługę przesuwania elementów tablicy.

 

Jeśli jednak jeden kwadrat może mieć kilka dzieci, no to sprawa się nieco bardziej komplikuje. Ale wtedy wystarczy, że każdy kwadrat ma lokalną tablicę ilosc_kwadratow = [] i zapisuje wszystkie swoje dzieci i też jakoś z tego wybrniesz - oczywiście to dużo więcej kodu do napisania.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Mi się takie rozwiązanie wydaje dosyć intuicyjne:

x = inferiorTo;

while (instance_exists(x)) {
  x.inferiorTo.click = 1;
  x = x.inferiorTo;
}

Nie musisz iterować po wszystkich obiektach tylko po tych w hierarchii, więc wychodzi nieco optymalniej. :P

(pisałem z głowy, więc sprawdź czy działa, bo GMa od dawna nie ruszałem ;))

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Teraz, unveres napisał:

Mi się takie rozwiązanie wydaje dosyć intuicyjne:


x = inferiorTo;

while (instance_exists(x)) {
  x.inferiorTo.click = 1;
  x = x.inferiorTo;
}

Nie musisz iterować po wszystkich obiektach tylko po tych w hierarchii, więc wychodzi nieco optymalniej. :P

(pisałem z głowy, więc sprawdź czy działa, bo GMa od dawna nie ruszałem ;))

 

Jak do X przypiszesz, to zmieni się pozycja :) Ale faktycznie, wygląda, że ma to sens, tak długo jak to jest hierarchia 1-1-1-1... i "inferiorTo" ma id instancji, nie nazwę obiektu.

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

×