Microsoft Small Basic

Program Listing: LNM164-3
' Roulette 0.3b
' Copyright © 2013-2015 Nonki Takahashi. The MIT License.
'
' History:
' 0.3b 2015-04-08 Added ball animation. (LNM164-3)
' 0.22b 2013-06-18 Changed for Silverlight. (LNM164-2)
' 0.2b 2013-06-18 Rotated wheel. (LNM164-0)
' 0.11a 2013-06-18 Background color changed.
' 0.1a 2013-06-12 Created just for picture. (LNM164)
'
GraphicsWindow.Title = "Roulette 0.3b"
gw = 598
gh = 428
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
x0 = gw / 2
y0 = gh / 2
r4 = 441 / 2 * 0.9
r3 = r4 * 0.8
r2 = r3 * 0.8
r1 = r3 * 0.5
r0 = r3 * 0.1
rb = r1 * 0.15
r = r1
a = -92
fs = (r3 - r2) * 0.8
GraphicsWindow.BackgroundColor = "Green"
GraphicsWindow.BrushColor = "#331800"
GraphicsWindow.FillEllipse(x0 - r4, y0 - r4, r4 * 2, r4 * 2)
url = "http://www.nonkit.com/smallbasic.files/Roulette.png"
wheel = Shapes.AddImage(url)
Shapes.Move(wheel, x0 - r3, y0 - r3)
GraphicsWindow.PenWidth = 0
GraphicsWindow.BrushColor = "White"
ball = Shapes.AddEllipse(rb * 2, rb * 2)
angle = 0
Math_PolarToCartesian()
Shapes.Animate(ball, x - rb, y - rb, 1000)
GraphicsWindow.BrushColor = "Black"
Controls.AddButton("Start", 10, 10)
Controls.ButtonClicked = OnButtonClicked
Timer.Interval = 1000/24
Sub OnButtonClicked
da = 0.1
da0 = Math.GetRandomNumber(10) + 10
t0 = Clock.ElapsedMilliseconds
tl = Clock.ElapsedMilliseconds
Timer.Tick = OnTick
EndSub
Sub OnTick
t1 = Clock.ElapsedMilliseconds
dt = (t1 - tl) / 1000
tl = t1
If r1 - r < 0 Then
sign = -1
ElseIf r1 - r = 0 Then
sign = 0
Else
sign = 1
EndIf
ar = 30
vr = vr + sign * ar * dt
vr = vr * 0.99 * Math.Abs(r - r1) / (Math.Abs(r - r1) + 1)
dr = vr * dt
r = r + dr
If 0 < da Then
da = da0 - (t1 - t0) / 1000
ElseIf Math.Abs(r - r1) < 1 Then
Timer.Tick = DoNothing
EndIf
va = (va + Math.GetRadians(da) * 50) * 0.99
a = a + va * dt
_a = Math.GetRadians(va * dt)
r = Math.Abs(r / Math.Cos(_a))
If r2 < r Then
r = r - (r - r2)
EndIf
Math_PolarToCartesian()
Shapes.Move(ball, x - rb, y - rb)
If 0 < da Then
angle = angle + da
If 360 <= angle Then
angle = angle - 360
EndIf
Shapes.Rotate(wheel, angle)
EndIf
EndSub
Sub DoNothing
EndSub
Sub Math_PolarToCartesian
' param r
' param a
' param x0, y0
' return x, y
_a = Math.GetRadians(a)
x = x0 + r * Math.Cos(_a)
y = y0 + r * Math.Sin(_a)
EndSub