nowy_user Opublikowano 7 Grudnia 2018 Udostępnij Opublikowano 7 Grudnia 2018 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? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 7 Grudnia 2018 Administratorzy Udostępnij Opublikowano 7 Grudnia 2018 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
nowy_user Opublikowano 10 Grudnia 2018 Autor Udostępnij Opublikowano 10 Grudnia 2018 Dzięki za rozjaśnienie sytuacji, teraz już działa Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
unveres Opublikowano 10 Grudnia 2018 Udostępnij Opublikowano 10 Grudnia 2018 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. (pisałem z głowy, więc sprawdź czy działa, bo GMa od dawna nie ruszałem ;)) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 10 Grudnia 2018 Administratorzy Udostępnij Opublikowano 10 Grudnia 2018 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. (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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
unveres Opublikowano 10 Grudnia 2018 Udostępnij Opublikowano 10 Grudnia 2018 Łe jezu rzeczywiście Głupi błąd z mojej strony (czyli jednak tyle lat bez GMa dało o sobie znać ) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę