![]() |
Andorra 2D --- zwei Variablen und ein AdDraw
Abend alle zusammen,
habe da mal eine Frage. Wenn ich in einer Unit einer Variable mit dem Namen "AdDraw" den Typ "TAdDraw" zuordne, kann ich dann in einer zweiten Unit im selben Projekt sagen.
Delphi-Quellcode:
Natürlich ist FAdDraw auch vom Typ TAdDraw. Dann würden theoretisch doch beide Variablen den selben Pointer haben, oder ist dies praktisch nicht umsetzbar.
FAdDraw := AdDraw
schonmal Danke im Voraus, mfg Looper |
Re: Andorra 2D --- zwei Variablen und ein AdDraw
Dann zeigen beide Variablen auf das selbe Objekt, richtig. Das ist bei allen Klassen so.
|
Re: Andorra 2D --- zwei Variablen und ein AdDraw
Dann habe ich keine Ahnung wieso das nicht funktioniert, wie ich will. :gruebel:
Ich habe meine MainUnit wo ich das AdDraw erzeuge und wo in einem Timer immer AdDraw.Flip aufrufe. Dann habe ich einen eigenen Typ definiert:
Delphi-Quellcode:
Und die Prozedur forwd sieht wiefolgt aus:
type
TSpieler = class private FX, FY, FWinkel : Double; FFarbe : TAndorraColor; FAdDraw : TAdDraw; FBreite : Double; FVisible : Boolean; public Name : String; constructor Create (AdDraw : TAdDraw); destructor Destroy; override; procedure forwd (Pixel : Integer); procedure left (Grad : Integer); procedure right(Grad : Integer); function GetPosition : TAdPoint; property X: Double read FX write FX; property Y: Double read FY write FY; property Winkel : Double read FWinkel write FWinkel; property Farbe : TAndorraColor read FFarbe write FFarbe; property Breite : Double read FBreite write FBreite; property Visible : Boolean read FVisible write FVisible; end;
Delphi-Quellcode:
In dem Timer steht nun nur:
procedure TSpieler.forwd(Pixel : Integer);
begin FX := FX + Pixel * cos(pi * (90.0 + Winkel)/ 180.0); FY := FY - Pixel * sin(pi * (90.0 + Winkel)/ 180.0); if FVisible then begin FAdDraw.BeginScene; with FAdDraw.Canvas do begin Pen.Color := FFarbe; //Ad_ARGB(100,100,100,100) Brush.Color := FFarbe; //Ad_ARGB(100,100,100,100) Pen.Width := FBreite; //FBreite = 1 FAdDraw.Canvas.LineTo(round(FX),round(FY)); Release; end; FAdDraw.EndScene; FAdDraw.Flip; end; end;
Delphi-Quellcode:
An der Caption kann ich erkennen, dass die Positionen sich richtig verändern, nur es wird halt nichts gezeichnet und ich weiß einfach nicht wieso. Weiß vielleicht von euch jemand wo mein Fehler liegt?
procedure TForm1.Timer1Timer(Sender: TObject);
begin Sp.forwd(1); Caption := IntToStr(Sp.GetPosition.X) + '|' + IntToStr(Sp.GetPosition.Y); AdDraw.Flip; end; mfg Looper |
Re: Andorra 2D --- zwei Variablen und ein AdDraw
Hi,
es ist ganz schlecht, die Grafikausgabe mit der Logik zu verbinden. Besser wäre es, Du hast Deine Klasse TSpieler, dort werden nur die Berechnungen durchgeführt und eine neue Klasse (z.B. TDrawGame oder was auch immer *g*), die sich um das Malen kümmert. |
Re: Andorra 2D --- zwei Variablen und ein AdDraw
Alle Grafikausgaben sollten auf einen Rutsch stattfinden, also
Delphi-Quellcode:
AdDraw.ClearSurface(clBlack);
AdDraw.BeginScene; //Führe Spiellogik aus DoLogic; //Zeichne alle Objekete DoDraw; AdDraw.EndScene; AdDraw.Flip; //Flip bringt die gezeichneten Objekte zum vorschein, darf nur einmal pro Renderdurchgang aufgerufen werden |
Re: Andorra 2D --- zwei Variablen und ein AdDraw
Guten abend,
erstmal danke für eure Tipps. Ich habe nun das Problem gefunden:
Delphi-Quellcode:
ist was anderes als
procedure TSpieler.forwd(Pixel : Integer);
begin FX := FX + Pixel * cos(pi * (90.0 + Winkel)/ 180.0); FY := FY - Pixel * sin(pi * (90.0 + Winkel)/ 180.0); if FVisible then begin FAdDraw.BeginScene; with FAdDraw.Canvas do begin Pen.Color := FFarbe; Brush.Color := FFarbe; Pen.Width := FBreite; FAdDraw.Canvas.LineTo(round(FX),round(FY)); Release; end; FAdDraw.EndScene; FAdDraw.Flip; end; end;
Delphi-Quellcode:
bei dem unteren Beispiel wird die Linie gezeichnet, während dies bei dem oberen nicht der Fall ist.
procedure TSpieler.forwd(Pixel : Integer);
var NeuX, NeuY : Double; begin NeuX := FX + Pixel * cos(pi * (90.0 + Winkel)/ 180.0); NeuY := FY - Pixel * sin(pi * (90.0 + Winkel)/ 180.0); if FVisible then begin FAdDraw.BeginScene; with FAdDraw.Canvas do begin Pen.Color := FFarbe; Brush.Color := FFarbe; Pen.Width := FBreite; FAdDraw.Canvas.MoveTo(round(FX),round(FY)); FAdDraw.Canvas.LineTo(round(NeuX),round(NeuY)); Release; end; FAdDraw.EndScene; FAdDraw.Flip; FX := NeuX; FY := NeuY; end; end; mfg Looper |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:34 Uhr. |
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