sync on sync rate 70 hide mouse `set mouse position to centre position mouse 0.5*screen width(),0 `***camera properties*** autocam off set camera range 1,10000 camdist#=20 `cam distance camheight#=8 `cam height smoothness=50 `chasecam smoothness fog on fog distance 150 fog color rgb(100,100,120) `********************* `***wave properties*** `size of wave area rows=50 columns=50 `wavegenerator1 x,z coordinates: a=15 b=10 `wavegenerator2 x,z coordinates: c=35 d=40 `wave characteristics elasticity#=0.002 `determines wave speed damping#=0.995 `determines the decay of the wave height amplitude#=20 `the wave height at the generator points frequency#=1 `how quickly the generator points move up and down current#=0.02 `how much the wave slope affects the boat `****************** `***jetski motion properties*** friction#=0.99 `1=no friction - slides all over the place `0=big friction - like moving through concrete power#=0.01 `controls the acceleration of the boat `********** `******************set up wave matrix******************** `******************************************************** dim tile(rows+1,columns+1) dim v#(rows,columns) make matrix 1,rows*10,columns*10,rows,columns `make matrix 2,rows*10,columns*10,rows,columns `give every tile of the matrix a coordinate - tile(x,z) for x=1 to rows for z=1 to columns tile(x,z)=tile tile=tile+1 next z next x `fix the wave generator points dim fixed(rows*columns) fixed(tile(a,b))=1 fixed(tile(c,d))=1 `***apply texture to wave*** `load image "watertexture.jpg",1 create bitmap 1,10,10 ink rgb(255,255,255),0 box 0,0,10,10 ink rgb(0,0,180),0 box 0,0,9,9 get image 1,0,0,10,10,1 prepare matrix texture 1,1,1,1 ghost matrix on 1 `tile=1 `for x=rows-1 to 0 step -1 `for z=0 to columns-1 `set matrix tile 1,z,x,tile `inc tile `next z `next x `*************************** `****************************************************** `****************************************************** `*******************make objects********************** `make simple skysphere make object sphere 2000,-10000 ink rgb(150,150,250),0 box 0,0,10,10 get image 3,0,0,10,10 texture object 2000,3 set object fog 2000,0 `Make a simple boat - object number 1 make object cube 1,0.1 make object box 2,2,1,4 make mesh from object 1,2 delete object 2 make object cone 3,2 scale object 3,100,200,100 xrotate object 3,90 make mesh from object 2,3 delete object 3 make object sphere 4,2 make mesh from object 3,4 delete object 4 add limb 1,1,1 add limb 1,2,2 offset limb 1,2,0,0,2 add limb 1,3,3 ink rgb(255,0,0),0 box 0,0,10,10 get image 2,0,0,10,10 set current bitmap 0 texture object 1,2 ink rgb(255,255,255),0 `***************************************************** `*******initial positions and speeds ********* number=50 `number of floating boxes dim x#(number) dim y#(number) dim z#(number) dim frontspeed#(number) dim sidespeed#(number) x#(1)=rnd(250) `initial x position of jetski z#(1)=rnd(250) `initial z position of jetski for object=2 to number make object cube object,5 x#(object)=rnd(500) `initial x position of boxes z#(object)=rnd(500) `initial z position of boxes next object `********************************** `************MAIN PROGRAM LOOP*************** do gosub wave gosub control gosub get_wave_slope gosub chasecam text 0,0,str$(screen fps()) sync loop `************subroutines*************** wave: `****move the generator points up and down**** y#=amplitude#*sin(theta#) theta#=theta#+frequency# if fixed(tile(a,b))=1 set matrix height 1,a,b,y# endif if fixed(tile(c,d))=1 set matrix height 1,c,d,y# endif `******************************************** `****make wave propogate through matrix****** for x=1+1 to rows-1 for z=1+1 to columns-1 `check x+1 height if x<rows distxp1#=get matrix height(1,x+1,z)-get matrix height (1,x,z) endif `check x-1 height if x>1 distxm1#=get matrix height(1,x-1,z)-get matrix height (1,x,z) endif `check z+1 height if z<columns distzp1#=get matrix height(1,x,z+1)-get matrix height (1,x,z) endif `check z-1 height if z>1 distzm1#=get matrix height(1,x,z-1)-get matrix height (1,x,z) endif `calculate vector some of heights adjacent to tile `and make this proportional to the tile's acceleration vectorsum#=distxp1#+distxm1#+distzp1#+distzm1# a#=vectorsum#*elasticity# `increase tile's velocity by it's acceleration amount v#(tile(x,z))=v#(tile(x,z))+a# if fixed(tile(x,z))=0 `reposition tile set matrix height 1,x,z,get matrix height(1,x,z)+v#(tile(x,z)) v#(tile(x,z))=v#(tile(x,z))*damping# endif next z next x update matrix 1 `**************************************************** return get_wave_slope: for object=1 to number y#(object)=get ground height(1,x#(object),z#(object)) yfront#=get ground height(1,newxvalue(x#(object),angle#,1),newzvalue(z#(object),angle#,1)) yside#=get ground height(1,newxvalue(x#(object),angle#+90,1),newzvalue(z#(object),angle#+90,1)) frontspeed#(object)=frontspeed#(object)+(y#(object)-yfront#)*current# sidespeed#(object)=sidespeed#(object)+(y#(object)-yside#)*current# x#(object)=newxvalue(x#(object),angle#,frontspeed#(object)) z#(object)=newzvalue(z#(object),angle#,frontspeed#(object)) x#(object)=newxvalue(x#(object),angle#+90,sidespeed#(object)) z#(object)=newzvalue(z#(object),angle#+90,sidespeed#(object)) position object object,x#(object),y#(object),z#(object) next object return control: `***steering**** if mousex()>0.5*screen width() then polarity=1 if mousex()<0.5*screen width() then polarity=-1 `the square function is so that the steering is less sensitive `in the middle and more sensitive for extreme turns `note: squaring makes the mouse position always positive, `hence the need for a polarity. turn#=(((mousex()-(0.5*screen width()))^2)/10000)*polarity if turn#>1 then turn#=1 if turn#<-1 then turn#=-1 yrotate object 1,object angle y(1)+turn# direction#=wrapvalue(direction#+turn#) rotate limb 1,1,0,0,-turn#*20 `roll the boat body according to turn amount `*************** `*****speed***** if mouseclick()=1 then frontspeed#(1)=frontspeed#(1)+(power#*cos(direction#)):sidespeed#(1)=sidespeed#(1)+(power#*sin(direction#)) if mouseclick()=2 then frontspeed#(1)=frontspeed#(1)-(power#*cos(direction#)):sidespeed#(1)=sidespeed#(1)-(power#*sin(direction#)) for object=1 to number frontspeed#(object)=frontspeed#(object)*friction# sidespeed#(object)=sidespeed#(object)*friction# next object `*************** return chasecam: yrotate camera curveangle(direction#,camera angle y(),smoothness) position camera object position x(1),object position y(1)+camheight#,object position z(1) move camera -camdist# point camera object position x(1),object position y(1)+camheight#,object position z(1) return `********have a nice day*************