Hey Forum!
After several months, I opened dbpro again and started to write something, anything really..
It struck me when after 4 hours into the adventure I had barely done anything at all and upon this discovery, I decided to do some cleaning and remove useless crap.
Well, I can't find a way to make this ugly wall of text disappear. Err, without slapping it inside a function and hiding it somewhere.
sky_previous_stage = (time.stage+3) mod 4
sky_old_r = RGBR( sky_color(sky_previous_stage) )
sky_old_g = RGBG( sky_color(sky_previous_stage) )
sky_old_b = RGBB( sky_color(sky_previous_stage) )
sky_new_r = RGBR( sky_color(time.stage) )
sky_new_g = RGBG( sky_color(time.stage) )
sky_new_b = RGBB( sky_color(time.stage) )
sky_diff_r = (sky_old_r-sky_new_r)
sky_diff_g = (sky_old_g-sky_new_g)
sky_diff_b = (sky_old_b-sky_new_b)
if time.st_p > 0
if sky_diff_r < 0 then sky_fill_r# = sky_old_r + ( (ABS( sky_diff_r )*time.st_p) )
if sky_diff_r > 0 then sky_fill_r# = sky_old_r - ( (ABS( sky_diff_r )*time.st_p) )
if sky_diff_g < 0 then sky_fill_g# = sky_old_g + ( (ABS( sky_diff_g )*time.st_p) )
if sky_diff_g > 0 then sky_fill_g# = sky_old_g - ( (ABS( sky_diff_g )*time.st_p) )
if sky_diff_b < 0 then sky_fill_b# = sky_old_b + ( (ABS( sky_diff_b )*time.st_p) )
if sky_diff_b > 0 then sky_fill_b# = sky_old_b - ( (ABS( sky_diff_b )*time.st_p) )
endif
Paste Sprite sky, 0, 0
Set Sprite Diffuse sky, sky_fill_r#, sky_fill_g#, sky_fill_b#
I tried to play around with the dword values from rgb() (essentially trying to skip the xxx_r, xxx_g, xxx_b variables altogether) but I was too stupid - as is displayed here:
sky_previous_stage = (time.stage+3) mod 4
sky_old_c = sky_color( sky_previous_stage )
sky_new_c = sky_color( time.stage )
sky_diff_c = (sky_old_c-sky_new_c)
if time.st_p > 0
if sky_diff_c < 0 then sky_fill# = sky_old_c + ( (ABS( sky_diff_c )*time.st_p) )
if sky_diff_c > 0 then sky_fill# = sky_old_c - ( (ABS( sky_diff_c )*time.st_p) )
endif
Paste Sprite sky, 0, 0
Set Sprite Diffuse sky, RGBR(sky_fill#), RGBG(sky_fill#), RGBB(sky_fill#)
If it is at all possible to shorten it, and if it caught your interest but you need more info, here is the whole source for compiling (U762).
Setup()
Rem LW - make sun and moon
Type t_Object
id As Integer
x As Float
y As Float
EndType
Global sun As t_Object : sun.id = 1
Global moon As t_Object : moon.id = 2
CLS RGB( 255, 255, 255 )
Get Image sun.id, 0, 0, 64, 64
Get Image moon.id, 0, 0, 48, 48
Sprite moon.id, 0, 0, moon.id
Hide Sprite moon.id
Rem LW - make time
Type t_Time
now As Integer ` current time
max As Integer ` max time
speed As Float ` rate at which time flows
size As Float ` size of each stage in a day
stage As Integer ` the stage of current time in a day
st_p As Float ` progress of current stage
EndType
Global time As t_Time
time.max = 86400 ` 86400 seconds in 24 hours
time.size = time.max / 4
time.speed = 150 ` 150 = 1 hour/s @ 30 fps
time.now = 36000 ` 10 am
DIM timestage(3) As String
timestage(0) = "morning"
timestage(1) = "day"
timestage(2) = "evening"
timestage(3) = "night"
Rem LW - make sky backdrop
sky = 3
CLS RGB(255, 255, 255)
Get Image sky, 0, 0, 640, 360
Sprite sky, 0, 0, sky
Hide Sprite sky
DIM sky_color(3) As dWord
sky_color(0) = RGB( 52, 153, 255) ` morning
sky_color(1) = RGB( 115, 224, 255) ` day
sky_color(2) = RGB( 125, 17, 156) ` evening
sky_color(3) = RGB( 14, 29, 36) ` night
Rem LW - make nightsky backdrop
nightsky = 4
CLS rgb(1,1,1)
box 10, 10, 11, 11 : box 12, 12, 13, 13 : box 20, 20, 21, 21
box 7, 15, 8, 16 : box 50, 5, 51, 6
Get Image nightsky, 0, 0, 64, 36
Sprite nightsky, 0, 0, nightsky
Size Sprite nightsky, 640, 360
Hide Sprite nightsky
DO
Rem LW - update time
time.now = (time.now + time.speed) mod time.max
if time.now > (time.max - ( time.size * 4) ) then time.stage = 3 ` night
if time.now > (time.max - ( time.size * 3) ) then time.stage = 0 ` morning
if time.now > (time.max - ( time.size * 2) ) then time.stage = 1 ` day
if time.now > (time.max - ( time.size * 1) ) then time.stage = 2 ` evening
time.st_p = ( (time.now mod time.size)/time.size )
Rem LW - update sky
sky_previous_stage = (time.stage+3) mod 4
sky_old_r = RGBR( sky_color(sky_previous_stage) )
sky_old_g = RGBG( sky_color(sky_previous_stage) )
sky_old_b = RGBB( sky_color(sky_previous_stage) )
sky_new_r = RGBR( sky_color(time.stage) )
sky_new_g = RGBG( sky_color(time.stage) )
sky_new_b = RGBB( sky_color(time.stage) )
sky_diff_r = (sky_old_r-sky_new_r)
sky_diff_g = (sky_old_g-sky_new_g)
sky_diff_b = (sky_old_b-sky_new_b)
if time.st_p > 0
if sky_diff_r < 0 then sky_fill_r# = sky_old_r + ( (ABS( sky_diff_r )*time.st_p) )
if sky_diff_r > 0 then sky_fill_r# = sky_old_r - ( (ABS( sky_diff_r )*time.st_p) )
if sky_diff_g < 0 then sky_fill_g# = sky_old_g + ( (ABS( sky_diff_g )*time.st_p) )
if sky_diff_g > 0 then sky_fill_g# = sky_old_g - ( (ABS( sky_diff_g )*time.st_p) )
if sky_diff_b < 0 then sky_fill_b# = sky_old_b + ( (ABS( sky_diff_b )*time.st_p) )
if sky_diff_b > 0 then sky_fill_b# = sky_old_b - ( (ABS( sky_diff_b )*time.st_p) )
endif
Paste Sprite sky, 0, 0
Set Sprite Diffuse sky, sky_fill_r#, sky_fill_g#, sky_fill_b#
Rem LW - night sky alpha
remstart
Paste Sprite nightsky, 0, 0
if time.st_p > 0
if time.stage = 0 then nightsky_alpha# = 200 - (time.st_p *200)
if time.stage = 2 then nightsky_alpha# = time.st_p*200
endif
if time.stage = 1 then nightsky_alpha# = 0
if time.stage = 3 then nightsky_alpha# = 200
Set Sprite Alpha nightsky, nightsky_alpha#
remend
Rem LW - display horizon
line 0, 290, 640, 290
Rem LW - update sun
t# = time.now + 10000 ` add an offset
sun.x = 288 + (cos(t#/240)*200)
sun.y = 200 + (sin(t#/240)*250)
Paste Image sun.id, sun.x, sun.y
Rem LW - update moon
t# = time.now - 33200 ` moon is 12h behind sun
moon.x = 296 + (cos(t#/240)*200)
moon.y = 240 + (sin(t#/240)*200)
Paste Sprite moon.id, moon.x, moon.y
if time.st_p > 0
if time.stage = 0 then moon_alpha# = 255 - (time.st_p *255)
if time.stage = 2 then moon_alpha# = time.st_p*255
endif
if time.stage = 1 then moon_alpha# = 0
if time.stage = 3 then moon_alpha# = 255
Set Sprite Alpha moon.id, moon_alpha#
Rem LW - debug
debug_text( 0, 0, "clock : " + str$(debug_gethour())+":"+str$(debug_getminute()) )
debug_text( 0, 15, "stage : " + timestage( time.stage ) )
debug_text( 0, 30, "stage%: " + str$(int(time.st_p*100))+"%" )
Sync
LOOP
Function setup()
CLS 0 : Print "Loading.." : Sync : Sync
Sync On
Sync Rate 30
Set Window On
Set Window Title "Day & night cycle test"
Set Window Size 640, 360
Set Display Mode 640, 360, 32
Set Window Position Desktop Width()/2-320, Desktop Height()/2-180
CLS 0 : Print "Loading.." : Sync
EndFunction
function debug_gethour() : result = (time.now/3600) mod 24
endfunction result
function debug_getminute() : result = (time.now/60) mod 60
endfunction result
function debug_text(xp,yp,caption$)
ink 0, 0
text xp-1,yp,caption$
text xp+1,yp,caption$
text xp,yp+1,caption$
text xp,yp-1,caption$
ink rgb(255,255,255), 0
text xp, yp, caption$
endfunctionIS that a game, a program, or 3 year old drawing.