[GUI]ProgressBar Problem

07/17/2012 13:09 piper332#1
Also die erste ProgressBar macht was sie soll. Nach jeden Mal "Trinken" drücken wird 15 hinzugefügt und angezeigt. Und nach 30 Sekunden werden 30 abgezogen.
Bei der zweiten ProgressBar klappt das Abziehen nicht so wie gewünscht.
So wird um 11 (Uhrzeit im "Spiel") oder um 18 Uhr nicht nur 25 abgezogen sondern direkt alles...
Ich weiß nicht mehr weiter & deshalb wende ich mich an euch.
Ich hoffe ihr wisst eine Lösung =)
Hier der Code:

Code:
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.8.1
 Author:         Piper332

 Script Function:
	Template AutoIt script.

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here
#RequireAdmin 
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>


   Global $Durst, $Add_1 = 30 , $zeit = "0:00", $stu = 0, $minu = 0, $mdiff = 5, $Add_2 = 35, $sturl = "00"
   $GUI = GUICreate("Tomatogotchi",500,300,50,50)
   $time = GUICtrlCreateLabel("Time:" & $zeit & "",440,10,50,20)
   $prog1 = GUICtrlCreateProgress(10, 10, 200, 20)
   $durst = GUICtrlCreateButton("Trinken", 250, 10, 70, 20)
   $prog2 = GUICtrlCreateProgress(10, 40, 200, 20)
   $hunger = GUICtrlCreateButton("Essen[Möhre]", 250, 40, 70, 20)
   
   GUISetState()
   GUICtrlSetData($prog1,$Add_1)
   GUICtrlSetData($prog2,$Add_2)
   $wait = 20; Warte 20ms bis zum nächsten Schritt
   $s = 0; Progressbar-Startposition
   
   $DurstRef = TimerInit()
   $minute = TimerInit()
   While 1
	  $msg = GUIGetMsg()
	  Select
		 Case $msg = -3
			ExitLoop
		 Case $msg = $durst
			$Add_1 += 15
			If $Add_1 = 100 Or $Add_1 > 100 Then 
			   $Add_1 = 100
			EndIf
			GUICtrlSetData($prog1,$Add_1)
		 Case $msg = $hunger
			$Add_2 += 35
			If $Add_2 = 100 Or $Add_2 > 100 Then
			   $Add_2 = 100
			EndIf
			GUICtrlSetData($prog2,$Add_2)
		 EndSelect
   If TimerDiff($DurstRef) > 30000 Then
	  $Add_1 -= 30
	  If $Add_1 = 0 Or $Add_1 < 0 Then 
		 $Dead = 1
		 $Add_1 = 0
	  EndIf
	  GUICtrlSetData($prog1,$Add_1)
	  $DurstRef = TimerInit()
   Endif
   If $sturl = 11 Or $sturl = 18 Then ; <--- HungerRef
	  $Add_2 = GUICtrlRead($prog2)
	  $Add_2 -= 25
	  If $Add_2 = 0 Or $Add_2 < 0 Then 
		 $Dead = 1
		 $Add_2 = 0
	  EndIf
	  GUICtrlSetData($prog2,$Add_2)
   EndIf
      If $minu > 59 Then
	  $stu +=1
	  $minu = 0
   EndIf
   If $stu = 24 Then
	  $stu = 0
   EndIf
   If TimerDiff($minute) > $mdiff Then
	  $minu += 1
	  $minute = TimerInit()
   EndIf
   If $stu = 0 Then $sturl = "00"
	  If $stu = 1 Then $sturl = "01"
		 If $stu = 2 Then $sturl = "02"
			If $stu = 3 Then $sturl = "03"
			   If $stu = 4 Then $sturl = "04"
				  If $stu = 5 Then $sturl = "05"
					 If $stu = 6 Then $sturl = "06"
						If $stu = 7 Then $sturl = "07"
						   If $stu = 8 Then $sturl = "08"
							  If $stu = 9 Then $sturl = "09"
   If $minu = 0 Then $mrl = "00"
	  If $minu = 1 Then $mrl = "01"
		 If $minu = 2 Then $mrl = "02"
			If $minu = 3 Then $mrl = "03"
			   If $minu = 4 Then $mrl = "04"
				  If $minu = 5 Then $mrl = "05"
					 If $minu = 6 Then $mrl = "06"
						If $minu = 7 Then $mrl = "07"
						   If $minu = 8 Then $mrl = "08"
							  If $minu = 9 Then $mrl = "09"
   If $stu > 9 Then $sturl = $stu
   If $minu > 9 Then $mrl = $minu
   $zeit = "" & $sturl & ":" & $mrl & "" 
   
   GUICtrlSetData($time,$zeit)
   WEnd
07/17/2012 15:30 omer36#2
Liegt an der Abfrage. Du fragst nur noch den Stunden ab und vergisst dabei, dass es für ca. eine halbe sec. 11Uhr ist (die Minuten müssen ja noch vergehen).

Und in der Zeit zieht er deiner Progressbar immer wieder 25 ab.

Würde z. B. so klappen:

PHP Code:
If ($sturl 11 And $minu 2) Or ($sturl 18 And $minu 2Then 
(Wobei das glaube ich auch manchmal failen würde, gibt noch andere möglichkeiten, kann nur grad nicht denken :D )


Und die 20 Abfragen weiter unten kannst du ganz schnell in einer Schleife lösen:

PHP Code:
    For $i 0 To 9
        
If $stu $i Then $sturl "0"&$i
        
If $minu $i Then $mrl "0"&$i
    Next 
07/17/2012 16:01 piper332#3
ahh... stimmt ja.. es wird ja mehrmals ausgeführt, weil die bedingung länger erfüllt ist >.<
Ich habe es jetzt so gelöst:

Code:
   Global $Durst, $Add_1 = 30 , $zeit = "0:00", $stu = 0, $minu = 0, $mdiff = 50, $Add_2 = 35, $sturl = "00", $minusdebug = 0
[...]

Code:
If ($sturl = 11 And $minusdebug = 0) Or ($sturl = 18 And $minusdebug = 0) Then ; <--- HungerRef
	  $minusdebug = 1
	  $Add_2 = GUICtrlRead($prog2)
	  $Add_2 -= 25
	  If $Add_2 = 0 Or $Add_2 < 0 Then 
		 $Dead = 1
		 $Add_2 = 0
	  EndIf
	  GUICtrlSetData($prog2,$Add_2)
   EndIf
   If $sturl = 12 or $sturl = 19 Then
	  $minusdebug = 0
   EndIf
[...]
und danke hierfür:
Code:
For $i = 0 To 9
        If $stu = $i Then $sturl = "0"&$i
        If $minu = $i Then $mrl = "0"&$i
    Next
Das wird mir demnächst einiges erleichtern ;)
07/17/2012 16:09 lolkop#4
Quote:
Originally Posted by omer36 View Post
PHP Code:
    For $i 0 To 9
        
If $stu $i Then $sturl "0"&$i
        
If $minu $i Then $mrl "0"&$i
    Next 
wenn du an einen bekannten wert etwas anhängen willst, musst du nicht per bruteforce den wert ermitteln, da er ja bekannt ist...

Code:
If $stu < 10 Then $stu = '0'&$stu
If $minu <10 Then $mrl = '0'&$minu
spart in diesem falle 16 sinnlose abfragen. je nach datenmenge, würde der aufwand durch unnötige abfragen mit deiner methode, exponentiell wachsen.