![]() |
Ressourcen pro Sekunde generieren
Ja moin, hier ist wieder euer Heel.
Und zwar will ich für das "Spiel", welches ich im Rahmen unseres Schulprojekts zusammenbasteln will eine Funktion einbauen, welche Ressourcen/s generiert, bisher habe ich mir das so vorgestellt:
Code:
Allerdings musste ich feststellen, dass es erst die Funktion bis zum Ende durchläuft und man dann erst weiterspielen kann.
repeat
begin timer1.enabled:=true; Luxusgueter:=Luxusgueter+Luxusgueterproduktion; Stein:=Stein+Steinproduktion; Nahrung:=Nahrung+Nahrungproduktion; Gold:=Gold+Goldproduktion; label13.caption:=floattostrf(Stein,fffixed,10,0); label14.caption:=floattostrf(luxusgueter,fffixed,10,0); label15.caption:=floattostrf(Nahrung,fffixed,10,0); label16.caption:=floattostrf(gold,fffixed,10,0); label17.caption:=inttostr(einwohner); i:=i+1; end; until i=100000000; Die Funktion soll im Optimalfall natürlich nebenher weiterlaufen und den Ressourcenstand immer updaten. Den ganzen Quelltext findet ihr unten. Vielen Dank schonmal für die Hilfe, mit heelischen Grüßen, euer heel213
Code:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Image1: TImage; Label1: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; ScrollBar1: TScrollBar; ScrollBar2: TScrollBar; ScrollBar3: TScrollBar; ScrollBar4: TScrollBar; ScrollBar5: TScrollBar; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ScrollBar1Change(Sender: TObject); procedure ScrollBar2Change(Sender: TObject); procedure ScrollBar3Change(Sender: TObject); procedure ScrollBar4Change(Sender: TObject); procedure ScrollBar5Change(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; timer1: ttimer; Einwohner : UInt64; Zusammenrechnung, i: Integer; Stein,Nahrung,Luxusgueter,Gold,Goldproduktion, Nahrungproduktion, Steinproduktion, Holzproduktion, Luxusgueterproduktion : real; implementation {$R *.lfm} { TForm1 } procedure TForm1.ScrollBar1Change(Sender: TObject); begin Label8.caption:=inttostr(Scrollbar1.position); end; procedure TForm1.ScrollBar2Change(Sender: TObject); begin Label9.caption:=inttostr(scrollbar2.position); end; procedure TForm1.ScrollBar3Change(Sender: TObject); begin label10.caption:=inttostr(scrollbar3.position); end; procedure TForm1.ScrollBar4Change(Sender: TObject); begin label11.caption:=inttostr(scrollbar4.position); end; procedure TForm1.ScrollBar5Change(Sender: TObject); begin label12.caption:=inttostr(scrollbar5.position); end; procedure TForm1.Timer1Timer(Sender: TObject); begin timer1.Interval:=1000; end; procedure TForm1.Button1Click(Sender: TObject); begin Zusammenrechnung:=Scrollbar1.position+Scrollbar2.position+Scrollbar3.position+ scrollbar4.position+scrollbar5.position; If Zusammenrechnung=100 then begin label6.Visible:=false; label7.visible:=false; Goldproduktion:=(scrollbar1.position/100)*Einwohner; Nahrungproduktion:=(scrollbar2.position/100)*Einwohner; Steinproduktion:=(scrollbar3.position/100)*Einwohner; Holzproduktion:=(scrollbar4.position/100)*Einwohner; Luxusgueterproduktion:=(scrollbar5.position/100)*Einwohner; end else begin if Zusammenrechnung<100 then begin label7.visible:=true; label6.visible:=false; end else begin label6.visible:=true; label7.visible:=false; end; end; label18.caption:='Momentane Produktion: Stein='+floattostr(Steinproduktion)+'/s Luxusgüter='+floattostr(Luxusgueterproduktion)+'/s Nahrung='+floattostr(Nahrungproduktion)+'/s Gold='+floattostr(Goldproduktion)+'/s'; repeat begin timer1.enabled:=true; Luxusgueter:=Luxusgueter+Luxusgueterproduktion; Stein:=Stein+Steinproduktion; Nahrung:=Nahrung+Nahrungproduktion; Gold:=Gold+Goldproduktion; label13.caption:=floattostrf(Stein,fffixed,10,0); label14.caption:=floattostrf(luxusgueter,fffixed,10,0); label15.caption:=floattostrf(Nahrung,fffixed,10,0); label16.caption:=floattostrf(gold,fffixed,10,0); label17.caption:=inttostr(einwohner); i:=i+1; end; until i=100000000; end; procedure TForm1.FormCreate(Sender: TObject); begin i:=1; label6.visible:=false; label7.visible:=false; Einwohner:=5000; end; end. end. |
AW: Ressourcen pro Sekunde generieren
1. Wieso aktivierst du in jedem Schleifendurchgang den Timer neu?
Der Timer hat nicht mal eine Aufgabe zu erledigen. Warum also dann der Timer? Außerdem hast du die Variable "Timer1" doppelt deklariert. Genau derselbe Fehler wie all deine Schulkollegen. 2. Setze ein
Delphi-Quellcode:
in die Schleife und dein Problem ist gelöst.
Application.ProcessMessages;
Aber das kann schon eine Weile dauern und "nebenher" ist relativ. Das wird dein Programm in der Bedienung wahrscheinlich schon irgendwie blockieren. |
AW: Ressourcen pro Sekunde generieren
Ich dachte, wenn ich den Timer aktiviere läuft er die Sekunde durch und dann wird der rest erledigt?
Wie kann ich den denn anders benutzen in der Schleife? Und wofür genau ist Application.ProcessMessages; bzw. wie benutze ich den Befehl? |
AW: Ressourcen pro Sekunde generieren
Nein ein Timer macht was vollkommen anderes als das was du willst.
Was du meinst ist
Delphi-Quellcode:
Aber wenn du
Sleep(1000);
Delphi-Quellcode:
machst... guck dir mal an wieviele Schleifendurchgänge du hast. Das würde 3 Jahre dauern.
Sleep(1000);
|
AW: Ressourcen pro Sekunde generieren
Müsste nicht das Hochsetzen der Produktion in die onTimer-Methode rein und der Timer einfach nur gestartet werden? Oder verstehe ich das völlig falsch?
|
AW: Ressourcen pro Sekunde generieren
So sehe ich das auch. Das muss in den Timer, welcher im OnCreate (oder woanders...) gestartet wird.
Sonst blockierst du dir den Button. |
AW: Ressourcen pro Sekunde generieren
Ich würde dir, unabhängig von deinem Problem, übrigens empfehlen dich nicht auf die Zeit des Timers zu verlassen. Rechne stattdessen lieber selbst aus, wie viel Zeit seit der letzten Messung vergangen ist und berechne daran den Resourcengewinn. Sonst wird es längerfristig zu starken Abweichungen kommen.
|
AW: Ressourcen pro Sekunde generieren
... wieso berechnest Du nicht erst die Werte und gibst sie dann aus?
Delphi-Quellcode:
Das kann doch keiner am Bildschirmverfolgen..
repeat
begin Luxusgueter:=Luxusgueter+Luxusgueterproduktion; Stein:=Stein+Steinproduktion; Nahrung:=Nahrung+Nahrungproduktion; Gold:=Gold+Goldproduktion; label13.caption:=floattostrf(Stein,fffixed,10,0); label14.caption:=floattostrf(luxusgueter,fffixed,10,0); label15.caption:=floattostrf(Nahrung,fffixed,10,0); label16.caption:=floattostrf(gold,fffixed,10,0); label17.caption:=inttostr(einwohner); i:=i+1; end; until i=100000000;
Delphi-Quellcode:
und eigentlich könnte man das dann auch ohne Schleife bereichnen.
repeat
begin Luxusgueter:=Luxusgueter+Luxusgueterproduktion; Stein:=Stein+Steinproduktion; Nahrung:=Nahrung+Nahrungproduktion; Gold:=Gold+Goldproduktion; i := i+1; end; until i = 100000000; label13.caption:=floattostrf(Stein,fffixed,10,0); label14.caption:=floattostrf(luxusgueter,fffixed,10,0); label15.caption:=floattostrf(Nahrung,fffixed,10,0); label16.caption:=floattostrf(gold,fffixed,10,0); label17.caption:=inttostr(einwohner); Grüße Klaus |
AW: Ressourcen pro Sekunde generieren
Vielen Dank, Sleep war der Befehl den ich gebraucht habe, jetzt funktioniert es auch, wie ich es wollte.
Die Funktion soll ja auch möglichst unendlich lange gehen, damit immer nebenbei die Ressourcen generiert werden, |
AW: Ressourcen pro Sekunde generieren
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15: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