Buonasera a tutti.
Visto le ultime zone "arancio rafforzate" mi ritrovo qualche ora libera e mi ritorna la voglia di "giocare" con Delphi.
Vorrei costruire un RPG ispirato al vecchio MERP, dunque ho preso carta e matita e ho iniziato a graficare le varie idee e
mi ritrovo nella situazione di avere almeno 3 classi base:
1) TWorld
2) TMap
3) TElement (Torri, Dungeon, Cave, Villaggi, ect ect )
Oltre ovviamente a quelle dei personaggi, ma non ci sono ancora arrivato.
Cmq queste 3 classi (volendo tenerle divise) si intrecciano tra di loro e solo a pensare ai vari "circular reference" mi vengono gli incubi, dunque
avrei pensato all'uso delle interfacce, ma ovviamente per un semplice hobbysta è come imparare il turco in qualce secondo, cmq ho
studiato (diciamo che ho usato il "bignami" di Marco Cantu "Object Pascal HandBook D10.4" ).
Da qui ho preso qualche spunto.
Qualche anima pia che probabilmente ci capisce più di me saprebbe dirmi se sono nella strada giusta.
Grazie
Di seguito includo i vari pezzi di codice che al momento sono più sulla carta che ....
La unit base delle interfacce
unit u.intf;
interface
uses u.TypeInfo;  // dichiarazioni comuni
type
  IElement = interface
    ['{0DBB9EE1-8899-4636-AB64-10923272EDD6}']
    Procedure Initialize;  // inizializzazione del labirinto
  end;
  IMap = interface
    ['{73B64E91-79B8-4D09-98D0-537B0E2D31B5}']
  End;
  IWorld = interface
  ['{B984A27E-FD31-4638-9317-CE1E881721CE}']
    Function Getdungeon: aDungeon;  // array [X,Y]
    Function GetdungeonPosition: aCoordinates; // tpoint x + y
    Function GetdungeonRoom: Integer;
    Function GetMap: IMap;    // riferimento alla mappa
    Procedure Setdungeon(Const Value: aDungeon);
    Procedure SetdungeonPosition(Const Value: aCoordinates);
    Procedure SetdungeonRoom(Const Value: Integer);
    Procedure SetMap(Const Value: IMap);
    property dungeon: aDungeon read Getdungeon write Setdungeon;
    property dungeonPosition: aCoordinates read GetdungeonPosition write SetdungeonPosition;
    Property dungeonRoom: Integer read GetdungeonRoom write SetdungeonRoom;
    property oMap: IMap read GetMap write SetMap;
  end;
La classe tworld
unit u.world;
interface
uses  u.intf  // riferimento alle interfacce
    , u.TypeInfo  // dichiarazioni comuni
    ;
type
  TWorld = class(TInterfacedObject, IWorld)
  private
    foMap: IMap;
    fodungeon: aDungeon;
    fodungeonPosition: aCoordinates;
    fodungeonRoom: Integer;
    Function Getdungeon: aDungeon;  // array [X,Y]
    Function GetdungeonPosition: aCoordinates; // tpoint x + y
    Function GetdungeonRoom: Integer;
    Function GetMap: IMap;    // riferimento alla mappa
    Procedure Setdungeon(Const Value: aDungeon);
    Procedure SetdungeonPosition(Const Value: aCoordinates);
    Procedure SetdungeonRoom(Const Value: Integer);
    Procedure SetMap(Const Value: IMap);
  public
    property dungeon: aDungeon read Getdungeon write Setdungeon;
    property dungeonPosition: aCoordinates read GetdungeonPosition write SetdungeonPosition;
    Property dungeonRoom: Integer read GetdungeonRoom write SetdungeonRoom;
    property oMap: IMap read GetMap write SetMap;
  end;
  --- ometto le implementazioni
le altre classi sono simili, la chiamata principale
 
  MainWorld := TWorld.Create;
  MainMap   := TMap.Create(GraphCDS);  // uso un CDS per caricare le bitmap
  Cave_Alpha := TCave.Create;    // questa è un IElement
  MainWorld.oMap := MainMap;      // la mappa sul mondo
  MainMap.oWorld := MainWorld;    // il mondo sulla mappa
  Cave_Alpha.oMap := MainMap;     // Test per un elemento di tipo cava sulla mappa
  Cave_Alpha.oWorld := MainWorld; // assegno il mondo alla cave ... anche se ci posso arrivare dalla mappa
  MainMap.oCave := Cave_Alpha;    // e viceversa  ... per ora singolo ma pensavo a lista di generici
  MainMap.SetupMap;               // inizializzo tutto
  
Il mio problema è soprattutto questo .... tutte queste assegnazioni non mi piaciono, esiste qualcosa di più "pulito", sto seguendo la strada giusta ??
Un Saluto N.