![]() |
[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 |
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:
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 :(
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; 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
Dieses Thema wurde von "alcaeus" von "Sonstige Fragen zu Delphi" nach "Multimedia" verschoben.
|
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; |
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; ///////////////////////////////////////////////////////////////////////////////////// |
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 10:23 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 by Thomas Breitkreuz