ü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.