Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   [Andorra2d]: keine Form-Events? (https://www.delphipraxis.net/113643-%5Bandorra2d%5D-keine-form-events.html)

EugenB 12. Mai 2008 06:59


[Andorra2d]: keine Form-Events?
 
Hey Leute,

ich fange grade an mich in Andorra einzuarbeiten, aber ich komme nicht weiter ^^, die MouseEvents werden nicht ausgeführt.

Habe die Version 0.35.

In den Demos: BreakOut, Physics oder auch PixelCheck werden anscheinend die Events ausgeführt ( habe diese noch nicht versucht zu compilieren), aber habe mir den Code von zb Physics 1 zu 1 kopiert, doch es wird nicht ausgeführt :(

Gehen diese Events bei Lazarus/Freepascal nicht? Oder fehlt irgendeine Einstellung die ich übersehen habe? :(

Hier ist mein Quellcode (falls nötig ^^):
Delphi-Quellcode:
unit umainengine;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
  AdDraws, AdClasses, AdTypes, ExtCtrls, AdPerformanceCounter,AdSprites,
  ComCtrls, AdEvents;

type

  { TKarte }
  TFigur = class(TImageSprite)
     public
       constructor Create(AParent:TSprite);override;
  end;

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

  private
    { private declarations }
  public
    { public declarations }
    AdDraw:TAdDraw;
    AdImageList: TAdImageList;
    AdPerCounter:TAdPerformanceCounter;
    AdSpriteEngine:TSpriteEngine;
    Selected:TSprite;
    Figur: TFigur;
    dx,dy:integer;
    procedure Idle(Sender: TObject; var Done: boolean);
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);

begin
  AdPerCounter := TAdPerformanceCounter.Create;

  AdDraw := TAdDraw.Create(Self);
  AdDraw.DllName := 'AndorraOGLLaz.dll';
  //AdDraw.Window.Events.OnMouseDown:=@FormMouseDown;

  Application.OnIdle := @Idle;
  AdDraw.Initialize;
 
  AdImageList := TAdImageList.Create(AdDraw);
  AdImageList.LoadFromFile('karten.ail');
 
  AdSpriteEngine := TSpriteEngine.Create(AdDraw);
  //AdSpriteEngine.Surface := AdDraw;
 
  Figur := TFigur.Create(AdSpriteEngine);
  with Figur do
  begin
     //Dem ImageSprite ein Bild zuweisen
     Image := AdImageList.Find('caro_2');
     //Die Animation aktiv schalten
     AnimActive := true;
     //Die Animation soll sich ständig wiederholen
     AnimLoop := true;
     //Die Animation soll mit 15 FPS abgespielt werden
     AnimSpeed := 15;
     
     PixelCheck:=true;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  AdImageList.Free;
  AdSpriteEngine.Free;
  AdPerCounter.Free;
  //AdDraw.Free;
end;

//Mouse events for moving the elements
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Selected := AdSpriteEngine.GetSpriteAt(X,Y);
  if (Selected <> nil) then
  begin
    dx := round(Selected.WorldX - X);
    dy := round(Selected.WorldY - Y);
    //TPhysicalSprite(Selected).ActivateNeighbours;
    //TPhysicalSprite(Selected).Active := false;
  end
  else
  begin
    Selected := nil;
  end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Selected <> nil then
  begin
    Selected.X := X + dx;
    Selected.Y := Y + dy;
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Selected <> nil then
  begin
    //TPhysicalSprite(Selected).Active := true;
  end;
  Selected := nil;
end;



procedure TForm1.Idle(Sender: TObject; var Done:boolean);
begin
  AdDraw.ClearSurface(clBlack);
  AdDraw.BeginScene;
  with AdDraw.Canvas do
  begin
    AdPerCounter.Calculate;
    Caption := 'FPS:'+inttostr(AdPerCounter.FPS);

    Font := AdDraw.Fonts.GenerateFont('Arial', 24, []);
    TextOut(0,0,'Andorra 2D...');
    Font := AdDraw.Fonts.GenerateFont('Arial', 10, []);
    TextOut(0,30,'...works with Lazarus too');
   
    //AdImageList.Find('caro_2').Draw(AdDraw,50,50,0);
  end;
  AdSpriteEngine.Move(AdPerCounter.TimeGap / 1000);
  AdSpriteEngine.Draw;
  //Alle als mit "Dead" als "tot" makierten Sprites löschen
  AdSpriteEngine.Dead;
 
  AdDraw.EndScene;
  AdDraw.Flip;
 
  Done := False;
end;

{ TFigur }

constructor TFigur.Create(AParent: TSprite);
begin
  inherited;
  //Am Punkt (0;0) starten.
  X := 0;
  Y := 0;

  //XSpeed auf -150 setzten
  XSpeed := -150;
end;

initialization
  {$I umainengine.lrs}

end.
MfG,
Eugen

Matze 12. Mai 2008 07:28

Re: [Andorra2d]: keine Form-Events?
 
Hallo Eugen!

Hast du den Code komplett (auch die Prozeduren/Deklarationen) kopiert oder hast du die Ereignisse über den Objektinspektor (Reiter: Ereignisse) angelegt?

Falls du alles nur kopiert hast, musst du im Objektinspektor im genannten Reiter aus den jeweiligen DropDpwn-Boxen die Ereignisse noch den Komponenten zuweisen.

Grüße, Matze

EugenB 12. Mai 2008 08:02

Re: [Andorra2d]: keine Form-Events?
 
Die Ereignisse sind der Form1 zugewiesen. Aber es funktioniert leider nicht :(

toms 12. Mai 2008 08:12

Re: [Andorra2d]: keine Form-Events?
 
Werden die Ereignisse nicht ausgeführt oder ist Selected = nil ?

EugenB 12. Mai 2008 08:15

Re: [Andorra2d]: keine Form-Events?
 
Werden nicht ausgeführt habe auch noch versucht bei MouseDown ein ShowMessage anzuzeigen aber wurde nicht ausgeführt

igel457 12. Mai 2008 09:29

Re: [Andorra2d]: keine Form-Events?
 
Hm,

ehrlich gesagt habe ich das noch gar nicht ausprobiert.

Beim Initialisieren von Andorra 2D schleife ich die Events nämlich über AdDraw.Window.Events. Versuche eine Methoden mal damit "per Hand" zu verknüpfen. Also:
Delphi-Quellcode:
AdDraw.Window.Events.OnMouseMove := FormMouseMove;
Eventuell musst du die Parameterliste noch ein wenig anpassen: Du musst dir die Deklaration des entsprechenden Events in der Unit "AdEvents" betrachten.

EugenB 12. Mai 2008 12:38

Re: [Andorra2d]: keine Form-Events?
 
Zitat:

Zitat von igel457
Hm,

ehrlich gesagt habe ich das noch gar nicht ausprobiert.

Beim Initialisieren von Andorra 2D schleife ich die Events nämlich über AdDraw.Window.Events. Versuche eine Methoden mal damit "per Hand" zu verknüpfen. Also:
Delphi-Quellcode:
AdDraw.Window.Events.OnMouseMove := FormMouseMove;
Eventuell musst du die Parameterliste noch ein wenig anpassen: Du musst dir die Deklaration des entsprechenden Events in der Unit "AdEvents" betrachten.

Das wollte ich auch schon mal versuchen aber sofort beim Zuweisen des Events bekomme ich eine Zugriffsverletzung :(

Edit:
So habe die Physics-Demo unter Lazarus zum laufen bekommen, ABER die MouseEvents werden nicht berücksichtigt.

Hat schon jemand es geschafft unter Lazarus irgendwelche MouseEvents zumlaufen zubekommen?^^

EugenB 12. Mai 2008 23:14

Re: [Andorra2d]: keine Form-Events?
 
So

konnte diese Events jetzt so zugewiesen:
AdDraw.Window.Events.OnMouseMove := FormMouseMove; usw

Jedoch werden diese nicht ausgeführt

Also ist es wohl eher ein Bug welcher nur bei FreePascal auftaucht :(, schade hab mich gefreut bissel mit Andorra zuarbeiten^^ naja hoffe es wird in den nächsten Versionen korigiert

igel457 13. Mai 2008 13:22

Re: [Andorra2d]: keine Form-Events?
 
Gehe das Programm doch einfach mal mit dem Debugger Schritt für Schritt durch und schaue ob innerhalb der Zuweisung der Events (in TAdLCLOGLComponentWindow.SetupEvents) irgendwo ein Fehler auftritt.

EugenB 13. Mai 2008 16:37

Re: [Andorra2d]: keine Form-Events?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von igel457
Gehe das Programm doch einfach mal mit dem Debugger Schritt für Schritt durch und schaue ob innerhalb der Zuweisung der Events (in TAdLCLOGLComponentWindow.SetupEvents) irgendwo ein Fehler auftritt.

Hab ich gemacht, doch leider wird die Funktion nicht bis zu ende ausgeführt, weil ...

Delphi-Quellcode:
if FControl.Owner is TForm then
    FForm := TForm(FControl.Owner)
  else
    exit;
wegen diesen 4 Zeilen wird die Funktion sofort beendet. Nun gut also hab ich mal die erste und die letzten beiden auskommentiert. Beim durchlaufen der Funktion kamen keine Fehler.

Immernoch kein MouseEvent. Dann hab ich mir die Funktion TAdLCLOGLComponentWindow.MouseDown angeschaut und diese auch beim Debuggen durchgegangen. Das Ergebnis war es wurde kein Event Zugewiesen, obwohl bei der SetupEvents keine Fehler auftraten. Nun gut habe ich mal wieder versucht die Events per Hand zuzuweisen und tada der MouseEvent wurde ausgeführt jippiee ^^

Delphi-Quellcode:
AdDraw.Window.Events.OnMouseDown:=@FormMouseDown;
  AdDraw.Window.Events.OnMouseMove:=@FormMouseMove;
  AdDraw.Window.Events.OnMouseUp:=@FormMouseUp;
Also zusammengefasst:
Da die Funktion TAdLCLOGLComponentWindow.SetupEvents sofort beendet wird, können keine Events dem FContext zugewiesen werden und somit auch keine externen Zuweisungen.

Die Events der Form werden nicht in die AdDraw.Window.Events übernommen. Und da wäre auch der Fehler ^^.

Bei TAdVCLComponentWindow.SetupEvents werden anscheinend die Events übernommen, aber diese habe ich noch nicht probiert zu compilieren.

Naja wie auch immer, es funktioniert wenn man die 3 Zeilen (s.o) auskommentiert und die Events per Hand zuweist.

Ich hätte noch einen Lösungsvorschlag für die TAdLCLOGLComponentWindow-Klasse.

Man muss keine Events per AdDraw.Window.Events hinzufügen, die Events der Form werden sofort von der TAdLCLOGLComponentWindow-Klasse aus aufgerufen. Bisher nur OnMouseDown/Move/Up bearbeitet.

Siehe Anhang. :-)

Und schon funktionieren Events unter Lazarus / Freepascal.

Bleibt nurnoch der Fehler mit dem AdDraw.Free^^.

MfG,
Eugen


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz