![]() |
DelphiX: Durch Delay bewegen sich die Figuren nicht
Hi,
am besten hier ladet das ![]() Mein Problem ist: Ich benutze die procedure"Delay" (von Luckie oder von Hagen ist egal, da bei beiden der gleiche Fehler passiert), damit beim "Männchen bauen" nicht sofort fertig sind. Das Prob ist nun, wenn ich ein Männchen gebaut habe und ich baue ein zweites, dann bleibt das andere Männchen stehen, bis das zweite fertig gebaut ist. Mein Code:
Delphi-Quellcode:
Sleep kann ich nicht benutzen, da sonst das genze programm einschläft.
case FigurType of
ftArbeiter: begin OnProgress := true; repeat FBuild := FBuild + 3; Util.Delay(500); until FBuild > 99; if FBuild > 99 then begin FBuild := 0; with TArbeiter.Create(DX.SpriteEngine.Engine) do begin X := Self.X; Y := Self.Y + 64; end; end; end; end; OnProgress := false; Meine Frage: Wie bekomm ich es hin, dass das / die andere / anderen Männchen weiter laufen? |
Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
:angel2: *push* :angel2:
|
Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
Hallo,
ich würde das vollkommen ohne Delay lösen. Du nimmst einfach einen Zähler, der im Hauptprogramm im DXTimer hochgezählt wird und beim errechen eines Wertes wird dann Dein FBuild auch hochgezählt. Ich hab leider kein Delphi hier um die zu zeigen was ich meine. Gruß Robert |
Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
Zitat:
Eine Sache, die man grundsätzlich bei der Programmierung von Spielen verinnerlichen muß ist, dass man nirgends irgendwelche Wartefunktionen einbaut. Dies wird in der Spieleprogrammierung alles über Schleifen geregelt - das ist zwar recht aufwändig, verhindert aber, dass durch "Warteschleifen" andere Gameaktionen behindert werden. Hierbei ist dann auch die Performance des Rechners zu beachten, die z.B. durch die FPS ausgeglichen wird. Wobei ich mit Schleifen jetzt keine For Next-Schleifen meine, sondern Konstrukte wie z.B.
Delphi-Quellcode:
Wichtig ist, den Fluss der sogenannten "Gameloop" nicht zu stören.
iDelay=100*Ausgleichswert;
iCounter:=0; und dann hast Du irgendwo inc (iCounter); if iCounter=iDelay then begin Macheirgendwas(z.B. Sprite bewegen); iCounter:=0; end;
Delphi-Quellcode:
While bQuit<>true do
begin BewegeGegner; BewegePlayer; etc. end; Gruß Igotcha |
Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
Hi,
ich hab das jetzt mal so versucht:
Delphi-Quellcode:
Aber da hängt sich das programm auch auf :(
procedure THaus.DoBuild(FigurType: TFigurType);
var I: Integer; begin case FigurType of ftArbeiter: begin OnProgress := true; while FBuild < 99 do //<-- Gucke hier begin Inc(I); if I = 100 then begin FBuild := FBuild + 3; I := 0; end; end; //<- Gucke hier [ende] ;) if FBuild > 99 then begin FBuild := 0; with TArbeiter.Create(DX.SpriteEngine.Engine) do begin X := Self.X; Y := Self.Y + 100; end; end; Anzahl := Anzahl - 1; end; end; OnProgress := false; end; |
Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
Zitat:
Es ist natürlich auch schwer, den Ablauf nur anhand dieser einen Procedure zu beurteilen, aber grds. sollte es so laufen. Und was soll "Anzahl" eigentlich machen? Hier stellt sich jetzt die Frage, ob Anzahl tatsächlich bei jedem Durchlauf verringert werden soll, oder nur, wenn FBuild > 99 ist? Gruß Igotcha P.S. Und dann ist da noch irgendwo ein "end" zuviel. |
Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
Hi,
jetzt gehts auch nicht, da ich die "DoBuild" procedure nur einmal aufrufe und nicht beständig. Anzahl ist die Anzahl der Figuren die noch gebaut werden. Das spielt im moment keine Rollse, da mit dem noch nix angefangen wird. Steht aber eh an der falschen stelle. Und nein, es ist kein End zuviel ;) *MFG* Manu |
Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
Zitat:
|
Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
Weil ein Case .. Of befehl auch noch ein End benötigt ;)
|
Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
Hi,
bin jetzt bei folgendem Code:
Delphi-Quellcode:
Durch das HandleMessage geht das PRogramm weiter, aber es ruckelt wie die Sau.
procedure THaus.DoBuild(FigurType: TFigurType);
begin I := 0; if not OnProgress then FBuild := 0; case FigurType of ftArbeiter: begin OnProgress := true; while FBuild < 100 do begin I := I + 0.5; if I = 1000000 then begin Application.HandleMessage; FBuild := FBuild + 1; I := 0; end; end; if FBuild >= 100 then begin FBuild := 0; with TArbeiter.Create(fmaingame.SpriteEngine.Engine) do begin X := Self.X; Y := Self.Y + 100; end; Anzahl := Anzahl - 1; if Anzahl > 0 then begin DoBuild(ftArbeiter); end else exit; end; end; end; OnProgress := false; FBuild := 0; end; Eine Idee ist mir noch gekommen. Vielleicht sollte man das in nem Thread berechnen lassen? Das gefällt mir zwar nicht so, aber wenns nicht anders geht, dann ist das besser als nix. *MFG* Manu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 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