ITnetwork Flashka zdarma C# týden
Akce! Pouze tento týden sleva až 80 % na kurzy C# .NET. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Diskuze: Java - interaktivní přepínače ve hře

Aktivity (2)
Avatar
Jenkings
Redaktor
Avatar
Jenkings:28.8.2018 22:31

Ahoj. Potřeboval bych trochu nasměrovat ke správnému postupu.
Mám hru, ve které hráč ovládá postavu a prochází jednotlivými levely.
Teď se snažím přidat do levelů "ovladače", například páčky, nebo čudlíky na zdi apod.
V každém levelu může být libovolný počet těchto ovladačů, ale každý bude ovládat něco jiného (například jeden odsune zeď, jiný třeba vypustí nějakého protivníka apod.). Mám jednotlivé typy ovladačů vytvořené jako třídy. Při spuštění každého jednotlivého levelu se tyto ovládací prvky vytvoří na předem daných místech. Potřebuji ale vědět jak docílit toho, abych při vytváření jednotlivých instancí ovladačů, mohl ke každé zvlášť vytvořit i jeho funkčnost (v podstatě přiřadit každé jednotlivé instanci funkci která se provede při použití daného ovladače). Jen nevím jak správně na to.

Odpovědět 28.8.2018 22:31
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Jenkings
Martin Petrovaj:28.8.2018 22:49

Neviem, v čom tú hru vytváraš a teda aké máš možnosti a aké postupy musíš využívať, ale ja keď som dávnejšie robil jednu svoju podobnú hru v Unity, tak som si vytvoril jednu triedu (napr. 'Usable'), ktorá v mojom prípade implementovala rozhranie Interactible, aby s ňou vedel hráč interagovať + nejakú základnú logiku, užitočné helpery atď. (btw nezameriavaj sa až tak na moju konkrétnu implementáciu, len na myšlienku).

Inštancie Usable držali kolekciu objektov, ktorých typ bol odvodený od nejakej ďalšej mojej triedy (napr. 'UsableStrategy', namiesto triedy môžeš ofc použiť rozhranie, čo ti už vyhovuje viac). Každý potomok tej Strategy triedy potom robil pri zavolaní zdedenej spoločnej metódy (alebo spustení eventu, it's up to you) nejakú jednu svoju vec - napr. ParticleUsableS­trategy by prepínal k sebe priradený particle effect, AnimationU.S. by spúštal k sebe priradenú animáciu atď.

V praxi boli potom inštancie potomkov Strategy vytvorené na herných objektoch, ktoré manipulovali (napr. stena, dvere, mína, svetlo…) a skript Usable bol na objekte, ktorý interakciu spúšťal (páčka, tlačidlo a pod.). K Usable som potom len nalinkoval tie Strategy skripty, ktoré som chcel a Usable ich pri interakcii spustil.

Keď bolo napísaných dosť konkrétnych stratégií a boli napísané dobre a univerzálne, vytváranie takýchto interactible objektov, udalostí a scén bolo fakt ako skladanie lega v editore :-)

Nahoru Odpovědět 28.8.2018 22:49
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Jenkings
Redaktor
Avatar
Odpovídá na Martin Petrovaj
Jenkings:28.8.2018 23:05

Píšu to jen čistě v Javě, bez frameworků apod.

Nějak podobně jsem uvažoval taky. Každý LVL je jako třída a v metodě init vytváří celou scénu. Ta pak drží mimo jiné jak kolekci všech postav(nepřátel), tak taky kolekci těch ovladačů vše jako potomek od Entity. Jelikož jde o 2D hru, tak mapa je uložená jen jako dvourozměrné pole "políček", každé z políček má vlastnosti ukazatel na texturu a průchodnost (0/1).

Můj hlavní problém je v tom, že mám nějak mezery ve vzdělání ohledně toho, jak syntakticky provést to propojení, a definování akce(funkce) přímo k té dané instanci.

Nahoru Odpovědět 28.8.2018 23:05
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Jenkings
Martin Petrovaj:29.8.2018 8:45

V pohode, to nie je žiadna medzera vo vzdelaní, stačí len prísť s implementáciou, ktorá pasuje do tvojej aplikácie, alebo využiť vhodný design pattern.

Ak by som mal ďalej vysvetľovať na svojom minulom projekte, tak "definování akce(funkce) přímo k té dané instanci" nebolo tak úplne to, čo som spravil - každý druh akcie (spustenie animácie, pohnutie objektom, vypísanie správy atď) bola osobitná trieda (samozrejme všetky mali spoločného predka), každá inštancia si potom držala referenciu len na tie objekty, ktoré ona sama ovplyvňovala (príp. si tie referencie nejako rozumne získala vtedy, keď ich potrebovala).

Spomínané prepájanie objektov nie je opäť nič iné, než klasické referencie. V tvojom prípade mi to znie tak, že problém je skôr kde a kedy tie referencie získavať, kam ukladať samotné skripty (myslené ako ich inštancie) a ako ich navzájom prepojiť. To zase veľmi závisí od toho, čo už máš vytvorené, čo z toho môžeš na riešenie tohto problému využiť a ak to nebude stačiť, tak aké riešenie by do zvyšku tvojho projektu pasovalo najlepšie. A to už je niečo, nad čím sa ako autor hry musíš zamyslieť sám a podľa toho sa rozhodnúť :-)

Ak mám hovoriť za seba, pri podobných problémoch sa mi najčastejšie osvedčilo tlačiť na modularitu základných častí projektu - v tvojom prípade by si mohol napr. porozmýšľať nad nejakým systémom komponentov pre entity v hre. Nemusel by si ako komponenty dokonca reprezentovať len rôzne funkčné skripty, ale aj ďalšie dáta a behaviour - napr. polohu entity, jej grafickú reprezentáciu atď. Takýmto využitím composition patternu by si sa vyhol nutnému neustálemu rozširovaniu pôvodných tried (a následnej prekomplikovanej špagetovej abstrakcii, do ktorej je odtiaľ ľahké spadnúť). Pre správu vzťahov medzi komponentami a entitami vidím dve najbežnejšie možnosti - buď nejaký vyšší mechanizmus s využitím inversion of control, ktorý bude nad entitami v tvojej hre a bude ich zhora sám spravovať (komplikovanejšie riešenie), alebo vytvoriť nástroje, pomocou ktorých budú môcť komponenty samy komunikovať medzi sebou, napr. formou helperov a extension metód pre vyhľadávanie iných komponentov a entít a pod. (návrhovo škaredšie riešenie, ktoré môže zvádzať k neprehľadnému kódu a tight couplingu). Prípadne vymysli / nájdi niečo iné sám :-D

Akceptované řešení
+20 Zkušeností
Řešení problému
Nahoru Odpovědět 29.8.2018 8:45
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Jenkings
Redaktor
Avatar
Odpovídá na Martin Petrovaj
Jenkings:29.8.2018 19:43

Díky, takhle jsem nad tím nepřemýšlel a asi jsem to zbytečně komplikoval. Už mám představu a koncepčně to funguje.

Nahoru Odpovědět 29.8.2018 19:43
Největší časovou náročnost má výpočet časové náročnosti..
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 5 zpráv z 5.