Einzelnen Beitrag anzeigen

Leanahtan

Registriert seit: 5. Jun 2009
62 Beiträge
 
Turbo Delphi für Win32
 
#1019

AW: Andorra 2D [Ver. 0.4.5.1, 31.12.08]

  Alt 14. Sep 2011, 00:26
über Patches freue ich mich natürlich immer.
Naja, davon bin ich wohl Meilenweit entfernt ^^ Ich halte es sogar für unwahrscheinlich, dass es mir tatsächlich gelingt, unser gesamtes Projekt umzustellen. Schön wäre es, wenn mir das zumindest für den Mapeditor gelingt. Ist auch nicht ganz trivial, da folgende Komponente ersetzt/umgeschrieben werden müsste:

https://xforceffd.svn.sourceforge.ne...s/IsoKDMap.pas

Momentan probiere ich etwas mit unserem Skripteditor. Dort muss eigentlich nur ein Bild erstellt und angezeigt werden, und selbst dass hat mir ziemlich Probleme gemacht. Letztlich muss ich irgendwo AdDraw.Restore aufrufen (weiß aber nicht warum, oder an welcher Stelle ich das machen soll, damit es nicht öfter als nötig aufgerufen wird) oder AdDraw erst später erzeugen (nicht bei FormCreate). Sonst bleibt mein Fenster nach dem öffnen schwarz.

Delphi-Quellcode:
{$I ..\settings.inc}
unit frmMap;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, frmChild, MapGenerator, ISOMapTypes, ExtCtrls{$IFDEF ANDORRA2D}, AdDraws, AdClasses,AdTypes{$ENDIF};

type
  TShowMapForm = class(TForm)
    MapPreviewImage: TImage;
    AdDrawPanel: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure AdDrawRestore;
    procedure FormResize(Sender: TObject);
  private
    MapBitmap : TBitmap;
    {$IFDEF ANDORRA2D}
    AdImageList:TAdImageList;
    AdDraw :TAdDraw;
    {$ENDIF}
    MapFieldDataArray : Array of Array of TMapFieldData;
    { Private-Deklarationen }
  public
    {$IFDEF ANDORRA2D}
    procedure DrawMapAd(Sender:TObject; var Done:boolean);
    {$ENDIF}
    procedure ShowMap(const Map: TMapGenerator);

    { Public-Deklarationen }
  end;

var
  ShowMapForm: TShowMapForm;

implementation

uses
  Defines, TileSetTypes;
{$R *.DFM}

{ TShowMapForm }

procedure TShowMapForm.FormCreate(Sender: TObject);
var
 i,j : integer;
begin
  AdDraw:=nil;
  MapBitmap:=TBitmap.Create;
end;

procedure TShowMapForm.FormDestroy(Sender: TObject);
begin
  {$IFDEF ANDORRA2D}
  if AdImageList <> nil then AdImageList.Free;
  if AdDraw <>nil then AdDraw.Free;
  {$ENDIF}
  MapBitmap.Free;
end;

procedure TShowMapForm.FormResize(Sender: TObject);
begin
  AdDrawRestore;
end;

{$IFDEF ANDORRA2D}
procedure TShowMapForm.AdDrawRestore;
begin
  if AdDraw = nil then
    AdDraw := TAdDraw.Create(AdDrawPanel);
  AdDraw.DllName := 'AndorraOGL.dll';
  if AdDraw.Initialize then
  begin
    if AdImageList = nil then
    begin
      AdImageList:=TAdImageList.Create(AdDraw);
      AdImageList.Add('Map');
    end;
    AdImageList.Find('Map').Texture.LoadFromGraphic(MapBitmap);
    AdImageList.Restore;
    Application.OnIdle := DrawMapAd;
  end
  else
  begin
    ShowMessage(AdDraw.GetLastError);
    exit;
  end;
  AdDrawPanel.Width:=AdImageList.Find('Map').Width;
  AdDrawPanel.Height:=AdImageList.Find('Map').Height;
end;
{$ENDIF}

procedure TShowMapForm.ShowMap(const Map: TMapGenerator);
begin
  // hier wird MapBitmap aus den Kartendaten + Tilesets zusammengesetzt
  // (später statt Bitmap vielleicht über TAdImageList)
end;

{$IFDEF ANDORRA2D}
procedure TShowMapForm.DrawMapAd(Sender:TObject; var Done:boolean);
begin
  if AdDraw.CanDraw then //Wenn überhaupt auf das AdDraw gezeichnet werden kann dann...
  begin
    AdDraw.ClearSurface(clBlack);
    with AdImageList.Find('Map') do
    begin
      AdDraw.BeginScene;
      AdImageList.Find('Map').Draw(AdDraw,0,0,0);
      AdDraw.EndScene;
    end;
    AdDraw.Flip; //Präsentiert die gezeichneten Dinge auf dem Bildschirm.
  end;
end;
{$ENDIF}
Derzeit benutze ich als Notlösung das Resize-Event, um AdDraw.Initialize aufzurufen, und die Karte zu laden. Ursprünglich wollte ich die Karte direkt nach dem Erstellen von MapBitmap in AdImageList laden, aber wie gesagt, dann bleibt alles schwarz.

Den Umweg über ein Panel brauche ich, um Scrollbars zu bekommen, sobald die Karte größer ist, als das Fenster (gibts dafür eine interne Lösung in Andorra 2D, also Anzeige in vorgegebenen Bereich, aber wenn zu zeichnende Textur größer ist, Scrollbars?)).
Wenn ich die Karte einfach Zoomen will, muss ich wohl auf SpriteEngine ausweichen, oder? Hätte das Auswirkungen auf die Geschwindigkeit?

Gibt es irgendeine Möglichkeit, den Inhalt eines AdImage als bmp zu speichern? Weß sonst nicht, wie ich prüfen kann, ob bei fehlerhaften Draw ein Problem bei AdImageList.Find(...).Draw vorliegt, oder bei AdDraw selbst.

Geändert von Leanahtan (14. Sep 2011 um 07:37 Uhr)
  Mit Zitat antworten Zitat