AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi [DelphiX] DXDraw.surface "clearen"...
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von fabiO · begonnen am 1. Feb 2006 · letzter Beitrag vom 3. Feb 2006
Antwort Antwort
fabiO

Registriert seit: 5. Dez 2004
Ort: Jena
41 Beiträge
 
Delphi 6 Personal
 
#1

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

  Alt 1. Feb 2006, 22:01
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
  Mit Zitat antworten Zitat
fabiO

Registriert seit: 5. Dez 2004
Ort: Jena
41 Beiträge
 
Delphi 6 Personal
 
#2

Re: [DelphiX] DXDraw.surface "clearen"...

  Alt 2. Feb 2006, 15:05
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 ? }
  Mit Zitat antworten Zitat
2. Feb 2006, 17:35
Dieses Thema wurde von "alcaeus" von "Sonstige Fragen zu Delphi" nach "Multimedia" verschoben.
Benutzerbild von igel457
igel457

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

Re: [DelphiX] DXDraw.surface "clearen"...

  Alt 2. Feb 2006, 17:40
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;
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
fabiO

Registriert seit: 5. Dez 2004
Ort: Jena
41 Beiträge
 
Delphi 6 Personal
 
#5

Re: [DelphiX] DXDraw.surface "clearen"...

  Alt 2. Feb 2006, 18:16
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;

/////////////////////////////////////////////////////////////////////////////////////
  Mit Zitat antworten Zitat
fabiO

Registriert seit: 5. Dez 2004
Ort: Jena
41 Beiträge
 
Delphi 6 Personal
 
#6

Re: [DelphiX] DXDraw.surface "clearen"...

  Alt 3. Feb 2006, 21:25
so habs nun hinbekommen... also braucht nich mehr zu antworten

Gruß fabiO
  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 12:07 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