Challenge:
Winner?:
No
Code Snippet:
set display mode 1024,768,32 set camera range 1,5000 backdrop on color backdrop 0 hide mouse sync rate 60 sync on paddle=1 table=2 net=3 ball=4 paddle2=5 score_comp=6 score_player=7 paddle_texture=1 table_texture=2 net_texture=3 ball_texture=4 score1=5 score2=6 paddle_rim=1 paddle_handle=2 net_post=3 paddlex#=0.0 paddley#=0.0 paddlez#=605.0 pad2x#=50.0 pad2y#=0.0 pad2z#=-605.0 pad2xv#=0.0 pad2yv#=0.0 pad2xm#=3.0 pad2ym#=3.0 border#=350.0 gravity#=0.05 friction#=0.9 table_height=-45 play=0 make_play=0 dim score(2) dim ballhit(2) ballhit(1)=0 ballhit(2)=0 servedir=1 make light 1 position light 1,0,250,1050 position light 0,0,500,0 set image colorkey 0,0,0 gosub make_paddle instance object paddle2,paddle gosub make_table position object table,0,table_height-5,0 gosub make_net position object net,0,table_height+25,0 gosub make_ball gosub make_scoreboard yrotate object score_comp,270 yrotate object score_player,270 position object score_comp,400,0,50 position object score_player,400,0,550 position camera 0,250,1050 point camera 0,0,0 while not escapekey() gosub move_paddle gosub move_camera if play=0 ink rgb(255,255,255),0 if servedir=1 box 665,325,805,345 set cursor 670,327 else box 850,640,990,660 set cursor 855,642 endif ink 0,0 set text font "arial" set text size 16 print "SPACEBAR to serve" endif if spacekey() if play=0 then play=1 endif if not spacekey() if play=1 play=2 gosub ball_serve endif endif if play=2 ballyv#=ballyv#-gravity# ballx#=ballx#+ballxv# bally#=bally#+ballyv# ballz#=ballz#+ballzv# if bally#<table_height+10 if ballx#>=-400 and ballx#<=400 and ballz#>=-600 and ballz#<=600 ballyv#=-ballyv#*friction# bally#=bally#+ballyv# if ballz#<0 then inc ballhit(2) if ballz#>0 then inc ballhit(1) endif endif if ballz#<-605 then gosub computer if ballz#>605 and ballz#<615 then gosub player if ballz#>-10 and ballz#<10 then gosub net if bally#<table_height then gosub ball_stop if abs(ballz#)>700 then gosub ball_stop position object ball,ballx#,bally#,ballz# xrotate object ball,object angle x(ball)+6.0 if makeplay>0 if ballhit(3-makeplay)=1 and ballhit(makeplay)=0 then gosub ball_stop endif endif sync endwhile end update_score: set current bitmap score1 ink rgb(0,255,255),0 box 0,0,50,50 ink rgb(0,0,128),0 set cursor 10,10 set text font "arial" set text size 20 print score(1) get image score1,0,0,50,50 set current bitmap score2 ink rgb(0,255,255),0 box 0,0,50,50 ink rgb(0,0,128),0 set cursor 10,10 print score(2) get image score2,0,0,50,50 set current bitmap 0 texture object score_comp,score1 texture object score_player,score2 return move_camera: if upkey() pitch camera up 90.0 move camera 1 point camera 0,0,0 endif if downkey() pitch camera down 90.0 move camera 1 point camera 0,0,0 endif return move_paddle: xmove=mousemovex() ymove=mousemovey() swing=mouseclick() paddlex#=paddlex#-xmove paddley#=paddley#-ymove if paddlex#<-border# or paddlex#>border# then paddlex#=paddlex#+xmove if paddley#<-border# or paddley#>border# then paddley#=paddley#+ymove if swing>0 and swinging=0 then swinging=1 if swinging=1 paddle_swing#=paddle_swing#+3.0 if paddle_swing#>30.0 paddle_swing#=30.0 if swing=0 then swinging=2 endif endif if swinging=2 paddle_swing#=paddle_swing#-3.0 if paddle_swing#<0 then swinging=0:paddle_swing#=0.0 endif yrotate object paddle,180+paddle_swing# position object paddle,paddlex#,paddley#,paddlez# if ballz#>0 pad2xv#=pad2xv#-(pad2x#-50.0)/100.0 if abs(pad2xv#)>pad2xm# then pad2xv#=pad2xv#+(pad2x#-50.0)/100.0 pad2yv#=pad2yv#-(pad2y#-50.0)/100.0 if abs(pad2yv#)>pad2ym# then pad2yv#=pad2yv#+(pad2y#-50.0)/100.0 endif if ballz#<0 pad2xv#=pad2xv#-(pad2x#-ballx#)/50.0 if abs(pad2xv#)>pad2xm# then pad2xv#=sgn(pad2xv#)*pad2xm# pad2yv#=pad2yv#-(pad2y#-bally#)/50.0 if abs(pad2yv#)>pad2ym# then pad2yv#=sgn(pad2yv#)*pad2ym# endif pad2x#=pad2x#+pad2xv# if pad2y#>400.0 then pad2y#=400.0 pad2y#=pad2y#+pad2yv# if pad2y#<0.0 then pad2y#=0.0 position object paddle2,pad2x#,pad2y#,pad2z# if ballhit(1)>1 or ballhit(2)>1 or (ballhit(1)=1 and ballhit(2)=1) gosub ball_stop endif return net: if bally#<table_height+50 ballzv#=sgn(ballz#)*2.0 ballyv#=0.0 endif return return player: loc=sqrt((paddlex#-ballx#)^2+(paddley#-bally#)^2) if loc<=50 ballzv#=-ballzv#*friction# if swinging>0 ballzv#=ballzv#*(1.0+paddle_swing#/60.0) ballyv#=ballyv#+1.0-ymove/100.0 if ballyv#<0.0 then balyv#=1.0 ballxv#=ballxv#-xmove/2.0 endif ballz#=ballz#+ballzv# make_play=2 ballhit(1)=0:ballhit(2)=0 endif return computer: loc=sqrt((pad2x#-ballx#)^2+(pad2y#-bally#)^2) if loc<=100 ballzv#=-ballzv#*friction# ballzv#=ballzv#*(1.0+paddle_swing#/60.0) ballyv#=ballyv#+1.0 if ballyv#<0.0 then ballyv#=1.0 ballxv#=-sgn(ballx#) ballz#=ballz#+ballzv# make_play=1 ballhit(1)=0:ballhit(2)=0 endif return return ball_stop: if ballhit(make_play)>0 and ballhit(3-make_play)=0 inc score(make_play) else inc score(3-make_play) endif play=0 ballx#=50.0 bally#=50.0 ballz#=-600.0 ballhit(1)=0 ballhit(2)=0 hide object ball gosub update_score return ball_serve: if servedir=1 ballx#=pad2x# bally#=pad2y# ballz#=-600.0 ballxv#=-sgn(pad2x#) ballyv#=3.0 ballzv#=8.0 make_play=1 else ballx#=paddlex# bally#=paddley# ballz#=600.0 ballxv#=-sgn(paddlex#) ballyv#=3.0 ballzv#=-8.0 make_play=2 endif show object ball servedir=3-servedir return make_ball: create bitmap 1,20,20 ink rgb(255,255,255),0 box 0,0,20,20 ink rgb(128,128,128),0 for x=0 to 20 step 2 for y=0 to 20 step 2 dot x,y next y next x get image ball_texture,0,0,20,20 delete bitmap 1 make object sphere ball,20 texture object ball,ball_texture set shadow shading on ball position object ball,0,0,2000 return make_paddle: create bitmap 1,200,200 ink 0,0 line 0,0,200,200 ink rgb(0,0,255),0 for x=1 to 98 circle 100,100,x next x get image paddle_texture,0,0,200,200 delete bitmap 1 set current bitmap 0 make object plain paddle,100,100 texture object paddle,1 set object transparency paddle,1 make object cylinder paddle+1,100 scale object paddle+1,100,5,100 xrotate object paddle+1,90.0 make mesh from object paddle_rim,paddle+1 delete object paddle+1 add limb paddle,1,paddle_rim color limb paddle,paddle_rim,rgb(0,0,255) texture limb paddle,paddle_rim,paddle_texture offset limb paddle,paddle_rim,0,0,2.5 make object box paddle+1,40,15,8 zrotate object paddle+1,-45.0 make mesh from object paddle+1,paddle_handle delete object paddle+1 add limb paddle,2,paddle_handle color limb paddle,paddle_handle,rgb(64,64,64) offset limb paddle,paddle_handle,45.0,-45.0,2.5 ghost object on paddle fade object paddle,150 return make_table: create bitmap 1,400,600 ink rgb(0,255,0),0 box 0,0,400,600 ink rgb(255,255,255),0 box 5,5,390,10 box 5,5,10,595 box 390,5,395,595 box 5,590,395,595 box 198,5,202,595 get image table_texture,0,0,400,600 delete bitmap 1 set current bitmap 0 make object box table,800,10,1200 texture object table,table_texture return make_net: create bitmap 1,800,50 ink 0,0 box 0,0,800,50 ink rgb(128,128,128),0 for x=-50 to 850 step 8 line x,0,x+50,50 line x,50,x+50,0 next x line 0,0,800,0 get image net_texture,0,0,800,50 delete bitmap 1 make object plain net,800,50 texture object net,net_texture set object transparency net,1 make object cylinder net+1,50 scale object net+1,10,100,10 make mesh from object net_post,net+1 delete object net+1 add limb net,1,net_post offset limb net,1,-400,0,0 color limb net,1,rgb(128,255,255) add limb net,2,net_post offset limb net,2,400,0,0 color limb net,2,rgb(128,255,255) return make_scoreboard: make object plain score_comp,100,100 make object plain score_player,100,100 ink rgb(0,255,255),0 create bitmap score1,100,100 box 0,0,100,100 get image score1,0,0,100,100 create bitmap score2,100,100 box 0,0,100,100 get image score2,0,0,100,100 set current bitmap 0 texture object score_comp,score1 texture object score_player,score2 return function sgn(x#) if x#<0 then value=-1 if x#>0 then value=1 if x#=0 then value=0 endfunction value