Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [DelphiX] DXDraw.surface "clearen"... (https://www.delphipraxis.net/62252-%5Bdelphix%5D-dxdraw-surface-clearen.html)

fabiO 1. Feb 2006 21:01


[DelphiX] DXDraw.surface "clearen"...
 
Hallo,

Ich habe folgendes Problem:

Ich arbeite gerade an einem 2D-RPG. Momentan arbeite ich daran, dass der Spieler bei der Kollision mit einer Haustür quasi in das innere des Hauses gelangt, sprich also die alte dargestellte Oberfläche entfernt und die neue, also das innere des Hauses gezeichnet wird.
Nun ist es ja so, dass man mit dxdraw1.surface.fill(0) eigentlich die Oberflächen "clearen" kann, doch ist es bei mir so, dass wenn ich dies mache und dann flipe, er mir wieder die normale Oberfläche, also die normale Karte anzeigt...

Ich wollte nun ma nachfragen, wie man es anders bewerkstelligen könnte. Ich dachte daran, einfach die ganze Surface des DXDraws zu löschen, also quasi wie ein Surface.clear befehl, dens ja leider nich gibt, und danach die Prozedur für die Level Erschaffung wieder aufrufe...

Aber wie geht das?
Ich habe auch versucht einfach ein Sprite mit nem höheren Z-index drüber zu legen, aber das wäre ja sinnlos, da ich ja später erneut sprites createn will, usw., also das wäre zu blöd...

Wäre dankbar für nen Tip, denke nämlich ich steh irgendwie auf der Leitung.

Gruß fabiO

fabiO 2. Feb 2006 14:05

Re: [DelphiX] DXDraw.surface "clearen"...
 
mhh ich hab jetzt mal was versucht, und zwar rufe ich bei der Kollosion mit der Tür einen Timer auf, welcher DXDraw1.Free macht und danach eigentlich ein neues DXDraw mit Draw2 := TDXDraw.Create(Self) created...

Delphi-Quellcode:
 if (Sprite is THaus) then
 begin
   Form1.DXTimer1.Enabled := false; // damit die Aktuallisierung des DXDraws nicht weitergeht, da sonst EAccess error :x
   Form1.DXTimer2.Enabled := false; // s.o.
   Form1.DXTimer4.Enabled := true; // timer zum free'n des einen und erstellen des anderen DXDraw's
 end;

procedure TForm1.DXTimer4Timer(Sender: TObject; LagCount: Integer);
begin
  DXDraw1.Free;
  Draw2 := TDXDraw.Create(self);
  with Draw2 do
  begin
    AutoInitialize := true;
    Top := 24; Left := 84; Width := 500; Height := 400;
    Parent := Form1;
    if CanDraw = true then Surface.Fill(0);
  end;
  Draw2.Flip;
  DXTimer4.Enabled := false;
end;
soweit so gut, mein problem liegt jetzt nur darin, dass die CanDraw property des neues DXDraws auf false is und ich nich weiss wieso, also ich kann mir der neuen DXDraw Komponente nix machen :(

Kann mir ma bitte einer helfen ?

Gruß fabiO



//Edit:

hab gerade noch was neues versucht, hat aber auch nicht funktioniert, weiss denn keiner wieso ?

Delphi-Quellcode:
THausInnen = class(TDXDraw)
  public
    constructor Create(AParent: TComponent ); override;                             // Create procedure
  end;

{...} 

constructor THausInnen.Create(AParent: TComponent);
begin
  inherited Create(AParent); // Createn !!
  Autoinitialize := true;
  Width := 500;
  Height := 400;
end;

{...}

procedure TForm1.DXTimer4Timer(Sender: TObject; LagCount: Integer);
begin
  DXDraw1.Free; // Ich lösche DXDraw1 von der Form!
  with THausInnen.Create(Form1) do // Ich create quasi DXDraw2 auf der Form
  begin
    top := 24;
    parent := Form1;
    left := 84;
    Surface.Fill(0);
    Flip;
  end;
  DXTimer4.Enabled := false; // Timer wird nur 1 mal ausgeführt
end;

{ die DXDraw-Komponente wird zwar created und dann auch angezeigt, aber ich kann sie nicht füllen, sprich surface.fill funktioniert nicht, da die CanDraw-Property scheinbar auf false steht... wieso ? wo liegt der Fehler ? }

DP-Maintenance 2. Feb 2006 16:35

DP-Maintenance
 
Dieses Thema wurde von "alcaeus" von "Sonstige Fragen zu Delphi" nach "Multimedia" verschoben.

igel457 2. Feb 2006 16:40

Re: [DelphiX] DXDraw.surface "clearen"...
 
Wie wäre es mit
Delphi-Quellcode:
with dxdraw1.surface.canvas do
beign
  brush.color := clblack;
  pen.color := clblack;
  rectangle(0,0,width,height);
  release;
end;

fabiO 2. Feb 2006 17:16

Re: [DelphiX] DXDraw.surface "clearen"...
 
Ok ich habe es nun "hinbekommen".

Zuerst hab ich einfach eine neue SpriteEngine eingefügt. Hiernach hab ich einfach per DXSpriteEngine1.dead die alten Sprites "gelöscht, dann das DXDraw gefüllt (DXDraw1.Surface.Fill(0)) und anzeigen lassen (DXDraw1.Flip).

Nun hab ich wieder meine Level-Create Procedure aufgerufen, wobei hier aber die Sprites nun mit der neuen SpriteEngine ( DXSpriteEngine2 ) created. Anschließend noch drawen ( DXSpriteEngine2.Draw ) und erneut flipen, und siehe da das neue "Level" wird dargestellt.
So nun hab ich aber mal ne Frage:

Bei dem ersten Level war es der Fall, dass er die Sprites it dem Spieler mitbewegt hat ( mit DXTimer event ). Ich habe das selbe DXTimer-Event nochmal für die zweite SpriteEngine eingefügt, nur wird da nix bewegt. Kann mir jemand sagen wieso ? Unten hab ich ma den relevanten Code gepostet...

Gruß fabiO

Delphi-Quellcode:
{ Collision-Procedure, trifft Spieler auf "Haustür"... }

/////////////////////////////////////////////////////////////////////////////////////

procedure TSpieler.DoCollision(Sprite: TSprite; var Done: Boolean);
var Gold,Gold2 : Integer;
    Sender : TObject;
    i, j : Integer;
    C : string;
    Inneresl : array[0..19] of string;
begin

////////////////////   falls Spieler auf THausTuer trifft ...  ////////////////////

 if (Sprite is THausTuer) then
 begin
   Form1.DXSpriteEngine1.dead;         // Alle Sprites löschen ( ich denk ma dass es so geht ? o_O )

   Form1.DXDraw1.Surface.Fill(0);      // Hintergrund der DXDraw-Oberfläche Schwarz
   Form1.DXDraw1.Flip;                 // Oberfläche neu Zeichnen

{$INCLUDE Classes\HausInneresCreate.rpg}

   Form1.DXSpriteEngine2.Draw;         // Sprites anzeigen                                                              
   Form1.DXDraw1.Flip;                 // Oberfläche neu Zeichnen
   Form1.DXTimer1.Enabled := false;    // DXTimer1 für DXSpritEngine1 ausschallten
   Form1.DXTimer2.Enabled := true;     // DXTimer2 für DXSpritEngine2 anschallten
 end;

/////////////////////////////////////////////////////////////////////////////////////

{ DXTimer-Event, für die zweite DXSpriteEngine... }

procedure TForm1.DXTimer2Timer(Sender: TObject; LagCount: Integer);
begin
  DXInput1.Update;                     // Aktuelle Input.States abfragen
  DXSpriteEngine2.Move(1);             // alle Sprites bewegen
  DXDraw1.Surface.Fill(clGray);        // Hintergrund der DXDraw-Oberfläche Schwarz
  DXSpriteEngine2.Draw;                // Sprites anzeigen
  DXDraw1.Flip;                        // Oberfläche neu Zeichnen
end;

/////////////////////////////////////////////////////////////////////////////////////

fabiO 3. Feb 2006 20:25

Re: [DelphiX] DXDraw.surface "clearen"...
 
so habs nun hinbekommen... also braucht nich mehr zu antworten ;)

Gruß fabiO


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 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