rem Collision Functionality

sync on : sync rate 0 : hide mouse : color backdrop rgb(100,100,255)
set text transparent : set text font "Arial" : set text size 20

rem load sounds
load sound "impact.wav",1
for s=2 to 10 : clone sound s,1 : next s

rem load images
load image "marble.bmp",1
load image "moss.bmp",2
load image "fur.bmp",3

rem create floor
make object box 1,400,10,400 : position object 1,0,-5,0
texture object 1,2 : scale object texture 1,2,2

rem create walls
make object box 2,400,100,10 : position object 2,0,50,-200
make object box 3,400,100,10 : position object 3,0,50, 200
make object box 4,10,100,400 : position object 4,-200,50,0
make object box 5,10,100,400 : position object 5, 200,50,0
for t=2 to 5
 texture object t,2 : scale object texture t,4,1
next t

rem Set floor and walls to box collision for rectangle roamer
make object collision box 1,-200,-5,-200,200,5,200,0
make object collision box 2,-200,-50,-5,200,50,5,0
make object collision box 3,-200,-50,-5,200,50,5,0
make object collision box 4,-5,-50,-200,5,50,200,0
make object collision box 5,-5,-50,-200,5,50,200,0

rem create collision platform
make object box 6,100,12,100
position object 6,0,5,0
texture object 6,1

rem create bouncey ball and set bounce-vars
make object sphere 11,25
set object collision to spheres 11
set object radius 11,15
texture object 11,1
y#=75 : iy#=2

rem rectangle roamer for box collision
make object box 41,40,20,40 : position object 41,95,31,50
make object collision box 41,-20,-10,-20,20,10,20,0
texture object 41,1
set shadow shading on 41

rem load a model in center of world
load object "alien.x",51
set object collision to polygons 51
scale object 51,1500,1500,1500
position object 51,0,40,0
xrotate object 51,180
texture object 51,3
scale object texture 51,5,5
set object speed 51,100
loop object 51

rem create a crate for automatic collision
make object cube 61,15
automatic object collision 61,8.0,0
set object collision to spheres 61
position object 61,-75,30,75
texture object 61,1
set shadow shading on 61

rem setup camera and lights
set point light 0,0,0,0
make light 1 : set point light 1,0,0,0 : color light 1,255,-100,-100
position camera 0,30,-100

rem set automatic collision for camera
automatic camera collision 0,30,0
set global collision on

rem loop
do

rem delete all collision data
if spacekey()=1
 gosub _delete_collision
endif

rem move crate to test automatic object collision
yrotate object 61,wrapvalue(object angle y(61)-0.2)
move object down 61,0.5
move object 61,0.5

rem control camera
control camera using arrowkeys 0,1,2

rem control bouncey ball
y#=y#+(iy#/20.0) : iy#=iy#-0.2
position object 11,object position x(11),y#,object position z(11)
if object collision(11,0)>0 then iy#=iy#*-1.0 : play sound 1+rnd(9)

rem display types of collision
if object in screen(11)=1 then center text object screen x(11),object screen y(11)-25,"Polygon Collision"
if object in screen(41)=1 then center text object screen x(41),object screen y(41)-25,"Sliding Box Collision"
if object in screen(61)=1 then center text object screen x(61),object screen y(61)-25,"Automated Collision"

rem Add gravity to camera to test automatic collision
position camera camera position x(),camera position y()-0.01,camera position z()

rem rectangle roamer
move object 41,0.3
ballhit=object collision(41,0)
`if ballhit>=21 and ballhit<=30
` yrotate object ballhit,wrapvalue(object angle y(41))
` move object up ballhit,5.0
` move object ballhit,0.6
`endif
set cursor 0,0
print ballhit
if ballhit>0
 spin#=rnd(45)
 ax#=object position x(41)-get object collision x()
 ay#=object position y(41)-get object collision y()
 az#=object position z(41)-get object collision z()
 position object 41,ax#,ay#,az#
endif
if spin#>0
 spin#=spin#-1.0
 yrotate object 41,wrapvalue(object angle y(41)+1)
endif

rem move default light with ball
position light 0,object position x(11),object position y(11),object position z(11)

rem move coloured light with roamer
position light 1,object position x(41),object position y(41)+25,object position z(41)

rem update screen
sync

rem end loop
loop

_delete_collision:
 for o=1 to 5
  delete object collision box o
 next o
 set global collision off
return