NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Manipulace s instancemi

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:21.6.2017 15:03

Ahoj, chtěl bych se poradit ohledně manipulace instancí, jinou instancí. Ukázka kódu, který mi nefunguje korektně, protože event WITH(), zřejmě nedokáže pracovat s instancí a proměnou with(lod).ID, ani v tomto formátu with(lod.ID)...
STEP EVENT:

///zasahy
if instance_exists(oServer_laser_shoot){
    if instance_place(x,y,oServer_laser_shoot){
        hp-=50;
        shootID=instance_place(x,y,oServer_laser_shoot).ID;

        if hp<=0{
            if shootID=oServer_client_ship.ID{
                with(oServer_client_ship).ID{
                    expr+=20;
                }
            }
            instance_destroy();
        }
    }
}

Tohle je event, ve kterém se zpracovává zásah, následně pokud je HP menší než 0, tak se mají přičíst zkušenosti určité lodi řízené hráčem a následně zničit. Tento kód je v neutrální lodi. Problém je v tom, že nemohu přijít na to jak, že po vyhledání ID lodě a ID střely, které souhlasí.... nemohu z této neutrální lodě předat informaci přes event WITH() do lodě, která jí zničila, ale prostě se mi to přiřazuje do všech lodí(Používám jeden object). Není nějaký jiný způsob jak tu informaci předat korektní lodi, která provedla zničení. Díky moc

Editováno 21.6.2017 15:04
 
Odpovědět
21.6.2017 15:03
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:22.6.2017 1:19

Musíš rozlišovat mezi objektem a instancí. Příkaz with() není event, ale cyklus procházející instance přítomné v roomu a splňující podmínku. Podobně jako for nebo while. Má syntax

with(argument) { code }

, kde argumentem může být index objektu ( pak se provede code na všech instancích daného objektu ) nebo číslo instance ( pak se provede jen na jediné instanci ) nebo ve speciálních případech klíčové slovo ( all, self, other ).

Možná trochu jednodušeji na příkladu:

with(Ship.ID) { code }  místo with(Ship).ID { code }

Za předpokladu, že ID je proměnná obsahující korektní číslo instance.

Nahoru Odpovědět
22.6.2017 1:19
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
TomBen
Tvůrce
Avatar
TomBen:22.6.2017 1:49

Celkově bych popsaný problém řešil nějak takto:
https://www.dropbox.com/…gExample.zip?dl=0

Nahoru Odpovědět
22.6.2017 1:49
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:22.6.2017 10:01

Ahoj, já si právě uvědomuji rozdíl mezi objektem a instancí. Co jsem z toho pochopil, tak pokud chci pracovat pouze s konkrétní instancí, tak je jí potřeba nějakým způsobem vyhledat. Včera koumal, až jsem vykoumal něco obdobného co jsi mi tu postnul. Nejlepší je konkrétní problém tzv. rozsekat na tu konkrétní funkcionalitu, protože v celku to bylo obtížné vymyslet. Takže nakonec to dopadlo takto:

///zasahy
if instance_exists(oServer_laser_shoot){
    if instance_place(x,y,oServer_laser_shoot){
        hp-=50;
        selfShoot=instance_place(x,y,oServer_laser_shoot);
        shootID=instance_place(x,y,oServer_laser_shoot).selfID;
        playerID=instance_find(shootID,0);

        with(selfShoot){
            instance_destroy();
        }

        if hp<=0{
            with(playerID){
                expr+=20;
            }
            instance_destroy();
        }
    }
}

Do instance střela v proměnné selfID jsem si uložil číslo instance lodě, ze které ta střela byla vytvořena. Následně pokud neutrální loď dostala zásah, jsem si to ID vytáhl a přes funkci instance_find(ob­j,n) mi to tu konkrétní instanci našlo, pak už to bylo snadné použít ve funkci with().

 
Nahoru Odpovědět
22.6.2017 10:01
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:22.6.2017 12:38

Id instance je normální číslo, které instance získá při svém vzniku a je jedinečné právě pro ni. Když ho máš někde uložené, už jsou hledací funkce tak nějak navíc. Funkce instance_place vrací rovnou toto číslo. Netřeba proto už nic hledat a instance_find klidně vynecháš. Funguje to takhle:

ids=instance_place(x,y,object_kolizni_jakykoliv);
with(ids) { provedu cokoli právě jen s tím nalezeným kolizním objektem }

Stejně ale bývá spolehlivější nacpat kód do kolizní události, protože ta nastane nezávisle na Stepu a nevadí, když zásah více střel přijde v tentýž Step - všechno se provede správně a ke kolizní instanci se potom dá přistupovat jednodušeji a rychleji přes keyword other.
Kdybys totiž chtěl ošetřit multizásah pomocí instance_place, tak bys ho musel volat tolikrát, dokud nevrátí -4 čili noone. Prakticky to ale lze ve hře zanedbat, protože si toho hráč nejspíš nevšimne a když všimne, bude ještě rád, že ušetřil HP body.

Nahoru Odpovědět
22.6.2017 12:38
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:22.6.2017 12:58

Máš pravdu, ale mám takový pocit, že mluvíš jen interakci o dvou objektech, tzv. jeden koliduje druhý. Já už jsem to tady psal, ale celé to má dělat toto: hráč střílí po neutrální lodi a pokud jí zničí, mají se připsat zkušenosti za zničení. Je tu interakce se třemi objekty: loď, střela a neutrální loď. A já to vymyslel tak, že pokud loď vytvoří střelu, tak ta si uloží ID té lodě a následně při kolizi nestačí jen instance_place(), protože to vyhledá ID té střely a né lodě, proto jsem použil tu proměnou selfID, do které jsem uložit ID té lodě. Pak je to jak jsem psal předtím

 
Nahoru Odpovědět
22.6.2017 12:58
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:22.6.2017 13:06

Vím že to tak máš. Nerozepisoval jsem to, protože ten fakt nemá na to pravidlo vliv: pokud mám id není třeba instance_find. Už budu muset zmizet, tak si kód klidně projdi znovu a vyzkoušej si to.

Nahoru Odpovědět
22.6.2017 13:06
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 7 zpráv z 7.