Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno OOP - objekty zasahujúce mimo?

Mal by som praktickú otázku ohľadne OOP. Prerábam jednu hru, čo som kedysi napísal v Turbo Pascale do C#. Jedná sa o klasiku, húsenica, známa v zjednodušenej forme na starých Nokiách a v zložitejšej forme ako Wurmi. Samozrejme, moja prerábka bola najlepšia. ;-) Ale k veci:

Červík Wurmi by mal vystupovať ako samostatný objekt, čo sa implementácie pohybu týka. Obsahuje teda:
- informáciu o umiestnení tela pre každý článok
- začiatok a koniec tela
- smer

Do toho chcem implementovať metódy na posuv červíka. Lenže, ak má byť tento objekt samostatný, tak z neho nemôžem odkazovať na kreslenie hracej plochy. Musel by som teda v obsluhe červíka implementovať posuv interne až potom po použití v programe urobiť krok červíka a následne ručne volať metódu kreslenia. Nebolo by teda lepšie implementovať kreslenie červíka do jeho objektu priamo a na kresliace metódy vytvoriť delegátov, ktorí budú volaní v objekte červíka a bude v nich adresa rutín pre kreslenie požičaná z hlavnej obslužnej rutiny? Tým pádom bude objekt samostatný a prehľadný.

Chcem sa teda spýtať, aké riešenie sa v takýchto prípadoch používa najčastejšie? Je aj nejaká výhodnejšia tretia možnosť? (V zmysle, čo je najvhodnejšie urobiť.)

Ono je plno seriálov o OOP, len všade sa používajú jednoduché príklady, kde takéto veci nie je nutné riešiť.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Neviem, nakoľko máš naštudované OOP, ale mám pocit, že si úplne preskočil analýzu a návrh a ideš imp…
los 25.06.2009 23:47
los
Kreslenie bude v v objekte hracia plocha. Ak budem chcieť zmeniť kreslenie na iné, tak zmením tento… nový
msx. 26.06.2009 08:15
msx.
Takže mám to takto: Objektu záhrada odovzdám objekt PictureBox, kam má kresliť. V tomto objekte sú… poslední
msx. 27.06.2009 23:44
msx.

Neviem, nakoľko máš naštudované OOP, ale mám pocit, že si úplne preskočil analýzu a návrh a ideš implementovať metódy, ktoré ani nevieš umiestniť. Stále sa sústredíš len na červíka a nad ostatnými objektami sa príliš nezamýšľaš.

Najprv by si si mal identifikovať všetky objekty, ktoré v tvojej hre vystupujú, t.j. hracia plocha, červík, prekážka, kapusta a čo ja viem čo ešte. Pre každý tento objekt by si mal potom identifikovať jeho vlastnosti, ako napr. pozícia, a aj metódy, ktoré sa s jednotlivými objektami budú vykonávať.

Čo ti z toho vyjde závisí od toho, čo chceš dosiahnuť. Ak chceš mať napríklad možnosť "jednoducho" vymeniť hraciu plochu, napr. namiesto 2D plochy v okne formulára za nejakú, ktorá sa bude zobrazovať 3D, tak vykresľovanie bude zrejme zabezpečovať hracia plocha. Ak takéto ambície nemáš, tak si vykresľovanie môže robiť každý predmet hracej plochy vo vlastnej réžii.

Tiež si premysli, ako bude vyzerať tvoja herná slučka (game loop) - kedy budeš posúvať červíkov, kedy budeš zisťovať kolízie, kedy budeš získavať vstup z klávesnice, kedy budeš vykresľovať...

K analýze a návrhu tiež patrí aj voľba technológie, ktorú chceš použiť. Bude to GDI, Direct3D, OpenGL, použiješ XNA, alebo niečo iné?

Kreslenie bude v v objekte hracia plocha. Ak budem chcieť zmeniť kreslenie na iné, tak zmením tento objekt a červovi odovzdám iný. Podstatné je, aby vykresľovacia metóda mala rovnaké parametre. Môžem to urobiť dokonca tak, že urobím abstraktnú triedu kresliacej plochy a z nej urobím rôznych potomkov. Podľa toho, akého potomka priradím h hlavnej triede, tak sa bude vykresľovať. A bude to úplne obyčajná grafika cez DrawImage a niekoľkých BMP súborov, ktoré chcem neskôr vložiť do resource, aby neboli mimo EXE súboru.

Takže mám to takto:

Objektu záhrada odovzdám objekt PictureBox, kam má kresliť. V tomto objekte sú implementované všetky metódy na kreslenie a tiež na vytváranie objektov v záhrade. Čiže v programe nepotrebujem vygenerovať súradnice kapusty pri vytváraní záhrady, ale záhrada vygeneruje sama a odovzdá súradnice.

Objektu Wurmi odovzdám objekt záhrada. Kompletný pohyb červíka je implementovaný v ňom. Ak zje kapustu, tam objekt záhrada vygeneruje novú. Ak chce nakresliť články tela, objekt záhrada ich vie vykresliť, keďže kreslenie je v nej. Vytváranie a zanikanie článkov tela je ale implementované v tomto objekte.

Aplikácia vytvorí plátno na PictureBox. Vytvorí objekt záhrada a odovzdá mu už pripravený PictureBox. Aplikácia naaranžuje záhradu, ale príkazy na kreslenie odovzdáva objektu záhrada. Potom vytvorí objekt Wurmi a odovzdá mu objekt záhrada, aby Wurmi vedel, kam patrí. Cez Timer je riadený pohyb červa. Podľa stlačenej klávesy aplikácia odovzdáva objektu Wurmi informáciu o pokuse zmeniť smer. Ak je to možné, objekt Wurmi si ho zmení. Aplikácia si následne od objektu Wurmi vypýta, aký objekt je pred hlavou červa a prikáže mu urobiť krok. Zobrazia sa informácie o dĺžke a času do konca hry. Potom sa otestuje, či pred hlavou červa nebola otrava alebo či neskončil čas. Ak áno, hra končí, inak sa to celé opakuje dokola.

Ak budem chcieť v budúcnosti pridať červa, nebude nič jednoduchšie. Vytvorím len ďalší objekt Wurmi a odovzdám mu rovnaký objekt záhrada a dvaja červi budú v jednej záhrade.

Ďakujem zúčastneným za pomoc.

Zpět do poradny Odpovědět na původní otázku Nahoru