Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 10. duben 2009, 21:20:53 Předmět: Objektový návrh Maria |
|
|
V Javě jsem poměrně nováček a nejsem si jist, jestli dobře chápu úlohu interfaců. (holt v C++ nejsou)
V Mariovi jsou různé příšery, hráč, nějaké objekty na mapě, které mají společnou vlastnost, že se vykreslují. Takže by mohl být dobrý interface něco jako Drawable, v něm metoda Draw(). Pak udělat objekty typu Drawable a hezky vše vykreslit v jednom cyklu.
Další věc, co budou mít tyto objekty(hráč, příšery..) společnou, že budou mít svojí hlavní smyčku, kde se budou starat o vše potřebné, co mají dělat(hráč reagovat na klávesnici, příšery reagovat na přítomnost hráče atd.)
Takže asi nejlépe změnit Drawable na vhodnější název a přidat metodu MainLoop()?
Nebo nad tím uvažuji špatně?
V C++ bych to asi takhle "složitě" neřešil a měl bych zvlášť cyklus pro objekty, zvlášť pro příšery.. _________________
 |
|
Návrat nahoru |
|
 |
Deluxe

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 10. duben 2009, 21:46:31 Předmět: |
|
|
Ja myslim ze je to tak dobre.
v C++ interfacy nejsou potreba protoze podporuje vice nasobnou dedicnost, takze misto nich muzes pouzit tridy s virtuanima metodama. Nevim, jak je na tom s dedicnosti Java. Ale v C# by bez interfacu proste nesla vytvorit trida obsahujici vic vlastnosti treba:
class Monster : IDrawable, IAnimated...
doufam ze v nicem nekecam  |
|
Návrat nahoru |
|
 |
sulthan

Založen: 24. 10. 2007 Příspěvky: 104
|
Zaslal: 10. duben 2009, 22:40:56 Předmět: |
|
|
No, kazdopadne v tvem pripade je asi interface zbytecnosti. Nepotrebujes definovat novy interface kvuli kazde veci, co ma par objektu spolecnych. V tvem pripade bude asi lepsi udelat pro vykreslovatelne objekty spolecnou nadtridu s abstraktni metodou paint(), protoze toho urcite budou sdilet mnohem vic...
Kdy pouzit interface? Obecne je to ve chvili, kdy potrebujes definovat spolecne vlastnosti v ruznych stromech dedicnosti trid... tj. kdyz mas nekolik trid odvozene od jedne tridy a nekolik trid odvozenych od druhe tridy a potrebujes, aby v obou skupinach mely nejake tridy shodne vlastnosti... (pokud se to teda zase neda udelat tak, ze se to preskupi do jednoho stromu dedicnosti). |
|
Návrat nahoru |
|
 |
MD

Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 11. duben 2009, 07:08:40 Předmět: |
|
|
Mozna jeste typictejsi pouziti interfacu je pouzit je prave jako interfacy
V tomto pripade zapomente na dedicnost (ceho je moc toho je priliz)
Rekneme ze mate konfigurovatelny system, treba textovy editor. A ten vam dovoluje si formou dalsich komponent ci pluginu dodelat treba syntax highlighting nebo kontextove doplnovani (intellisence).
System tedy definuje interface (tedy rika jake metody musi plugin naimplementovat) a v pluginu si pak udelate tridu daneho interfacu a implementujete pozadovane metody. Instanci teto tridy pak zaregistrujete v systemu.
Vlastne to funguje jako takovej chytrejsi "objektovej" callback.
A v c++ se intarfacy delaly (a stale delaji) pomoci abstraktnich trid bez promennych. Viz napr. COM  _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
 |
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 11. duben 2009, 11:09:10 Předmět: |
|
|
jelikož každej vykreslitelnej objekt bude mít nejspíš nějakou pozici a něco jako jméno obrázku, tak by bylo lepší to dát do nějaké nadtřídy
ve skutečnosti si myslím že by celá ta metoda Paint() šla napsat v té nadtřídě |
|
Návrat nahoru |
|
 |
sulthan

Založen: 24. 10. 2007 Příspěvky: 104
|
Zaslal: 12. duben 2009, 00:23:00 Předmět: |
|
|
Souhlas s krkalem.
Jinak pokud mas problemy s pochopenim, co je interface a jak se pouziva, cili uplne s objektovym navrhem, tak doporucuji nejdrive nacist alespon nejake zaklady z literatury (napr. Thinking in Java - zdarma dostupne na internetu), jinak se asi budes hodne placat.
Nemuzes postavit dum, kdyz nemas pevne zaklady...  |
|
Návrat nahoru |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 12. duben 2009, 12:46:21 Předmět: |
|
|
Tak jsem nakonec interfacy nepoužil. Na následujícím obrázku je můj návrh.
Některé věci zkusím tady vysvětlit. Nejde přesně o kopii Maria, je to zjednodušené. Listy Turtle a Mushroom jsou opravdové příšery, želva, která nezemře po skoku na ní, houbička zemře. BonusLive vlastně není příšera, je to to, co vyskočí z nějakého tilu, a když to chytíte, získáte život.(tady se to liší od originálu)
BlockDestroyable je tile, který se zničí, pokud se ho hráč dotkne zespoda. BlockPoints jsou tile, z kterých padají peníze, když do nich skáčete zespoda. BlockLive je tile, z kterého vyzkočí BonusLive.
Uvítám veškeré připomínky a kritiku. _________________
 |
|
Návrat nahoru |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 12. duben 2009, 13:21:03 Předmět: |
|
|
Nestudoval jsem to, ale "Live" je "živý" ... pokud jsi chtěl "život", pak je to "Life"  _________________ Mám strach |
|
Návrat nahoru |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 12. duben 2009, 14:43:59 Předmět: |
|
|
jj, dík. To je tak, když tam pak mám i množné číslo, lives. Opravím to. _________________
 |
|
Návrat nahoru |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 12. duben 2009, 15:34:19 Předmět: |
|
|
A když už rejpu do jazyka, tak jsem se na to i podíval. Na malou hru typu Mario to vypadá OK. No ale jak už to bývá, tak na problémy s návrhem si asi příjdeš sám, až to budeš implementovat  _________________ Mám strach |
|
Návrat nahoru |
|
 |
sulthan

Založen: 24. 10. 2007 Příspěvky: 104
|
Zaslal: 17. duben 2009, 10:52:33 Předmět: |
|
|
Presne tak, napriklad me pripada docela malo rozlisovat "wall" jen jako boolean, tj. jestli nekde zed je nebo neni Uvidis pri implementaci  |
|
Návrat nahoru |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 17. duben 2009, 12:04:44 Předmět: |
|
|
Tak mě varujte předem
Tak ono o té zdi, jak bude třeba vypadat, budu rozlišovat v samotných objektech typu Block
ale abych nemusel každý frame kontrolovat kolizi všech příšer se všemi bloky na mapě, tak navíc si budu pamatovat, kde něco je, a kde není a tedy detekce s mapou bude pro každou příšeru/Maria v konstantním čase.
Tenhle návrh zatím nepočítá s ničím podobným jako quadtree, či podobnými urychleními detekce kolize. _________________
 |
|
Návrat nahoru |
|
 |
sulthan

Založen: 24. 10. 2007 Příspěvky: 104
|
Zaslal: 20. duben 2009, 22:24:07 Předmět: |
|
|
Houp napsal: |
Tak mě varujte předem
Tenhle návrh zatím nepočítá s ničím podobným jako quadtree, či podobnými urychleními detekce kolize. |
Quadtree by ti asi kolize tezko urychlil. Ten pouze optimalizuje pamet. |
|
Návrat nahoru |
|
 |
Mem

Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 21. duben 2009, 06:43:45 Předmět: |
|
|
sulthan: Eh?  _________________
 |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 21. duben 2009, 07:10:13 Předmět: |
|
|
Mem napsal: |
sulthan: Eh?  |
tak nejak - taky tu kroutim nevericne hlavou - to jsme ten kvadrantovej strom implementovali uplne zbytecne asi v praci - zajimavy je ze s jeho pouzitim mame vyhledavani geometrii v prostoru mnohonasobne rychlejsi  |
|
Návrat nahoru |
|
 |
|