![]() |
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 |
Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
Weiß jemand noch was? :angle2:
|
Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
ich würde es einfach so machen:
du baust in den DXTimer einen zähler ein z.b. so:
Delphi-Quellcode:
z muss gobal sein und bei count musst du es selbst testen ich würde einen wert zwischen 10 bis 20 nehmen wichtig ist dabei, das der Timer.Interval auf 0 ist. das ist die einfachste und schnellste lösung *G*
if z >= count then begin
BaueFigur; z:=0; end else inc(z) |
Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
Hi,
habs mittlerweile selbst gelöst. Hab leider grad mein Projekt nicht zur Hand. Werde später den Code posten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 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