47 lines
1.7 KiB
Plaintext
47 lines
1.7 KiB
Plaintext
void local fn BuildWindow
|
|
window 1, @"Animated Pendulum in FutureBasic", ( 0, 0, 640, 400 )
|
|
WindowSetBackgroundColor( 1, fn ColorBlack )
|
|
WindowSetMinSize( 1, fn CGSizeMake( 640, 400 ) )
|
|
WindowSetMaxSize( 1, fn CGSizeMake( 640, 400 ) )
|
|
end fn
|
|
|
|
local fn AnimatedPendulum
|
|
block double theta, gravity, length, accel, speed, weight, tempo, px, py, bx, by
|
|
block ColorRef color = fn ColorWithRGB( 0.164, 0.793, 0.075, 1.0 )
|
|
theta = pi/2.0 // Denominator of 2.0 = 180-degree swing, < 2.0 narrows inscribed arc, > 2.0 widens it.
|
|
gravity = 9.90 // Adjusts effect of gravity on swing. Smaller values slow arc swing.
|
|
length = 0.95 // Tweak for length of pendulum arm
|
|
speed = 0 // Zero this or you get a propellor!
|
|
px = 320 // Pivot horizontal center x point (half window width)
|
|
py = 30 // Pivot y center y point from top
|
|
weight = 42 // Diameter of pendulum weight
|
|
tempo = 75 // Smaller value increases pendulum tempo, larger value slows it.
|
|
|
|
timerbegin, 0.02, YES
|
|
bx = px + length * 300 * sin(theta) // Pendulum bottom x point
|
|
by = py - length * 300 * cos(theta) // Pendulum bottom y point
|
|
cls
|
|
pen 6.0, color
|
|
line px, py to bx, by
|
|
oval fill bx -weight/2, by -weight/2, weight, weight, color // Traveling weight
|
|
pen 4.0
|
|
oval fill 313, 20, 16, 16, fn ColorGray // Top center point
|
|
accel = gravity * sin(theta) / length / tempo
|
|
speed += accel / tempo
|
|
theta += speed
|
|
timerEnd
|
|
end fn
|
|
|
|
void local fn DoDialog( ev as long, tag as long, wnd as long )
|
|
select ( ev )
|
|
case _windowWillClose : end
|
|
end select
|
|
end fn
|
|
|
|
on dialog fn DoDialog
|
|
|
|
fn BuildWindow
|
|
fn AnimatedPendulum
|
|
|
|
HandleEvents
|