Einzelnen Beitrag anzeigen

Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#93

Re: Andorra 2D - The Next Generation 2D Engine [Ver. 0.15]

  Alt 14. Mär 2007, 22:35
Hi,

inzwischen habe ich die Newton-Engine eingebunden. Die ersten Sprites fallen auch schon zu Boden!

Jetzt aber 2 Fragen:

1. Wie bekomme ich jetzt die Gravitation ausgeschaltet (nicht Mass := 0, da ansonsten bei einer Kollision kaum Wirkung erzielt wird)

2. Wie gebe ich den Sprites eine Geschwindigkeit mit (habe schon irgendwas mit ntVector3f oder AdVector2 ausprobiert, funzt aber nicht)

Hier der dazugehörige Code:

Delphi-Quellcode:
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.
Gruß, Andreas
  Mit Zitat antworten Zitat