Entwickler-Ecke

Sonstiges (Delphi) - Variablenproblem mit Timer


MydroF - Mo 10.08.09 16:34
Titel: Variablenproblem mit Timer
Hi.

Hab für nen Klickspiel mal einen Code gefunden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.L1Click(Sender: TObject); //start level 1
Var zeit:double;
begin

B11.Visible:=true;
Zeit:=now+1.0*(1.0/86400.0);
while (now<=Zeit) do Application.processMessages;
B11.Visible:=false;
end;


Man clickt also den Startbutton, ein anderer Button wird sichtbar, drückt man auf diesen, würde er wieder unsichtbar werden, und ein neuer Button erscheint, usw.
Klickt man den erscheinenden Button nicht innerhalb einer Sekunde an, verschwindet er wieder, und man muss wieder den Startbutton (L1) drücken.

Nun wollte ich den Button Variablenabhängig machen. Wenn man ein Level wählt, wird dementsprechend in dementsprechenden Editfeld eine '1' aktiv, und eine Variable (die eine Zeit angibt) wird abgefragt.

Das sollte nun so aussehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.L1Click(Sender: TObject); //start level 1
Var zeit,a:double;
begin
if (Lev1Var.Text='1'then a:=strtofloat(Lev11.Text);
if (Lev2Var.Text='1'then a:=strtofloat(Lev12.Text);
if (Lev3Var.Text='1'then a:=strtofloat(Lev13.Text);
if (Lev3Var.Text='1'then a:=strtofloat(Lev14.Text);

B11.Visible:=true;
Zeit:=now+a*(1.0/86400.0);
while (now<=Zeit) do Application.processMessages;
B11.Visible:=false;
end;


In den Lev11.Text (Editfelder), Lev12.Text, usw. stehen die Anzahl der Sekunden, die dann in der Variable a auftauchen sollen. Nur leider funktioniert der Code nicht. Wahrscheinlich liegts daran, dass "a" in der Rechnung nicht erkannt wird als sekundenanzahl=(

Wie soll der Code aussehen, damits funzt?

Moderiert von user profile iconGausi: Color-Tags durch Delphi-Tags ersetzt.


der organist - Mo 10.08.09 16:44

Hi,

und :welcome: im Forum. Was mir aufgefallen ist:


Delphi-Quelltext
1:
if (Lev1Var.Text='1'then a:=strtofloat(Lev11.Text);                    


einmal hast du da ein "Var", ich weiss nicht, ob das so gewollt ist, andererseits:


Delphi-Quelltext
1:
if (Lev1Var.Text='1'then a:=strtofloat(Lev11.Text);                    


Kann es sein, dass da eine "1" zu viel ist, wenn du links 1 (bzw. 2,3..) und rechts 11 (bzw. 12,13..) stehen hast?


MydroF - Mo 10.08.09 16:50

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Hat seine Richtigkeit, die Editfelder sind so von mir benannt worden, damit ich mich aus den zig Editfeldern herausfinde.
Ein Klick auf den "Leicht" Button bei der Levelabfrage, lässt in dem Editfeld "Lev1Var" eine "1" erscheinen, bei "Mittel" im Editfeld "Lev2Var", usw...

im Editfeld "Lev11" steht nun die Anzahl der Sekunden, die ich für Stufe "leicht" auswähle, klickt der Spieler "leicht", soll jeder Button für a=(Lev11.Text) Sekunden aktiv sein...

ziemlich kompliziert %P


Narses - Mo 10.08.09 17:26

Moin und :welcome: im Forum!

Du programmierst nicht ereignisorientiert und dein Absatz mit den vielen Edit-Feldern ist auch nicht gerade "übersichtlich" (-> und deshalb nicht pflegeleicht). :nixweiss:

Analysieren wir doch mal das Konzept:
  1. Der Button wird angezeigt
  2. Es wird ein Timer gestartet, wenn dieser Abläuft -> Game Over
  3. Wird der Button zwischendurch angeklickt, wird der Game-Over-Timer gestoppt, der Button irgendwohin verschoben (oder was auch immer), ein paar Punkte gezählt und der Game-Over-Timer wieder gestartet
  4. Das ganze läuft so lange, bis der Game-Over-Timer zuschlägt (man könnte zwischendurch auch die Game-Over-Zeitspanne verkürzen -> Level-Konzept)
Ich würde sagen, du brauchst bei diesem Ansatz:Dazu nach Geschmack ein Label für das aktuelle Timeout und evtl. noch eins für den aktuellen Level. Fertig. :idea:

Dein aktueller Ansatz basiert auf einer APM-Schleife, das solltest du auf jeden Fall durch einen TTimer ersetzen (ist schnell genug dafür, so schnell kann jedenfalls keiner Klicken)! :|

cu
Narses