Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DelphiX: Durch Delay bewegen sich die Figuren nicht (https://www.delphipraxis.net/29452-delphix-durch-delay-bewegen-sich-die-figuren-nicht.html)

Die Muhkuh 9. Sep 2004 10:56


DelphiX: Durch Delay bewegen sich die Figuren nicht
 
Hi,

am besten hier ladet das Game (ca. 500kb, im Rar format) mal runter. Dann seht ihr was ich meine.

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:
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;
Sleep kann ich nicht benutzen, da sonst das genze programm einschläft.

Meine Frage:

Wie bekomm ich es hin, dass das / die andere / anderen Männchen weiter laufen?

Die Muhkuh 10. Sep 2004 08:49

Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
 
:angel2: *push* :angel2:

Spezi1980 10. Sep 2004 09:33

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

Igotcha 10. Sep 2004 09:35

Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
 
Zitat:

Zitat von Spider
Sleep kann ich nicht benutzen, da sonst das genze programm einschläft.

Ich denke, Delay wird die gleichen Auswirkungen haben.

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:
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;
Wichtig ist, den Fluss der sogenannten "Gameloop" nicht zu stören.

Delphi-Quellcode:
While bQuit<>true do
begin
     BewegeGegner;
     BewegePlayer;
     etc.
end;

Gruß Igotcha

Die Muhkuh 10. Sep 2004 10:22

Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
 
Hi,

ich hab das jetzt mal so versucht:

Delphi-Quellcode:
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;
Aber da hängt sich das programm auch auf :(

Igotcha 10. Sep 2004 10:31

Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
 
Zitat:

Zitat von Spider
Hi,

ich hab das jetzt mal so versucht:

Delphi-Quellcode:
procedure THaus.DoBuild(FigurType: TFigurType);
var
  I: Integer;
begin
  case FigurType of
    ftArbeiter:
    begin
      OnProgress := true;

        Inc(I);

        if I = 100 then
        begin
          FBuild := FBuild + 3;
          I := 0;
        end;


      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;) <--- zuviel?!
  end;

  OnProgress := false;
end;

Ich habe da mal was rausgenommen, da ich den Sinn nicht gesehen habe ;-)

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.

Die Muhkuh 10. Sep 2004 10:51

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

Igotcha 10. Sep 2004 12:06

Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
 
Zitat:

Zitat von Spider
Und nein, es ist kein End zuviel ;)

Hm und warum sind in Deiner Procedure 7 "ends" und nur 6 "begins" drin :gruebel:

Die Muhkuh 10. Sep 2004 12:15

Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
 
Weil ein Case .. Of befehl auch noch ein End benötigt ;)

Die Muhkuh 10. Sep 2004 13:13

Re: DelphiX: Durch Delay bewegen sich die Figuren nicht
 
Hi,

bin jetzt bei folgendem Code:

Delphi-Quellcode:
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;
Durch das HandleMessage geht das PRogramm weiter, aber es ruckelt wie die Sau.

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 16:45 Uhr.
Seite 1 von 2  1 2      

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