Just a cool looking abstract gas thingy i did based on my billiard/pool app.
Rem Project: jelly2
Rem Created: Wednesday, May 02, 2012
Rem ***** Main Source File *****
Rem Project: Dark Basic Pro Project
Rem Created: Wednesday, May 02, 2012
Rem ***** Main Source File *****
sync on : sync rate 0 : global dim state(300)
w = screen width() : h = screen height()
load image "glow.bmp",1
bx1# = 50 : by1# = 50 : bx2# = w-50 : by2# = h-50
b# = 10 : a = b#^2
dim x#(a) : dim y#(a) : dim v(a) : dim fx#(a) : dim fy#(a)
v3 = createvector() : v4 = createvector() : v5 = createvector() : v6 = createvector() : v7 = createvector() : v8 = createvector()
r# = 15.0 : r2# = (r#+r#)^2
id1 = a2createfont("arial",30,1,1) : id2 = a2createfont("arial",10,1,1)
for i = 1 to a
x#(i) = (10+i-int((i+9)/b#)*b#)*(r#*2+0.5)+300 : fx#(i) = x#(i)
y#(i) = int((i+9)/b#)*(r#*2+0.5)+200 : fy#(i) = y#(i)
v(i) = createvector()
NEXT
lastlooptime = hitimer(100)+100 : gamenormalspeed# = 600.0 : gametargetspeed# = 600.0 : gamespeed# = 600.0
friction# = 1250
wallfric# = 1
maxpower# = 2.3
powerinc# = 0.02
a2setblendmode 2,2,1
do
if spacekey() = 1 then gametargetspeed# = max(10,gametargetspeed#*0.995) : else gametargetspeed# = (gametargetspeed#*lps#+gamenormalspeed#)/(lps#+1.0)
gamespeed# = (gamespeed#*lps#+gametargetspeed#)/(lps#+1.0) : ts# = gamespeed#/lps# : inc loops#
if hitimer(100) >= lastlooptime
lastlooptime = lastlooptime+100 : lps# = loops#*1.0 : loops# = 0
endif
for i = 1 to a
fx#(i) = x#(i) : fy#(i) = y#(i)
for j = i+1 to a
if squaredist(x#(i),y#(i),x#(j),y#(j)) < r2#
if length vector2(v(i)) >= length vector2(v(j))
elastic(x#(i),y#(i),x#(j),y#(j),r#,v(i),v(j),v3,v4,v5,v6,v7,v8)
fx#(i) = x vector2(v3) : fy#(i) = y vector2(v3) : fx#(j) = x vector2(v4) : fy#(j) = y vector2(v4)
else
elastic(x#(j),y#(j),x#(i),y#(i),r#,v(j),v(i),v3,v4,v5,v6,v7,v8)
fx#(i) = x vector2(v4) : fy#(i) = y vector2(v4) : fx#(j) = x vector2(v3) : fy#(j) = y vector2(v3)
endif
endif
next
rem multiply vector2 v(i),(1-1.0/(friction#/ts#))*min(length vector2(v(i))*33,1)
room(x#(i),y#(i),r#,wallfric#,v(i),v3,bx1#,by1#,bx2#,by2#)
fx#(i) = x vector2(v3)+x vector2(v(i))*ts# : fy#(i) = y vector2(v3)+y vector2(v(i))*ts#
NEXT
for i = 1 to a
x#(i) = fx#(i) : y#(i) = fy#(i)
for j = i+1 to a
d# = squaredist(x#(i),y#(i),x#(j),y#(j))
if d# < r2#
separate(d#,x#(i),y#(i),x#(j),y#(j),r#,v3,v4)
x#(j) = x vector2(v3) : y#(j) = y vector2(v3)
x#(i) = x vector2(v4) : y#(i) = y vector2(v4)
endif
next
next
if hitimer(30) > oldtime
oldtime = hitimer(30)
a2text id2,0,0,"physics loops per second : "+str$(lps#)+" || visual speed : "+str$(gamespeed#),rgb(min((15000/lps#)*100,255),min((lps#/15000)*255,255),0)
a2text id2,0,10,"graphics loops per second : "+str$(screen fps()),rgb(255,255,255)
for i = 1 to a
a2drawimage 1,x#(i),y#(i),0,128,128,1,0,rgb(120,40,10)
a2drawimage 1,x#(i),y#(i),0,128,128,0.2,0,rgb(50,50,50)
NEXT
if shot = 0
z# = atanfull(x#(16)-mousex(),y#(16)-mousey()) : d# = -dist(x#(16),y#(16),mousex(),mousey())
ax1# = newxvalue(x#(16),z#-90,r#) : ax2# = newxvalue(mousex(),z#-90,r#) : ax3# = newxvalue(x#(16),z#+90,r#) : ax4# = newxvalue(mousex(),z#+90,r#)
ay1# = newzvalue(y#(16),z#-90,r#) : ay2# = newzvalue(mousey(),z#-90,r#) : ay3# = newzvalue(y#(16),z#+90,r#) : ay4# = newzvalue(mousey(),z#+90,r#)
a2line ax1#,ay1#,ax2#,ay2#,rgb(255,255,255),rgb(0,0,0) : a2line ax3#,ay3#,ax4#,ay4#,rgb(255,255,255),rgb(0,0,0)
a2filltriangle ax1#,ay1#,ax3#,ay3#,newxvalue(ax1#,z#,d#*(power#/maxpower#)),newzvalue(ay1#,z#,d#*(power#/maxpower#)),rgb(155,0,0),rgb(127,0,0),rgb(127-(power#/maxpower#)*127,(power#/maxpower#)*127,0)
a2filltriangle ax3#,ay3#,newxvalue(ax1#,z#,d#*(power#/maxpower#)),newzvalue(ay1#,z#,d#*(power#/maxpower#)),newxvalue(ax3#,z#,d#*(power#/maxpower#)),newzvalue(ay3#,z#,d#*(power#/maxpower#)),rgb(127,0,0),rgb(127-(power#/maxpower#)*127,(power#/maxpower#)*127,0),rgb(127-(power#/maxpower#)*127,(power#/maxpower#)*127,0)
if mouseclick()= 1 then inc power#,powerinc#
power# = wrap(power#,0,maxpower#)
if power# > 0 and mouseclick() = 0 then set vector2 v(16),mousex()-x#(16),mousey()-y#(16): lenvec(v(16),power#) : shot = 1 : power# = 0
ENDIF
sync
cls
eNDIF
LOOP
function separate(d#,x1#,y1#,x2#,y2#,r#,v1,v2)
d# = sqrt(d#) : z# = atanfull(x2#-x1#,y2#-y1#) : dv# = 2*r#-d#
set vector2 v1,newxvalue(x2#,z#,dv#*0.5),newzvalue(y2#,z#,dv#*0.5)
set vector2 v2,newxvalue(x1#,z#,dv#*-0.5),newzvalue(y1#,z#,dv#*-0.5)
endfunction
function room(x#,y#,r#,friction#,v,v2,bx1#,by1#,bx2#,by2#)
if x# < bx1#+r# or x# > bx2#-r# then ox# = x# : x# = minmax(x#,bx1#+r#,bx2#-r#) : y# = y#+(y vector2(v)*(x#-ox#))/x vector2(v) : set vector2 v,-x vector2(v),y vector2(v) : multiply vector2 v,friction# :
if y# < by1#+r# or y# > by2#-r# then oy# = y# : y# = minmax(y#,by1#+r#,by2#-r#) : x# = x#+(x vector2(v)*(y#-oy#))/y vector2(v) : set vector2 v,x vector2(v),-y vector2(v) : multiply vector2 v,friction#
set vector2 v2,x#,y#
ENDFUNCTION
function elastic(x1#,y1#,x2#,y2#,r#,v1,v2,v3,v4,v5,v6,v7,v8)
x# = x vector2(v1)-x vector2(v2) : y# = y vector2(v1)-y vector2(v2)
a# = 2 : b# = 2*(x1#*x#-x2#*x#+y1#*y#-y2#*y#) : c# = x1#*x1#+y1#*y1#+x2#*x2#+y2#*y2#-2*(x1#*x2#+y1#*y2#)-4*r#*r#
d# = (b#^2-4*a*c)
if d# >= 0
t1# = (-b+sqrt(d#))/(2*a#)
t2# = (-b-sqrt(d#))/(2*a#)
t# = min(t1#,t2#)
x1# = x1#+x vector2(v1)*t# : y1# = y1#+y vector2(v1)*t# : x2# = x2#+x vector2(v2)*t# : y2# = y2#+y vector2(v2)*t#
endif
set vector2 v3,x1#-x2#,y1#-y2#
normalize vector2 v4,v3
scale vector2 v5,v4,dot product vector2(v4,v1)
scale vector2 v6,v4,dot product vector2(v4,v2)
subtract vector2 v7,v1,v5
subtract vector2 v8,v2,v6
subtract vector2 v1,v7,v6
add vector2 v2,v8,v5
set vector2 v3,x1#,y1#, : set vector2 v4,x2#,y2#
ENDFUNCTION
function minmax(v#,bot#,top#)
v# = max(bot#,min(v#,top#))
ENDFUNCTION v#
function createvector()
n = find free vector()
a = make vector2(n)
ENDFUNCTION n
function ballshadow(x#,y#,r#,lx#,ly#,lh#,detail#,c as dword)
xd# = (-(x#-lx#)*lh#)/(2*r#-lh#)-(x#-lx#)
yd# = (-(y#-ly#)*lh#)/(2*r#-lh#)-(y#-ly#)
for i = 1 to int(detail#)
a2drawimage 1,x#+(i/detail#)*xd#,y#+(i/detail#)*yd#,0,128,128,(-fabs(detail#/2-i)+detail#/2)*r#*0.015,0,c
NEXT
ENDFUNCTION
function fabs(v#)
if v# < 0 then v# = -v#
ENDFUNCTION v#
function shadow(x#,y#,width#,lx#,ly#,length,d as dword)
length = dist(x#,y#,lx#,ly#)*0.3
sv = createvector()
set vector2 sv,y#-ly#,-x#+lx#
lenvec(sv,width#)
sox1# = x#+x vector2(sv) : sox2# = x#-x vector2(sv)
soy1# = y#+y vector2(sv) : soy2# = y#-y vector2(sv)
sox# = lx# : soy# = ly#
sz1# = atanfull(sox#-sox1#,soy#-soy1#)+180 : sz2# = atanfull(sox#-sox2#,soy#-soy2#)+180
sx1# = newxvalue(sox1#,sz1#,length) : sy1# = newzvalue(soy1#,sz2#,length)
sx2# = newxvalue(sox2#,sz2#,length) : sy2# = newzvalue(soy2#,sz2#,length)
a2setblendmode 2,2,3
a2filltriangle sox1#,soy1#,sox2#,soy2#,sx1#,sy1#,rgb(d,d,d),rgb(d,d,d),rgb(0,0,0)
a2filltriangle sox2#,soy2#,sx1#,sy1#,sx2#,sy2#,rgb(d,d,d),rgb(0,0,0),rgb(0,0,0)
a2setblendmode 2,1,1 : a2dot 0,0,rgb(255,255,255)
delete vector2 sv
ENDFUNCTION
function button(x#,y#,r#)
if mousex() > x#-r# and mousex() < x#+r# and mousey() > y#-r# and mousey() < y#+r#
selected = mouseclick()+1
endif
endfunction selected
function lenvec(v,len#)
normalize vector2 v,v
multiply vector2 v,len#
ENDFUNCTION
function keypress(key)
if keystate(key) = 1
accept = 1
if state(key) = 0
accept = 2
state(key) = 1
endif
ENDIF
if keystate(key) = 0 then state(key) = 0
ENDFUNCTION accept
function squaredist(x1#,y1#,x2#,y2#)
d# = (x1#-x2#)^2+(y1#-y2#)^2
ENDFUNCTION d#
function dist(x1#,y1#,x2#,y2#)
d# = sqrt((x1#-x2#)^2+(y1#-y2#)^2)
ENDFUNCTION d#
function boxdist(x1#,y1#,x2#,y2#)
dx# = abs(x1#-x2#) : dy# = abs(y1#-y2#)
d# = max(dx#,dy#)
ENDFUNCTION d#