Ice Cube Opublikowano 18 Listopada 2018 Udostępnij Opublikowano 18 Listopada 2018 Mam pytanko jak adresować zmienne,proszę o obszerny wykład jak z jednego obiektu zmieniac zmienne w drugim tzn. przykład: obiekt pocisk ma zmienną z,gdy koliduje z potworem pojawia się instancja krew na wysokości z i jak próbuje by obiekt krew miał zmienna z taką jak aktualnie pocisk to pojawia sie komunikat unknown variable z ;/ nie wiem czy to dobrze napisałem Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
exp Opublikowano 18 Listopada 2018 Udostępnij Opublikowano 18 Listopada 2018 zamiast z napisz other.z (albo o_NazwaObiektu.z) Ice Cube 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 19 Listopada 2018 Udostępnij Opublikowano 19 Listopada 2018 Cześć, mi to wygląda na to, że Twój obiekt obj_krew nie ma zmiennej 'z'. Zmienne przeważnie tworzy się w Create Event, bo jest to event, który jest wykonywany wraz z funkcją instance_create i potem te zmienne są dostępne w referencjach na instancję zaraz po jej stworzeniu (np. "other.zmienna = 10", czy "var inst=instance_create(x,y,obj_krew); inst.zmienna = 10"). Artykułów dot. zmiennych na GMClan jest kilka, np. https://gmclan.org/index.php?czytajart=30 , przejrzyj listę artykułów na stronie https://gmclan.org/index.php?artykuly=17 mogą Ci się przydać w zrozumieniu zmiennych, argumentów, funkcji, operacji na nich itd. EDIT: v Ice Cube 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rozwiązanie I am Lord Opublikowano 19 Listopada 2018 Rozwiązanie Udostępnij Opublikowano 19 Listopada 2018 Cytuj proszę o obszerny wykład No to się robi Różnie można adresować, to też zależy w którym evencie to robisz. Ogólnie są dwie formy adresowania, pierwsza formą jest adresowanie podając pojedynczą kropkę a druga forma to użycie keyword with W obu przypadkach podajesz nazwę obiektu albo id instancji albo keyword other/self np: obj_mojObiekt.z inst_4DB70D2.z // (w GMS2) (100012).z // (w GMS1 i niżej) other.z self.z za pomocą formy obj_mojObiekt.z odnosisz się do wszystkich instancji o nazwie podanego obiektu, dlatego w tej formie jest to mało użyteczne. Bo gdybyś chciał odczytać zmienną 'z' to odczytałoby ci zmienną z instancji o największym id ze wszystkich obiektów tej nazwy dlatego że GM próbował by kolejno 'zaglądać' do każdej takiej instancji więc nadpisywał by wynik tak długo aż zostanie mu ostatnia i zwróci wartość właśnie tej ostatniej instancji. Ta forma ma większy użytek gdy chcesz zmienić zmienną we wszystkich obiektach tej nazwy jednocześnie np: obj_mojObiekt.z = 100 // i teraz każdy obiekt obj_mojObiekt ma 'z' o wartosci 100 to samo działanie z użyciem with wygląda następująco: with (obj_mojObiekt) { z = 100 } gdybyś jednak chciał użyć with do odczytania zmiennej 'z' to sprawa się komplikuje, zrobiłbyś to na dwa sposoby: // sposób pierwszy var tymczasowaZmienna; with (obj_mojObiekt) { tymczasowaZmienna = z } show_debug_message(tymczasowaZmienna) // konsola wyswietli wartość 'z' // sposób drugi jakasZmiennaLokalna = 0 with (obj_mojObiekt) { other.jakasZmiennaLokalna = z } // przypisałeś wartość zmiennej jakasZmiennaLokalna do wartosci 'z' obiektu obj_mojObiekt Jednak to tylko jest mało użyteczne adresowanie po nazwie obiektu, dużo bardziej użyteczne jest adresowanie bezpośrednio po id instancji ale takie id najpierw trzeba znać. Musisz sobie zwracać uwagę na to jakie funkcje zwracają id instancji, do tych najpopularniejszych należą instance_create(x, y, obj); instance_create_depth(x, y, depth, obj); // tylko dla GMS2 instance_create_layer(x, y, layer_id, obj); // tylko dla GMS2 instance_nearest(x, y, obj); // grupa funkcji z kolizji wykrywania kolizji: collision_*(); // np. collision_circle( x1, y1, rad, obj, prec, notme ); Tak więc, podam kilka praktycznych przykładów: 1. // EVENT STEP var ID; ID = instance_nearest(x, y, obj_skrzynka); show_debug_message(ID.z) // konsola zacznie wyświetlać wartość 'z' skrzynki do której jesteś najbliżej 2. // EVENT STEP var ID; ID = collision_circle( x, y, 128, obj_skrzynka, 0, true ); if (ID != noone) { show_debug_message(ID.z) // konsola zacznie wyświetlać wartość 'z' skrzynki która jest w zasięgu okręgu } /* ten if jest tutaj potrzebny poniważ funkcje collision_* zwracają także keyword noone w przypadku gdy do kolizji nie dojdzie w dodatku gdy w zasięgu jest więcej skrzynek to odczyta wartość z instancji o najwyższym id czyli tego obiektu który ostatni nadpisze zmienną ID*/ 3. // EVENT PRZYCISKU STRZAŁU var ID; ID = instance_create(x, y, obj_bullet); ID.z = z+64; /* nowo utworzona instancja obiektu pocisków: obj_bullet będzie miała na start przypisaną wartość 'z' do wartości 'z' gracza + wysokość gdzie znajduje się pistolet*/ Kolejną najciekawszą sprawą adresowania zmiennych jest użycie keywordu other Jak mogłeś wcześniej zobaczyć, użyłem słówka other wewnątrz with, w tym przypadku other będzie miało wartość id instancji z którego wywołujesz with. Jednak gdyby użyć other w którymś z eventów kolizji to wtedy other przyjmuje wartość id instancji z którą kolizja nastąpiła i tutaj mogę np podać przykład niszczenia się pocisku o ścianę z którą się zderza, będzie to wyglądało tak: // EVENT COLLISION WITH obj_sciana if (z > other.z && z <other.z+other.wysokosc_sciany) { instance_destroy(); } Ice Cube, Uzjel i Konrad-GM 3 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 21 Listopada 2018 Autor Udostępnij Opublikowano 21 Listopada 2018 Dzięki za odpowiedzi,ale nie obędzie się bez dodatkowych pytań oczywiście jak gm interpretuje te adresowanie zmiennych tzn. obj pocisk/kolizja z potworem / code : z=10 komu gm przypisze z=10 pociskowi,czy potworowi? j Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 21 Listopada 2018 Udostępnij Opublikowano 21 Listopada 2018 Jeżeli w obiekcie obj_pocisk, stworzysz event Collision Event z obiektem obj_wrog, to ten kod: z = 10; Będzie dotyczyć instancji obiektu, w którym ten event (kod eventu) jest wykonywany. W tym wypadku będzie to instancja obiektu obj_pocisk. Aby odwołać się do instancji obiektu obj_wrog, używasz referencji other, tj. other.z = 10; Dodatkowo, w GM jak edytujesz skrypt, to w belce edycji jest taka opcja jak Applies To. Jeżeli zaznaczysz np. opcję Other, to cały kod będzie objęty tak jakby blokiem with: with(other) { <kod_skryptu> } Nie polecam tej opcji, utrudnia tylko czytanie kodu, także warto mieć to na uwadze, żeby z tej opcji nie korzystać. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 21 Listopada 2018 Autor Udostępnij Opublikowano 21 Listopada 2018 14 minut temu, Konrad-GM napisał: Jeżeli w obiekcie obj_pocisk, stworzysz event Collision Event z obiektem obj_wrog, to ten kod: z = 10; Będzie dotyczyć instancji obiektu, w którym ten event (kod eventu) jest wykonywany. W tym wypadku będzie to instancja obiektu obj_pocisk. Aby odwołać się do instancji obiektu obj_wrog, używasz referencji other, tj. other.z = 10; Dodatkowo, w GM jak edytujesz skrypt, to w belce edycji jest taka opcja jak Applies To. Jeżeli zaznaczysz np. opcję Other, to cały kod będzie objęty tak jakby blokiem with: with(other) { <kod_skryptu> } Nie polecam tej opcji, utrudnia tylko czytanie kodu, także warto mieć to na uwadze, żeby z tej opcji nie korzystać. a jezeli zrobie obj pocisk/kolizja z potworem / code with(other){z=10} // z potwora =10 w=15 // w ? te w=15 już nie bedzie dotyczyc potwora?,czy musze dodac self.w=15 chodzi o to,że czasem skacze w kodzie między obiektami i wtedy pojawiają mi się błędy próbuje zrozumieć jak gm to wszystko interpretuje Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 21 Listopada 2018 Udostępnij Opublikowano 21 Listopada 2018 w = 15 będzie dotyczyć obj_pocisku W każdym event collision other oznacza id instancji z którą się zderzyłeś Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 22 Listopada 2018 Autor Udostępnij Opublikowano 22 Listopada 2018 18 godzin temu, I am Lord napisał: w = 15 będzie dotyczyć obj_pocisku W każdym event collision other oznacza id instancji z którą się zderzyłeś aha a co jeżeli w tym evencie collision pocisku będzie instance_create(x,y,obj_wybuch);z=5 czyli kolejny obiekt -wybuch z będzie przypisane do czego? do pocisku,czy do wybuchu? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 22 Listopada 2018 Udostępnij Opublikowano 22 Listopada 2018 2 godziny temu, Ice Cube napisał: aha a co jeżeli w tym evencie collision pocisku będzie instance_create(x,y,obj_wybuch);z=5 czyli kolejny obiekt -wybuch z będzie przypisane do czego? do pocisku,czy do wybuchu? Dnia 19.11.2018 o 16:22, I am Lord napisał: (...) Jednak to tylko jest mało użyteczne adresowanie po nazwie obiektu, dużo bardziej użyteczne jest adresowanie bezpośrednio po id instancji ale takie id najpierw trzeba znać. Musisz sobie zwracać uwagę na to jakie funkcje zwracają id instancji, do tych najpopularniejszych należą (...) 3. // EVENT PRZYCISKU STRZAŁU var ID; ID = instance_create(x, y, obj_bullet); ID.z = z+64; /* nowo utworzona instancja obiektu pocisków: obj_bullet będzie miała na start przypisaną wartość 'z' do wartości 'z' gracza + wysokość gdzie znajduje się pistolet*/ Mam wrażenie, że nie przeczytałeś tego co napisał @I am Lord Średnik ';' służy tylko do oddzielania wyrażeń, także jeżeli napiszesz dwa wyrażenia w jednej linii oddzielając je średnikiem, to nie ma to żadnego znaczenia, poza formatowaniem kodu. Także w Twoim przypadku zmienna 'z' będzie zmieniona w instancji obiektu obj_pocisk. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 22 Listopada 2018 Autor Udostępnij Opublikowano 22 Listopada 2018 ok juz mam prawie wszystko co chciałem wiedzieć,ale jeszcze zostaje to .SELF jak idzie to zastosować i po co to jest?? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 22 Listopada 2018 Udostępnij Opublikowano 22 Listopada 2018 3 godziny temu, Ice Cube napisał: ok juz mam prawie wszystko co chciałem wiedzieć,ale jeszcze zostaje to .SELF jak idzie to zastosować i po co to jest?? W większości przypadków self praktycznie Ci się nie przyda, osobiście sam nie stosowałem tego rodzaju odwołania i nie potrafię powiedzieć, do czego byłoby to użyteczne, ponieważ i tak blok kodu jest wykonywany w kontekście self. Ice Cube 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 22 Listopada 2018 Udostępnij Opublikowano 22 Listopada 2018 Fakt, niepotrzebnie wspomniałem o self bo sam go nie użyłem ani razu w życiu Także nim sobie głowy nie zaprzątaj. Ice Cube 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 23 Listopada 2018 Autor Udostępnij Opublikowano 23 Listopada 2018 haha ok juz niemam więcej pytań ,po raz kolejny dzięki za odpowiedzi Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kosmonauta Opublikowano 16 Kwietnia 2019 Udostępnij Opublikowano 16 Kwietnia 2019 Witam. To mój pierwszy post. Nie chciałem zakładać nowego wątku ponieważ przeszukując forum ten wydawał mi się najbardziej związany z moim problemem, który jest następujący. Mam obiekt który losowo wybiera liczby z pewnego zbioru. Są to tablice ze współrzędnymi X oraz Y. Na podstawie tych danych tworzy instancję obiektu powiedzmy o_gwiazda. Powiela i rozsiewa losowo te gwiazdy po ekranie. Problem polega na tym, że chciałbym aby po najechaniu kursorem na taką gwiazdę wyświetliła mi się jego współrzędna. Owszem wyświetla mi się współrzędne ale jest to zawsze, pierwsza para X,Y z tablic. Podejrzewam, że ma to związek z adresowaniem i id instancji. Obiekt o_gwiazda jest goły zawiera tylko spritea. Podejrzewam, że tam powinienem coś wpisać np że po kolizji z kursorem wyświetli współrzędne tego kursora ale wydaje mi się, że to taki półśrodek. Potrzebuje tylko wskazówki gdzie mam szukać, pokarzcie mi kierunek gdzie mam iść. Dzięki Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 16 Kwietnia 2019 Udostępnij Opublikowano 16 Kwietnia 2019 Cześć, możesz użyć funkcji instance_place w obiekcie nadrzędnym np. o_dashboard (o mniejszym Depth, żeby zawsze rysowało tekst na pierwszym planie). Funkcja ta zwraca ID instancji pod danymi współrzędnymi X,Y - mogą to być też współrzędne kursora. Można cały kod zamieścić w Draw Event obiektu o_dashboard: var inst = instance_place(mouse_x, mouse_y, o_gwiazda); if (inst != noone) { draw_set_halign(fa_center); draw_set_valign(fa_bottom); var text = 'Star at ' + string(inst.x) + ', ' + string(inst.y); draw_text_colour(inst.x, inst.y - 16, text, c_white, c_white, c_white, c_white, 1.0); draw_set_valign(fa_top); draw_set_halign(fa_left); } Jeżeli obiekty o_gwiazda nie mogą mieć z jakiegoś powodu większej maski (żeby nie musieć precyzyjnie myszką nakierowywać), to możesz użyć funkcji instance_nearest w ten sposób: var inst = instance_nearest(mouse_x, mouse_y, o_gwiazda); if (inst != noone && point_distance(mouse_x, mouse_y, inst.x, inst.y) < 10.0) { draw_set_halign(fa_center); draw_set_valign(fa_bottom); var text = 'Star at ' + string(inst.x) + ', ' + string(inst.y); draw_text_colour(inst.x, inst.y - 16, text, c_white, c_white, c_white, c_white, 1.0); draw_set_valign(fa_top); draw_set_halign(fa_left); } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kosmonauta Opublikowano 16 Kwietnia 2019 Udostępnij Opublikowano 16 Kwietnia 2019 Super. Dzięki bardzo. Działa, ten drugi sposób jest ok dla takich małych punktów. Już chyba wiem gdzie popełniałem błąd. 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ę