AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Andorra 2D --- zwei Variablen und ein AdDraw
Thema durchsuchen
Ansicht
Themen-Optionen

Andorra 2D --- zwei Variablen und ein AdDraw

Ein Thema von Looper · begonnen am 12. Jun 2008 · letzter Beitrag vom 13. Jun 2008
Antwort Antwort
Looper

Registriert seit: 28. Sep 2007
Ort: Hamburg
131 Beiträge
 
Delphi XE2 Professional
 
#1

Andorra 2D --- zwei Variablen und ein AdDraw

  Alt 12. Jun 2008, 22:22
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.
FAdDraw := AdDraw 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.

schonmal Danke im Voraus, mfg Looper
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Andorra 2D --- zwei Variablen und ein AdDraw

  Alt 12. Jun 2008, 22:50
Dann zeigen beide Variablen auf das selbe Objekt, richtig. Das ist bei allen Klassen so.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Looper

Registriert seit: 28. Sep 2007
Ort: Hamburg
131 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Andorra 2D --- zwei Variablen und ein AdDraw

  Alt 13. Jun 2008, 13:50
Dann habe ich keine Ahnung wieso das nicht funktioniert, wie ich will.

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:
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;
Und die Prozedur forwd sieht wiefolgt aus:
Delphi-Quellcode:
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;
In dem Timer steht nun nur:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Sp.forwd(1);
  Caption := IntToStr(Sp.GetPosition.X) + '|' + IntToStr(Sp.GetPosition.Y);
  AdDraw.Flip;
end;
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?

mfg Looper
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Andorra 2D --- zwei Variablen und ein AdDraw

  Alt 13. Jun 2008, 13:52
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.
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Andorra 2D --- zwei Variablen und ein AdDraw

  Alt 13. Jun 2008, 15:56
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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Looper

Registriert seit: 28. Sep 2007
Ort: Hamburg
131 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Andorra 2D --- zwei Variablen und ein AdDraw

  Alt 13. Jun 2008, 17:29
Guten abend,

erstmal danke für eure Tipps.
Ich habe nun das Problem gefunden:
Delphi-Quellcode:
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;
ist was anderes als
Delphi-Quellcode:
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;
bei dem unteren Beispiel wird die Linie gezeichnet, während dies bei dem oberen nicht der Fall ist.

mfg Looper
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz