AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ressourcen pro Sekunde generieren

Ein Thema von heel213 · begonnen am 27. Jan 2017 · letzter Beitrag vom 25. Feb 2017
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von heel213
heel213

Registriert seit: 23. Jan 2017
Ort: Authority
10 Beiträge
 
#1

Ressourcen pro Sekunde generieren

  Alt 27. Jan 2017, 11:42
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:
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;
Allerdings musste ich feststellen, dass es erst die Funktion bis zum Ende durchläuft und man dann erst weiterspielen kann.
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.
Der, der die Company zerstören wird aka der Heelischste von allen.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#2

AW: Ressourcen pro Sekunde generieren

  Alt 27. Jan 2017, 11:44
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 Application.ProcessMessages; in die Schleife und dein Problem ist gelöst.
Aber das kann schon eine Weile dauern und "nebenher" ist relativ. Das wird dein Programm in der Bedienung wahrscheinlich schon irgendwie blockieren.
  Mit Zitat antworten Zitat
Benutzerbild von heel213
heel213

Registriert seit: 23. Jan 2017
Ort: Authority
10 Beiträge
 
#3

AW: Ressourcen pro Sekunde generieren

  Alt 27. Jan 2017, 11:49
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?
Der, der die Company zerstören wird aka der Heelischste von allen.

Geändert von heel213 (27. Jan 2017 um 11:52 Uhr)
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#4

AW: Ressourcen pro Sekunde generieren

  Alt 27. Jan 2017, 11:52
Nein ein Timer macht was vollkommen anderes als das was du willst.
Was du meinst ist Sleep(1000); Aber wenn du Sleep(1000); machst... guck dir mal an wieviele Schleifendurchgänge du hast. Das würde 3 Jahre dauern.
  Mit Zitat antworten Zitat
SProske

Registriert seit: 16. Feb 2015
Ort: Halle/S.
116 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Ressourcen pro Sekunde generieren

  Alt 27. Jan 2017, 11:56
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?
Sebastian
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#6

AW: Ressourcen pro Sekunde generieren

  Alt 27. Jan 2017, 11:57
So sehe ich das auch. Das muss in den Timer, welcher im OnCreate (oder woanders...) gestartet wird.
Sonst blockierst du dir den Button.
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#7

AW: Ressourcen pro Sekunde generieren

  Alt 27. Jan 2017, 11:58
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.
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Ressourcen pro Sekunde generieren

  Alt 27. Jan 2017, 11:59
... wieso berechnest Du nicht erst die Werte und gibst sie dann aus?

Delphi-Quellcode:
  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;
Das kann doch keiner am Bildschirmverfolgen..

Delphi-Quellcode:
  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);
und eigentlich könnte man das dann auch ohne Schleife bereichnen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von heel213
heel213

Registriert seit: 23. Jan 2017
Ort: Authority
10 Beiträge
 
#9

AW: Ressourcen pro Sekunde generieren

  Alt 27. Jan 2017, 12:00
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,
Der, der die Company zerstören wird aka der Heelischste von allen.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#10

AW: Ressourcen pro Sekunde generieren

  Alt 27. Jan 2017, 12:00
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.
Sag mal einem Sachbearbeiter der soll ein Haus bauen. Ungefähr so fühlt sich der Themenersteller jetzt

Zitat:
Die Funktion soll ja auch möglichst unendlich lange gehen, damit immer nebenbei die Ressourcen generiert werden,
Pack das trotzdem in den Timer sonst macht das alles gar keinen Sinn.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:20 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