Dyna Blaster: játékosztály, hierarchia probléma
2006-04-26T15:32:04+02:00
2007-11-07T08:33:59+01:00
2022-07-28T09:35:31+02:00
Lahos
Hi.

Egy régi kis DOS-os játék, a Dyna Blaster szerű miniprogramot szeretném megcsinálni Delphiben, hálózati támogatással. A program teljesen objektum orientált, most azonban bajba kerültem.

Először is van egy osztályhierarchiám, ami igy néz ki:

Application Dyna Bombs Players Map

Az Application lesz maga az alkalmazás, ami létrehoz egy Win32 ablakot, és inicializál. A Dyna osztálynál kezdődik a játék, ez jeleniti meg illetve update-lja az egyes osztályok adatait. A bombs a játék közben lerakható bombákat kezeli, a Players a játékosokat tartja nyilván, kezeli, és a Map kezeli, irja le a pályát.

Most abba a problémába ütköztem, hogy ha a játékos lerak egy bombát, akkor azt a Bombs osztály .Add metódusával kéne megtenni. Igenám, de az egy szinten feljebb van, nem lehet meghívni. Ha megcserélem a két osztály szintjét, tehát igy:

Application Dyna Players Bombs Map

Akkor meg az a baj, hogy ugye a bombák robbanásakor kéne ellenőrizni a player listában, hogy nem érint e valakit a robbanás, de most meg az van egy szinten feljebb

Tehát, várom az ötleteket: hogyan kéne megtervezni jobban?
Mutasd a teljes hozzászólást!
Ésha átadják a kész objektumokat egymásnak? Pl a bomba felrobbanására legyen a TBomb osztálynak egy EXPLODE eljárása, és az paraméterbe kapja meg a Players osztályt. Igy nem jó?
Mutasd a teljes hozzászólást!

  • Nem vágom hogy mi a logika a hierarchiában :)

    Ezek igazából nem egymás alá rendelhető osztályok. A pályát/játékot kezelő objektumnak kell tudnia hogy hol van bomba és játékos.
    ergo mindegyik objektumot tartalmaznia kéne, viszont a lerakott bombáknak már semmi köze a játékosokhoz.
    Mutasd a teljes hozzászólást!
  • Akkor tehát valami ilyesmit javasolsz:

    Application Dyna -Players -Bombs -Map

    Azat, hogy ezek ne hierarchiában legyenek, hanem a Dyna osztály privát tagjában legyenen meg ezek az objektumok? Pl igy

    Type
    TDyna = class
    private
    Players : TPlayers;
    Bombs : TBombs;
    Map : TMap
    .
    .
    .

    de ekkor hogyan kommunkiálnak egymással?
    Mutasd a teljes hozzászólást!
  • lerakott bombáknak már semmi köze a játékosokhoz.


    tévedsz, a lerakott bombák tovább ketyegnek, és ha robbannak, akkor ellenőrizniük kell, hogy nincsenek e útban a játékosok.
    Mutasd a teljes hozzászólást!
  • ha mégis egymás alá rendelnéd őket, akkor adhatsz mindegyiknek egy parent-mezőt, amin keresztül felfelé el tudja érni a fölötte álló osztályt, célszerűen már a konstruktornak meg kellene adni:

    Valami.alá = TEzmegyalá.Create(Valami); vagy Valami.alá = TEzmegyalá.Create(^Valami);

    Nem vagyok benne biztos, a kettő közül az egyik a barátod. Lehet, hogy mind2.

    Apropó, barát:

    csinálj egy controller osztályt, aminek van 3 mutatója: egy a pálya, egy a játékosok tömb (elemei játékos ojjektumok), egy meg nem tudom még mi, amit akarsz. mindegyik osztály konstruktorában megadsz neki egy, a controller objektumra mutató pointert, és azon keresztül is símán el tudják magukat érni. egy játékban egyébként is szükséged van egy vezérlő-objektumra.
    Mutasd a teljes hozzászólást!
  • Na ez egy tipikusnak mondott (Scott Meyers szerint legalábbis) programozó-hiba: az öröklődés keverése az általános "függőség"-fogalommal.

    A felsoroltak közül az Application (így hangzására) tényleg őse a Dyna-nak, de ennyi. A Dyna ui. valóban egy speciális application, de a player, bomba, map egyike sem egy speciális Dyna (a Dyna2.0, DynaLahos, stb. na az talán az lenne).

    A Dyna mint application(ez az, amit _sin_ controller osztályként említ), na annak van három mezeje, egy a térkép, egy a Player tömb, egy az aktív bomba-tömb (bár ez inkább lánc lehet, ha jól emlékszem, mindenféle powerupokkal egész sok bombát lehetett egyszerre lerakni, legyen inkább láncolt lista).

    Minden ellenőrzést, mozgatást, stb. csináljon a Dyna osztály, és legfeljebb üzenetet küldözgessen a játékosoknak, hogy mi történik éppen. A koordinátákat is a Dyna osztály állítsa, hiszen ő ismeri a térképet (a player küld egy üzit a dynanak, hogy szeretne lépni, erre a dyna válaszol egy olyat, hogy változtatja a player koordinátáit, ha léphet).

    _sin_ már mindent elmondott.

    --ajven
    Mutasd a teljes hozzászólást!
  • tévedsz, a lerakott bombák tovább ketyegnek, és ha robbannak, akkor ellenőrizniük kell, hogy nincsenek e útban a játékosok

    nincs köze: értsd: nem a játékos objektum határozza meg azt hogy mikor robban, hanem a pályát vezérlő objektum, ami a játékos elmozdulási "kérelméből" határozza meg hogy a lerakott bomba kit kapott telibe.
    Mutasd a teljes hozzászólást!
  • Ésha átadják a kész objektumokat egymásnak? Pl a bomba felrobbanására legyen a TBomb osztálynak egy EXPLODE eljárása, és az paraméterbe kapja meg a Players osztályt. Igy nem jó?
    Mutasd a teljes hozzászólást!
  • Szia, és ha normális, az ehhez a feladathoz való progit használsz? pl. Blitz3D, egy próbát megérne.

    Üdv.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd