NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Proměnná náležící jiné instanci

V předchozím kvízu, Online test znalostí GameMakeru, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
David Šercl
Člen
Avatar
David Šercl:23.11.2016 17:01

Ahoj, mám zase jednu všetečnou otázku.
Lze v Game Makeru nějakým způsobem pracovat s proměnnou, která náleží jiné instanci. Chtěl bych aby jedna instance reagovala na základě proměnné instance druhé. V mém případě mám medica a chci aby automaticky reagoval na poškození jednotek (od nejbližší po nejdelší), tzv. spustil léčení. Zatím jsem to udělal, přes funkci instance_change:
obj_vojak-zdravá jednotka
obj_vojak_poskozena-poškozená jednotka
objekty se převedou do určitých stavů dle HP.
Chtěl bych to pořešit aby medic reagoval na základě proměnné a ne určité instance.

medic je nastaven:
If instance_neares­t(x,y,obj_vojak_pos­kozen){
leceni=1;
}
vojak je nastaven:
if hp<hpmax/2{
instance_chan­ge(obj_vojak_pos­kozen,false);
}
a obráceně.

Díky jestli někdo s něčím přijde.

D.

 
Odpovědět
23.11.2016 17:01
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:23.11.2016 22:54

Dělá se to tečkovou konvencí.
Bez této znalosti se prakticky nedá programovat.

Nahoru Odpovědět
23.11.2016 22:54
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
Odpovídá na TomBen
David Šercl:23.11.2016 23:21

O tomhle vím, funguje mi to jen částečně:
Ukázka kódu:
Step Event pro medica

if instance_nearest(x,y,obj_vojak).poskozeni=1{
        with(instance_nearest(x,y,obj_vojak)){
                leceni=1;
        }
}

Tahle část kódu mi nefunguje s tečkovou konvencí: with(instance_ne­arest(x,y,obj_vo­jak).poskozeni=1)

Podle testování to reaguje jen na nejbližsí instanci a zjišťuje to jen jestli to má proměnnou poskozeni nastavenou na 1, kde se tomu vojákovi nastaví leceni na hodnotu 1 a pokud je HP na max, tak se hodnota poskozeni nastavi na hodnotu 0. Další v řadě má hodnotu 1, ale nejbližší má hotnotu 0, ale o něj se to už nestará, protože to zřejmě stále čekuje tu nejbližší instanci...o to mi hlavně šlo. Zřejmě to asi jinak vyřešit nejde než jsem napsal výše.

 
Nahoru Odpovědět
23.11.2016 23:21
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:23.11.2016 23:59

Odpovídal jsem na hlavní dotaz, že tam máš hromadu dalších chyb, za to nemůžu. :-)
Píšeš toho hodně, ale ne ty podstatné věci. Pokud má medic léčit všechny, tak proč tam máš instance_nearest? Neměl by spíš léčit jednotky v určité vzdálenosti okolo něj?

Nahoru Odpovědět
23.11.2016 23:59
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
Odpovídá na TomBen
David Šercl:24.11.2016 9:52

Já tam žádný další chyby nemám, funguje mi to, jen jsem se snažil najít nějaký lepší způsob. Předpokládal jsem, že ty tomu nějak porozumíš, ale jak je vidět, tak ne. Řict, že tam mám hromadu chyb bez žádného bližšího vyjádření, je taky dobrý :-) .
Chtěl jsem aby ten medic léčil jednotky po jedné, od nejbližší po nejvzdálenější a samozřejmě v určité vzdálenosti okolo něj. To co jsem tam napsal je jen zkrácená verze kódu, těch podmínek je tam ve výsledku víc.

 
Nahoru Odpovědět
24.11.2016 9:52
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:24.11.2016 11:48

Chyby nemusí být jen typu fatal_error. Že jsem to víc nerozvedl, má jednoduchý důvod: koukalo z toho dlouhé vysvětlování. V čase okolo půlnoci do takových věcí fakt nejdu. Pokud jsi se svým kódem spokojený, já s tím problém nemám.

V zásadě je tedy asi jádro pudla nalezeno. Zřejmě jde o to, že GM nemá vestavěnou funkci, která by našla druhou, třetí,...až N-tou nejbližší instanci.

Tvoje řešení problému není vůbec špatné. Instance change přirozeným způsobem vyřadí vojáky už nalezené z dalšího hledání. Může sice vadit, že s vyšším počtem různých typů jednotek by přibývaly objekty a projekt by se jimi mohl zaplavit k nepřehlednosti, ale s šikovným pojmenováváním, využitím dědičnosti by se potíže daly minimalizovat.

Samozřejmě existují další možnosti jak věc řešit. Každá má své pro a proti. Je možné instance procházet cyklem with, který projde všechny vojáky a podmínkou lze zjistit nejen vzdálenost od medika, ale taky potřebu léčit.
Další možnost je aktivace a deaktivace instancí. Tím lze podobně jako s instance_change dosáhnout vyřazení dříve nalezeného vojáka z dalšího hledání. Jednoduše nalezeného deaktivuji a hledám znovu. Tím najdu druhého nejbližšího. Opakováním dalšího. Pak je opět všechny aktivuji a celé se to odbude dřív než bude potřeba vojáky vykreslit v Draw.
Mám vyzkoušený skript, který jednoduše vrátí seznam instancí seřazený podle vzdálenosti,který je založený právě na principu deaktivace instancí.
Kód léčení ale nemusí být nutně v medikovi. Za zvážení by stálo i to, že by voják, který je zraněný by si našel nejbližšího medika ( pokud existuje ) a nechal by se u něj léčit. Výsledek by byl stejný, jen kód by byl ve vojákovi a nezraněné vojáky by nebylo třeba procházet podmínkou.

Je samozřejmě možné, že existují i další alternativy, ale takhle na první dobrou mě už nic rozumného nenapadá. Obecně je ale lepší řešit na fóru jen situace, kdy něco vážně nejde nebo nefunguje. Dotazy typu "hele jak jsem to napsal, co vy na to?" vedou jasně ke zbytečným konfliktům.

Nahoru Odpovědět
24.11.2016 11:48
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
David Šercl:24.11.2016 12:33

I když to tak nevypadá, tak já opravdu oceňuji tvou pomoc, děláš to zadarmo a za to dneska ani kuře nehrabe :-) .
Přesně jak jsi psal, začíná už tam být hodně instancí, pro jeden tzv. objekt a proto jsem se to snažil nějak vyřešit lepším způsobem(např. tam mám vraha: vrah_tvorba,vrah,vrah­_neviditelny,vrah_pos­kozen,vrah_ne­viditelny_pos­kozen) a to nemluvím o dělníkovi :-D .
Pokud by jsi chtěl a byl jsi ochoten mohl bych ti poslat buď dosavadní projekt nebo to pořešit, třeba telefonicky.

 
Nahoru Odpovědět
24.11.2016 12:33
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:24.11.2016 23:34

Obvykle bývá pro mě rychlejší napsat celé znovu, než ladit cizí kód. Nemám moc času a mám nějaké věci rozpracované, takže bych musel věřit, že zrovna tvůj projekt stojí za ten čas a práci. Šanci nemáš velkou, ale zkus mě přesvědčit.

Nahoru Odpovědět
24.11.2016 23:34
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
David Šercl:25.11.2016 0:05

Já to celý dělám jen pro zábavu a času taky nemám moc, když jsem celý den v práci a to na tom makám přes 2 měsíce. Rozhodně jsem nechtěl aby jsi za mě psal nebo ladil kód, stejně by jsi se v tom nevyznal, pokud bych ti nevysvětlil co co má dělat, ale spíš jen pohled a názor někoho kdo se v této oblasti pohybuje.

 
Nahoru Odpovědět
25.11.2016 0:05
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:25.11.2016 0:07

Tak si teď nejsem jistý, co si přesně představuješ, že řeknu, až uvidím, cos dva měsíce tvořil...

Nahoru Odpovědět
25.11.2016 0:07
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
David Šercl:25.11.2016 10:00

Raději nic.... Jsi mohl na rovinu napsat, že ti je to fuk. Každopádně dík za reakci na příspěvek.

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
25.11.2016 10:00
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:25.11.2016 11:45

Negativní reakci na svoje dílo bys neustál. Urazil jsi se při prvním náznaku.

Nahoru Odpovědět
25.11.2016 11:45
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
David Šercl:25.11.2016 12:06

Ty jsi to ani neviděl a už mi naznačuješ, že to stojí za nic, jsi neuvěřitelně domýšlivý. Už jsi mě zkritizoval v minulosti až, až a když se dívám na tvá díla tak nápad i grafika, jsou průměrné. Co je tak strašně zábavného na žábě co chytá mouchy nebo ryba co polyká koule, tak před rokem jsem naprogramoval obdobnou kravinku, kde ti roste kytka a ty jí bráníš před hmyzem(housen­ky,brouci,vosy), samozřejmě se obtížnost zvyšuje(asi 5kol). A taky to nevystavuji jako echt dílo.....

 
Nahoru Odpovědět
25.11.2016 12:06
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:25.11.2016 12:28

Vnucuješ mi svou vlastní představu. Bylo by mi milejší, kdyby sis nehonil ego a naopak postnul něco hotového ( jakkoli to není echt dílo ), co si respekt zaslouží. Fakt, že můj respekt není snadno získatelný, nesouvisí s tím, co jsem kde publikoval a co mě k tomu vedlo. Kdybych byl domýšlivý, našel bych partu řiťolezů a nechal si pochlebovat. Místo toho se dávám hloupě v šanc na fóru. To ti nejspíš uniklo.

Nahoru Odpovědět
25.11.2016 12:28
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
David Šercl:25.11.2016 12:52

To je vzájemné, ty mi zase vnucuješ svoji. Žádné ego si nehoním, chtěl jsem jenom pomoci s jednou věcí, případně se na to mrknout, objektivní kritiku, názor. Jako řeči typu, "máš tam hodně chyb, což není moje chyba", nebo "do toho nejdu","Šanci nemáš velkou, ale zkus mě přesvědčit","Ne­gativní reakci na svoje dílo bys neustál", jsou fakt na místě a nevím kdo si honí ego. Rýpnul jsem trochu do tebe a koukejme jakou máš najednou vyřídilku. No to je fuk, už jsem tady skončil...

 
Nahoru Odpovědět
25.11.2016 12:52
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:25.11.2016 12:54

Ok, taky jsem si rád pokecal.

Nahoru Odpovědět
25.11.2016 12:54
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
David Šercl:25.11.2016 13:03

Ještě tady postnu nedokončený projekt(starý asi půl roku), města.... Aby jsi viděl jak jsem nic neumím....

City

 
Nahoru Odpovědět
25.11.2016 13:03
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:25.11.2016 21:29

No vida. To je lepší. Budeš to dokončovat?

Nahoru Odpovědět
25.11.2016 21:29
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
David Šercl:26.11.2016 12:31

Zatím ne, možná později, chybí mi u toho nápad a nedokázal jsem v té době když jsem to prgramoval vyřešit jeden problém, tohle byla jenom ukázka , nejdřív chci dokončit první verzi strategie, na kterém intenzivně pracuji. Ta strategie mi už funguje co se týče funkčnosti, až na nějaké detaily, ale potřebuji tam ještě dodělat rozhraní.....

 
Nahoru Odpovědět
26.11.2016 12:31
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:26.11.2016 12:58

Já jsem dřív spoustu věcí nechával nedokončených, ale po nějaké době jsem poznal, že je to vlastně na projektu ta nejdůležitější věc, tak se teď snažím dokončit všechno, co je v mých silách.

Nahoru Odpovědět
26.11.2016 12:58
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 20 zpráv z 20.