stopwatch?

Blitz3D Forums/Blitz3D Programming/stopwatch?

Yue(Posted 2016) [#1]
Hello, I can make a timer time begins in high numbers and down.

10:11:50 ..
10:11:49 ..
10:11:48 ..


degac(Posted 2016) [#2]
Hi
you can use CreateTimer()/Millisecs() to check if a 'second' is passed and decrease your 'clock'.
You need to track Hours, Minutes & Seconds and write all the logic behind (>60 seconds means 1 Minute, 60 Minutes means 1 Hour etc)

edit: (BlitzMax source, but the logic is the same)




Midimaster(Posted 2016) [#3]
here is a pure blitzbasic solution:
Graphics 320,200

Global H%=4
Global M%=30
Global S%=0
Global Time=MilliSecs()
Global Clock$
 
Repeat
	Cls
	Text 100,100, Clock$
	CheckTime
	Flip 1		
Until KeyHit(1)

Function CheckTime()
	If MilliSecs()>Time
		Time=Time+1000
		S=S-1
		
		If S<0
			M=M-1
			S=59
		End If
		
		If M<0
			H=H-1
			M=59
		End If
		clock = RSet("00" + H,2) +":" + RSet("00" + M,2) +":" + RSet("00" + S,2)
	EndIf	
End Function



Yue(Posted 2016) [#4]
Thanks You. :)


Yue(Posted 2016) [#5]
Hi , I have been able to implement the chronometer , however I have no idea how to put it on pause and then continue. Any suggestions .




degac(Posted 2016) [#6]
Hi

just use a global like timer_pause to change in the main game loop.
If timer_pause=1 CheckTime() will skip to count, otherwise it acts normally.




Yue(Posted 2016) [#7]
@degac

No work,
Apparently enters paused but resumed when the time has passed , for example if it stops at 45, and when reaunudo was 30 .

Graphics 320,200, 32, 2

Global H%=4
Global M%=30
Global S%=0
Global Time=MilliSecs()
Global Clock$
Global timer_pause = 1
Repeat
	
	
	If KeyHit(200) timer_pause% = 1 - timer_pause
	Cls
	Text 100,100, Clock$
	CheckTime
	Flip 1		
Until KeyHit(1)

Function CheckTime()
	
	If timer_pause=1
	
	If MilliSecs()>Time
		Time=Time+1000
		
		
		
		
		S=S-1
		
		If S<0
			M=M-1
			S=59
		End If
		
		If M<0
			H=H-1
			M=59
		End If
	End If 
		Clock = RSet("00" + H,2) +":" + RSet("00" + M,2) +":" + RSet("00" + S,2)
	EndIf	
End Function



Yue(Posted 2016) [#8]
Ok, no problem.

Function CheckTime()
	
	
	
	If MilliSecs()>Time
		Time=Time+1000
		
		If timer_pause=1
		
		
		S=S-1
		
		If S<0
			M=M-1
			S=59
		End If
		
		If M<0
			H=H-1
			M=59
		End If
	End If 
		Clock = RSet("00" + H,2) +":" + RSet("00" + M,2) +":" + RSet("00" + S,2)
	EndIf	
End Function



How do I get milliseconds look ?

01:55:99

Minutes, Seconds, millisec.


degac(Posted 2016) [#9]
Hi
ops... I did an error when I wrote the code, I've no more Blitz3d installed, so I tested something similar (not implying Millisecs()) in Bmax.

Well, technically, you check the time every 1000 millisecs... so if you check Millisecs()>Time2+10 you can count them.


Yue(Posted 2016) [#10]
@degac Thanks You.


I have always something new to learn .


Global Mi%=1
Global Se%=59
Global Ml%=99

Global timeC
Global Clock$


Function CheckTime()
	
	
	
	If MilliSecs()>timeC
		timeC=timeC+1000
		
		If menu%=False
			
			
		Ml=Ml-1
			
		If Ml<0 Then 
			
			Se=Se-1
			Ml = 99
			
		End If
			
		If Se<0
			Mi=Mi-1
			Se=59
			End 
		End If
			
			
			
			
	End If 
		Clock$ = RSet("00" + Mi,2)  + ":" + RSet("00" +Se ,2) +":" + RSet("00" + Ml,2) 
	EndIf	
End Function




Yue(Posted 2016) [#11]
Oops, problem here: 2 minutes Stopstopwatch.

if Clock$ ="" End.

01:00: 00 change a to 00:00:00 exit program, One minute lost. :(

Edit : No problem, Error en my code. :)


Yue(Posted 2016) [#12]
Global Mi%=0
Global Se%=10
Global Ml%=99

Global timeC
Global Clock$

; - Update Volantes.
; -------------------
Function CheckTime()
	
	
	
	If MilliSecs()>timeC
		timeC=timeC+100
		If menu%=False
			
			
			Ml=Ml-1
			
			If Ml<0 Then 
				
				Se=Se-1
				Ml = 99
				
			End If
			
			If Se<0
				Mi=Mi-1
				Se=59
				
			End If
			
			
			
			
			
		End If 
		Clock$ = RSet("00" + Mi,2)  + ":" + RSet("00" +Se ,2) +":" + RSet("00" + Ml,2) 
	EndIf	
End Function


This seems to work properly, but it is not, the second are very delayed , are not real , any suggestions?


Dan(Posted 2016) [#13]
there is a start/stop timer in the codearchives:

Race Timer Functions

it is counting up, but can be paused.


Yue(Posted 2016) [#14]
@ Dan Thanks You.

Is there any way to put a high boot on time. For example Start two minutes down the counter. ?


Yue(Posted 2016) [#15]

Graphics3D 800, 600, 32, 2
camara% = CreateCamera()
Global ml% = 99
Global mi% = 10


b% = LoadFont("blitz",30) 
SetFont b
s% = MilliSecs()
While Not KeyHit(1)
	
	
	
	If MilliSecs() > s% 
		s% = s% + 10
		ml% = ml% - 1
		
	End If 
	
	
	
	If ml% < 0 Then 
		
		
		mi = mi - 1
		
		
		ml% = 99
		
		
	End If 
	
	
	If mi% <  0
		
		
		mi% = 0
		ml% = 0
		
	End If 
	
	
	RenderWorld 
	Text 0, 0, ml%
	Text 0, 50, mi%
	
	Flip 
	
	
	
	
	
Wend 




Ok, no problem,
I 'm understanding the millisecs command ( )


Midimaster(Posted 2016) [#16]
if you need hundredth you have to optimize the code. First problem is, that with "FLIP 1" the code only repeats 60 times a second, but you would need 100 times. 60 times a second means that Millisecs() increases 16msec every repeat, but your TIME only increases 10msec. So TIME will have a (continously growing) delay.

So you have to do this:
Graphics 320,200,0,2

Global H%=4
Global M%=30
Global S%=0
Global Small%=0
Global Time=MilliSecs()
Global Clock$
 
Repeat
	Cls
	Text 100,100, Clock$
	CheckTime
	Flip 0	
Until KeyHit(1)

Function CheckTime()
	If Time > MilliSecs() Return 
	While MilliSecs()>Time	
		Time=Time+10
		Small=Small-1
		If Small<0
			S=S-1
			Small=99
		EndIf
		If S<0
			M=M-1
			S=59
		End If
		
		If M<0
			H=H-1
			M=59
		End If
	Wend
	clock = RSet("00" + M,2) +":" + RSet("00" + S,2) +":" + RSet("00" + Small,2)
End Function


The small interval of 10msec will stress your computer. To prevent this you could only use an interval of 100msec and fake the last digit:

Graphics 320,200,0,2

Global H%=4
Global M%=30
Global S%=0
Global Small%=0
Global Time=MilliSecs()
Global Clock$
Global timer_pause = 0	
 
Repeat
	Cls
	Text 100,100, Clock$
	CheckTime
	If KeyHit(2)
		 timer_pause = 1-timer_pause
	EndIf
	Flip 1	
Until KeyHit(1)

Function CheckTime()
	Local count%=0 
	While MilliSecs()>Time
		Time=Time+100
		If timer_pause=1 Return
		Small=Small-1
		If Small<0
			S=S-1
			Small=9
		EndIf
		If S<0
			M=M-1
			S=59
		End If
		
		If M<0
			H=H-1
			M=59
		End If
	clock = RSet("00" + M,2) +":" + RSet("00" + S,2) +":" + RSet("0" + Small,1) +Rand(0,9) 
	Wend
End Function



Yue(Posted 2016) [#17]
@MideMaster
Thanks You :)


Yue(Posted 2016) [#18]
As evaluated when a zero comes ?


  if clok$ = "00:00:00:00" End



No working here.


Midimaster(Posted 2016) [#19]
no, the time is over when H=0 and M=0 and S=0 and SMALL<1.


Yue(Posted 2016) [#20]
@MidiMaster.
Thanks You. :)