Skocz do zawartości

Różne wartości dla poszczegłonych instancji obiektu.


Barsztik

Rekomendowane odpowiedzi

Hej.

 

Napotkałem problem, którego rozwiązanie musi być proste, ale nie potrafię go znaleźć.

Jak sprawić by poszczególnym instancjom danego obiektu przypisać różne wartości, czyli de facto potrzebuję wyłuskać numer konkretnej instancji obiektu?

 

Stworzyłem więc nowy plik "grę", który służy tylko do przedstawienia problemu. W nim jeden domyślny wymagany room oraz jeden obiekt obj_npc.

 

W obiekcie obj_npc dodałem event Draw a w nim taki kod:

draw_text(x,y, instance_id);

 

W roomie wstawiłem 5 razy obiekt obj_npc.

 

Po odpaleniu gry w miejscach obiektów pojawia się wszędzie -4.

 

Co powinienem wpisać w:

draw_text(x,y, ????????????????????????????);

by w miejscach obiektów pojawiły się liczby 1,2,3,4 i 5 zgodnie z kolejnością wstawiania obiektów w roomie?

 

próbowałem instance_number(obj_npc) ale wtedy zlicza mi wszystkie instancje i wszędzie pojawia się 5.

 

 

Pozdrawiam

Barsztik.

Odnośnik do komentarza
Udostępnij na innych stronach

Hej, dzięki, jestem już bliżej rozwiązania problemu.

 

 

I am Lord, z tym stringiem racja, chociaż nie ma to w sumie znaczenia, bo wyświetla i jak jest string(id) i jak samo id. niemniej dodałem string dla higieny. ;-)

 

ANtY, samo id działa dopóki jest tylko jeden obiekt i kilka instancji.

 

draw_text(x,y, id); zlicza wszystkie instancje wszystkich obiektów. O ile w roomie były same obj_npc nie było problemu, ale jak dodałem nic nie robiące obj_wall, one również liczyły się do numeracji.

 

Próbowałem wstawić obj_npc.id, ale wtedy wszystkie miały wartość 1 (w zasadzie 100001).

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

no tak, tak działa id, unikalny numer dla kazdej instancji w grze

 

anyways, zrob sobie w create

 

GML
fakeID = instance_number(obj_npc);

 

i pozniej wyswietlaj te fakeID, jesli sie nie myle to powinno przypisac kolejno 0,1,2,3,4 i ile ich tam nie będziesz miał

 

 

do czego to potrzebujesz?

Odnośnik do komentarza
Udostępnij na innych stronach

Opcja z fakeID w Create niestety nie działa, dla każdej instancji wyświetla łączną ich liczbę, tak samo jak bym dał to w Step.

 

A potrzebuję tego do identycznych NPCów... już tłumaczę.

 

Robię platformówkę (bo chyba na nich najprościej się uczyć), ale wymyśliłem sobie, by historia w niej była opowiadana przez napotkanych NPCów, obrazy/plakaty na ścianach, regał z książkami itp... kawałek po kawałku. Oczywiście jak na platformówkę przystało fabuła nie będzie zbyt rozbudowana ;-)

 

I tu dochodzimy do sedna. Powiedzmy że na ścianie wiszą trzy obiekty obj_plakat, wyglądają tak samo (mała, pikselowa grafika) bo są trzema instancjami tego samego obiektu. Ale po kliknięciu na każdy z nich pojawiał by się inny tekst, fragment opowieści. Jak w klasycznych RPGach po kliknięciu na różne przedmioty pojawiały się napisy ::cóż, za dziwna księga:: itp...

 

Oczywiście nie chcę tworzyć odrębnych obiektów, więc wymyśliłem sobie, że teksty będę dla wygody trzymał w osobnym skrypcie scr_teksty np. w taki sposób:

 

/// scr_teksty

 

switch (numer) {

case 1:

tresc = "bla, bla, bla"

break;

case 2:

tresc = "pierdu, pierdu"

......

}

 

a w Stepie dla obj_plakat, we fragmencie opisującym co się dzieje po kliknięciu w plakat:

 

script_execute(scr_teksty, numer);

 

gdzie numer byłby id konkretnej instancji.

 

 

Być może, będę to musiał rozwiązać inaczej.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

no to na samym poczatku gry w pierwszym obiekcie co sie tworzy daj w create

 

GML
global.plakaty = 0;

 

i w create plakatu

 

GML
fakeID = global.plakaty++;

 

 

też w edycji rooma możesz edytować create code instancji danych w roomie, czyli np wpisac kazdemu plakatowi jego tresc

Odnośnik do komentarza
Udostępnij na innych stronach

Stworzyłem odrębny obiekt, w którym w Create dałem global.plakaty = 0;, a w Create dla poszczególnych plakatów fakeID = global.plakaty ++. Efekt ten sam, wyświetla łączną liczbę plakatów.

 

Gdy usunąłem ten dodatkowy obiekt, a global.plakaty = 0; dałem w room0: Creation code to wywala:

 

Push :: Execution Error - Variable Get -5.plakaty(100000, -1)

at gml_Object_obj_npc_CreateEvent_1 (line 1) - fakeID = global.plakaty ++;

 

:/

 

ds_map jeszcze nie ogarniam, ale przyjrzę się temu. Switch to pierwsze co mi przyszło do głowy :-)

 

 

Niestety do głowy przyszła mi jeszcze jedna rzecz. Nie mogę tego rozwiązać w taki sposób jak bym chciał (id instancji), bo będzie działało tylko w obrębie jednego rooma. W nowym roomie będzie liczył od nowa. Z kolei w rozwiązaniu proponowanym przez ANtY rozbijam się o fakt, że GM najpierw wykonuje wszystkie Create'y, a potem Stepy i Drawy, więc będzie podawał sumę. Muszę chyba wymyślić inny sposób.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

jaką sumę lol, co ty w draw podałeś, global.plakaty, czy fakeID? jak to pierwsze no to nic dziwnego, że ich liczbę ci wyświetla

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, już mam, działa.

 

Problem polegał na kolejności wstawiania obiektów.

obj_start w którym jest global.plakaty = 0; nie był dodany jako pierwszy. Po zachowaniu kolejności wstawiania obiektów (obj_start, obj_npc, obj_npc...) jest ok.

 

Dziękuję.

 

Sądzę jednak, że będę musiał mimo wszystko poszukać innego rozwiązania, bo utrzymywanie właściwej kolejności wstawiania obiektów może być, delikatnie mówiąc, upierdliwe przy tworzeniu prawdziwych poziomów w grze.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

zaznacz w obj_start ze jest persistent i wrzuć go do pierwszego rooma w grze (np. menu czy splash screen, albo nawet pustego rooma, ktory odpala sie jako pierwszy i pozniej sie przelacza od razu do nastepnego rooma) i sie nie bedziesz tym w ogole musial martwic

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra myśl. :)

 

Ale i tak poszukam elastyczniejszego rozwiązania.

 

W tym przypadku jeśli wstawię np 20 tych "plakatów" w całej grze i nagle pomyślę by wstawić coś pomiędzy drugi, a trzeci, to będę musiał wszystko zmieniać od trzeciego do ostatniego bo ten nazwijmy go "o numerze 2,5" nie będzie pomiędzy 2 a 3 tylko jako 21. Dodatkowo za każdym razem gdy któryś usunę (choćby przypadkiem) i dodam ponownie to znów się wszystko poprzestawia.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

zrob liste tekstow i kazdemu daj id numerek

 

pozniej w create tych plakatow ustawiaj im numerek ktory maja pobierac tekst

Odnośnik do komentarza
Udostępnij na innych stronach

Hej.

 

Dziękuję za pomoc, problem rozwiązałem nieco inaczej, acz bez Waszej pomocy pewnie bym się męczył.

 

Zrezygnowałem całkowicie z listy tekstów i używania ID.

 

Każda instancja obj_npc wysyła do skryptu generującego textbox zmienną tresc, w której przechowywana jest wypowiedź danego NPCa lub plakatu itp...

Zrobiłem więc tak, że wstawiam instancje obj_npc do rooma w dowolnych miejscach i kolejności. Następnie na już wstawionej instancji w roomie klikam prawym i wybieram Creation code, a w nim wpisuję tresc = "bla bla bla bla"; Dzięki temu każda instancja ma swój własny tekst.

 

Dodatkowo w Stepie obj_npc w if (.....) {.....} gdzie sprawdza czy gracz wszedł w interakcję by wywołać textbox dodałem and (tresc != ""), co zapobiega wywalaniu się lub wyświetlaniu pustego textboxa gdyby dany NPC czy plakat nie miał nic "mówić".

 

Dzięki temu cała numeracja i problemy z id czy fakeID odpadają :D

Minus jest taki, że nawet jak dana instancja obj_npc czy obj_plakat nie ma nic "mówić" to i tak w Creation code muszę wpisać tresc = ""; ale to już pikuś.

 

Jeszcze raz dziękuję za Waszą pomoc. Nowa wiedza zdobyta :D

 

Pozdrawiam

Barsztik

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności
też w edycji rooma możesz edytować create code instancji danych w roomie, czyli np wpisac kazdemu plakatowi jego tresc

w sumie mówiłem o tym od poczatku ale spoko :P

Odnośnik do komentarza
Udostępnij na innych stronach

Cześć.

 

Piszę tutaj, bo nie chciałem nowego tematu tworzyć.

 

Teraz mam problem z polskimi znakami.

Oczywiście tworzę super mega hita, który na steamie pobije Dotę 2 i CS:GO razem wzięte, więc będzie po angielsku, jednak brak polskich znaków mi doskwiera bo: co ja nie zrobię? ;-)

 

Wyświetlany tekst jest w Creation code danej instancji umieszczony w taki sposób:

GML
tresc = "Zażółć gęślą jaźń.";

Napisany w notatniku i przeniesiony metodą Copy'iego-Paste'a.

W font z kolei zakres znaków zwiększony do 255. Czcionki próbowałem różne: Arial, Arial Baltic, Arial CE, itp...

 

Niestety po wyświetleniu tekstu polskie znaki są pomijane.

 

Używam GMS:Standart Edition (v1.2.1224).

 

Coś pomijam? Na formu znalazłem jedynie informacje o zmianie zakresu znaków.

Odnośnik do komentarza
Udostępnij na innych stronach

Dziękuję.

 

Podziałało.

 

Ostatni znak miał numer 380, więc de facto wystarczyło zmienić zakres na 32 - 380. Dodało też pewnie inne niepotrzebne "ogonki", ale myślę, że to nie będzie jakoś znacząco obniżać wydajności.

 

 

Pozdrawiam

Barsztik

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