Diskuze: Manipulace s instancemi
V předchozím kvízu, Online test znalostí GameMakeru, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí GameMakeru, jsme si ověřili nabyté zkušenosti z kurzu.
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.
Celkově bych popsaný problém řešil nějak takto:
https://www.dropbox.com/…gExample.zip?dl=0
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(obj,n) mi to tu konkrétní instanci našlo, pak už to bylo snadné použít ve funkci with().
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.
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
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.
Zobrazeno 7 zpráv z 7.