unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,AdDraws, AdClasses, AdSprites,AdPhysics, AdPng;
type
TForm1 =
class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
public
AdDraw1:TAdDraw;
{Fläche auf der gemalt wird}
AdPerCounter:TPerformanceCounter;
{Misst die Zeit von Frame zu Frame}
AdSpriteEngine: TSpriteEngine;
AdImageList1:TPictureCollection;
{Verwaltet die Zeichenobjekte}
Slected:TSprite;
dx,dy : integer;
procedure Idle(Sender:TObject;
var Done:boolean);
{Wird aufgerufen, wenn Form nichts zu tun hat}
procedure UpdatePosition;
{Verändert die Positionen der Zeichenobjekte inkl. Rotation}
{ Public-Deklarationen }
end;
const
AnzObj = 5;
{Wieviele Objekte sollen gezeichnet werden}
var
Form1: TForm1;
obj :
array[1..AnzObj,1..6]
of single;
{Verwaltet x,y-Koordinate, Richtung + Geschwindigkeit, Rotationswinkel}
objw,objh : Integer;
{speichert die Höhe und Breite des geladenen Bitmaps}
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
begin
randomize;
{Zufallgenerator neu mischen}
AdDraw1 := TAdDraw.Create(self);
{Zeichenobjekt wird erzeugt}
AdDraw1.DllName := '
AndorraDX93D.dll';
{Verbindung zu DirectX.dll wird hergestellt}
AdPerCounter := TPerformanceCounter.Create;
{Zeitmesser wird erzeugt}
if AdDraw1.Initialize
then {wenn das Initialisieren von ADraw1 geklappt hat}
begin
Application.OnIdle := Idle;
{Wenn Form1 nicht zu tun hat, Idle aufrufen}
AdImageList1 := TPictureCollection.Create(AdDraw1);
{Imagelist erzeugen}
AdSpriteEngine := TSpriteEngine.Create(
Nil);
AdSpriteEngine.Surface := AdDraw1;
AdImageList1.Add('
Fels').Texture.LoadGraphicFromFile('
Stern.png',true,clWhite);
{aus Stern.bmp laden, Maske=true, Maskenfarbe = clWhite}
AdImageList1.Restore;
{Irgenwas internes}
objw := AdImageList1.find('
Fels').Width;
{Breite und Höhe in globalen Variablen speichern}
objh := AdImageList1.find('
Fels').Height;
with TPhysicalApplication.Create(AdSpriteEngine)
do
begin
SolverModel := smLinear;
end;
for i:= 1
to AnzObj
do {erzeugen wir je Zeichenobjekt zufällige Position, Richtungs und Winkelinformationen}
begin
obj[i,1] := random(form1.Clientwidth);
obj[i,2] := random(form1.ClientHeight);
obj[i,3] := random(200)-random(200);
obj[i,4] := random(200)-random(200);
obj[i,5] := random(360);
obj[i,6] := random(20)-random(20);
With TPhysicalCylinderSprite.Create(AdSpriteEngine)
do
begin
x := obj[i,1];
y := obj[i,2];
Image := AdImageList1.Find('
Fels');
Mass := 10;
Angle := obj[i,5];
NtVector3f(200,200,0);
InitializeShape;
end;
end;
end
else
begin
ShowMessage('
Error while initializing Andorra 2D. Try to use another display'+
'
mode or another video adapter.');
halt;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
AdDraw1.Free;
AdSpriteEngine.Free;
AdPerCounter.Free;
AdImageList1.Free;
end;
procedure TForm1.Idle(Sender: TObject;
var Done: boolean);
begin
if AdDraw1.CanDraw
then
begin
AdPerCounter.Calculate;
{wie lange ist seit dem letzten Aufruf vergangen?}
Caption := '
FPS:'+inttostr(AdPerCounter.FPS);
{FPS in Titelzeile ausgeben}
AdDraw1.ClearSurface(clBlack);
{Zeichfläche mit Schwarz löschen}
AdDraw1.BeginScene;
AdSpriteEngine.Move(AdPerCounter.TimeGap / 1000);
AdSpriteEngine.Draw;
AdSpriteEngine.Dead;
AdDraw1.EndScene;
AdDraw1.Flip;
{gezeichnete Scene darstellen}
end;
Done := false;
end;
end.