Thema: Delphi map editor

Einzelnen Beitrag anzeigen

guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#9

Re: map editor

  Alt 6. Okt 2009, 13:37
Mal ein rudimentärer Ansatz für dein Problem:

Delphi-Quellcode:
  TItemAction = procedure (Sender: TMapItem) of Object;

  TMapItem = class
  private
    FPosition : TPoint; //Enthält die Rasterposition in der Map
    FImageIndex: Integer; //Bildindex für die Bildliste
    FAction: TItemAction; //Ereignisbehandlung, wenn das Item geklickt wird
  public
    constructor Create(Position: TPoint);
    property Position: TPoint read FPosition;
    property OnAction: TItemAction read FAction write FAction;
  end;

  TMap = class(TGraphicControl)
  private
    FImageList: TImageList; //Bildliste für die darzustellenden Icons
    FRowsCount: Integer; //Anzahl der Reihen in der Map
    FColumnsCount: Integer; //Anzahl der Spalten in der Map
    FItems: TObjectList; //Enthält die bereits bearbeiteten Zellen
    procedure SetRowsCount(const Value: Integer);
    procedure SetColumnsCount(const Value: Integer);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property RowsCount: Integer read FRowsCount write SetRowsCount;
    property ColumnsCount: Integer read FColumnsCount write SetColumnsCount;
  end;
TMapItem ist ein einzelnes Feld in deinder Map. Es enthält seine Position im Raster, einen ImageIndex für sein Icon und ein Ereignis, in dem du programmieren kannst, was beim Klicken auf das Feld passieren soll, o.ä.

TMap ist die eigentliche Karte. Hier werden alle eingefügten MapItems in einer Liste verwaltet. Hier wird auch das Klicken auf die Map verwaltet. Die Icons, sind alle in einer ImageList gespeichert und werden anhand des ImageIndex von TMap auf den Canvas gezeichnet. Interessant daran wäre z.B. auch, dass du die Karte auch relativ einfach vergrößern oder verkleinern kannst, indem du die Icons mit StretchBlt auf das Canvas kopierst.

Das Zeichnen könnte nun so aussehen, dass du jede Zelle, Reihe für Reihe, durchgehst und in FItems nachschaust, ob bereits etwas vorhanden ist. Falls ja wird an diese Stelle im Canvas das entsprechende Bild gezeichnet, falls nein ein "Empty"-Image. Edit: Ok, vermutlich ist es wesentlich schneller, zunächst eine leere Map zu zeichnen und anschließend die Liste durchzugehen und die vorhandenen Icons an die entsprechende Position zu kopieren.

Was in dem Quellcode drin steckt ist natürlich nur ein Ansatz von dem, was ich grad mal beschrieben habe. Da ist noch viel zu implementieren.
  Mit Zitat antworten Zitat