Timing in BB

Started by windman, January 30, 2019, 23:13:21

Previous topic - Next topic

windman

Look at this code
T=1:For X=1 To 5:For Y=1 To 5:ST(T)=MilliSecs():TI(T)=Rand(18000,50000):T=T+1:Next:Next:T=1
While Not KeyDown(1)
.ag For X=1 To 5:For Y=1 To 5
If MilliSecs()-ST(T)>=TI(T)
NC(T)=Rand(0,2):FD(T)=(NC(T)>0):ST(T)=MilliSecs():TI(T)=Rand(18000,50000):;Goto ag
EndIf
If NC(T)=0 Then Color 0,0,0:Rect XX+(X-1)*(SQD+SSP),YY+(Y-1)*(SQD+SSP),SQD,SQD,1
Color 255*(NC(T)=0)+250*(NC(T)=1)+20*(NC(T)=2),255*(NC(T)=0)+20*(NC(T)=1)+250*(NC(T)=2),255*(NC(T)=0)
Rect XX+(X-1)*(SQD+SSP),YY+(Y-1)*(SQD+SSP),SQD,SQD,FD(T)

T=T+1:If T>25 Then T=1
Next:Next
;VWait
Wend


I'm trying to get the dots / squares to change color at a random interval in milliseconds.
I'm using as much as 18 secs but when the color changes come, the interval is not happening according to the programmed code.
Am I coding incorrectly or am I missing some nuance about millisecs()

An 18 second programmed wait is not what I wanted to use.


RemiD

I give you a prize : either for obfuscated code or for badly indented code, your choice ;D

(you can use debuglog("here!")  to see how your code is flowing and debuglog(value) to see how each value is altered depending on your instructions, step by step...)

TomToad

This is the perfect example of when you shouldn't use goto. The moment the If statement becomes true, you end up in an endless loop. Ditch the goto, use If/Else/Endif structure instead. Probably other errors, but I'm not at home right now to check.
------------------------------------------------
8 rabbits equals 1 rabbyte.

3DzForMe

Yep, brilliant obfuscation there. Too hard to analyze. Break it up into separate lines.
BLitz3D, IDEal, AGK Studio, BMax, Java Code, Cerberus
Recent Hardware: Dell Laptop
Oldest Hardware: Commodore Amiga 1200 with 1084S Monitor & Blitz Basic 2.1

Holzchopf

#4
Quote from: windman on January 30, 2019, 23:13:21Look at this code
Ugh... Multistatement lines, no vars longer than two chars - that's some real 70's programming style you've got there :o

To be honest:
- give your variables good names. You don't want to put a comment to every usage of a var just to explain what's going on in this assignment or comparison. Variable names should be self-explanatory.
- increase readability of your code by doing without the ":" statement concatenation, putting every statement on one line and using correct indentation.*
- and - very important - if you want help, always post a minimal runnable example. Don't omit things like variable initialisation.

Quote from: windman on January 30, 2019, 23:13:21the interval is not happening according to the programmed code.

That's never true: A computer always does what you programmed - not what you intended. Keep that in mind, it will save you a lot of nerves and help you focus on your code when debugging oddly behaving routines.

(After some adjustments) your code runs here and I think it does what you want. But you're complaining. Therefore: Please elaborate what you'd like it to do :D

Const XX=5 ; X_OFFSET
Const YY=5 ; Y_OFFSET
Const SQD=50 ; TILE_SIZE
Const SSP=2 ; TILE_SPACING

; use consts instead of magic numbers to keep your code flexible
Const FIELD_WIDTH% = 5
Const FIELD_HEIGHT% = 5
Const FIELD_SIZE% = FIELD_WIDTH * FIELD_HEIGHT

Dim ST(FIELD_SIZE)
Dim TI(FIELD_SIZE)
Dim NC(FIELD_SIZE)
Dim FD(FIELD_SIZE)


Local T=1
Local X%, Y%

Graphics(400,300,0,2)
SetBuffer BackBuffer()

; init tiles
; "pro" tip: swap the X and Y for loops (to X being the inner one), so the
; tiles are arranged in reading direction - which can come in handy in
; many places, especially when debugging.
For X=1 To FIELD_WIDTH
For Y=1 To FIELD_HEIGHT
; instead of using "now" & "interval" you could directly add them
; and only store "next change time", e.g:
; tchange(T) = MilliSec() + Rand(18000,50000)
ST(T)=MilliSecs() ; set that tile's starting time to "now"
TI(T)=Rand(18000,50000) ; set that tile's interval
T=T+1
Next
Next

While Not KeyDown(1)
; update and draw tiles
T=1
For X=1 To FIELD_WIDTH
For Y=1 To FIELD_HEIGHT
; check if tile's interval has passed
If MilliSecs()-ST(T)>=TI(T) Then
;... and update tile definitions
NC(T)=Rand(0,2)
FD(T)=(NC(T)>0)
;... and set new interval
ST(T)=MilliSecs()
TI(T)=Rand(18000,50000)
EndIf
; black tile background
If NC(T)=0 Then
Color 0,0,0
Rect XX+(X-1)*(SQD+SSP),YY+(Y-1)*(SQD+SSP),SQD,SQD,1
EndIf
; a select NC(T) statement wouldn't hurt here
Color 255*(NC(T)=0)+250*(NC(T)=1)+20*(NC(T)=2),255*(NC(T)=0)+20*(NC(T)=1)+250*(NC(T)=2),255*(NC(T)=0)
; draw coloured tile foreground
Rect XX+(X-1)*(SQD+SSP),YY+(Y-1)*(SQD+SSP),SQD,SQD,FD(T)

T=T+1
Next
Next
Flip(0)
Wend


*If you think your code is readable: remember that others (me included) thought at first glance you were using "Goto"  ;)