This is really good. Thanx alot. I made the same for an object. I know everybody can do that but I made it easier. Just copy the code here and paste it into the xcol DBpro source.
`***************************
`.X Model sliding collision
`By Kensupen and Lokidecat
`Nerdsoft Creations (C) 2003
`***************************
`This uses all native DBPro commands to give a user sliding collision
`against ANY .X model to slide on ANY angle. It works almost as good as BSP
`collision, except for height. If you can walk onto an object, it just
`puts you at that height. I might try to advance the code later to give
`a smooth height adjustment.
autocam off
set image colorkey 255,0,255
sync on
srate=60
sync rate srate
color backdrop 0
set camera range 1,5000
set ambient light 75
make object sphere 2,20
`Our cheap level
load object "mslevel.x",1
set object transparency 1,2
dir$=get dir$()
`Height cam is off the ground
charht#=10
`speed to move
spd#=3
`set the radius for collisions
radius#=10.0
`set initial object position
position object 2,0,charht#,0
yrotate object 2,180
`number of checks
`the lower this number is, the more off the collisions will be vs. any rotated object.
`also, the lower the number, the more speed it runs at.
`lowest for rotated collision is 4(non rotated/box collision) max is 360, but 360 is WAAAY slow
`I'd advide is you play with this number to keep with a multiple of 4
checks=8
if checks<4 then checks=4
if checks>360 then checks=360
`width of the angles
angwidth=360/checks
`make arrays for collision data
dim ang#(checks-1,2)
dim sort#(checks-1,2)
do
set cursor 0,0
print "Sync Rate set at ",srate," Press Enter to change"
print "FPS:",screen fps()
if scancode()=0 then hold=0
if returnkey()=1 and hold=0
hold=1
if srate=60
srate=0
else
srate=60
endif
sync rate srate
endif
`Get initial positions and a revert set
oldx#=object position x(2)
oldz#=object position z(2)
cx#=object position x(2)
cy#=object position y(2)
cz#=object position z(2)
ca#=object angle y(2)
if upkey()=1
cx#=newxvalue(cx#,ca#,spd#)
cz#=newzvalue(cz#,ca#,spd#)
position object 2,cx#,cy#,cz#
endif
if leftkey()=1 then ca#=ca#-2
if rightkey()=1 then ca#=ca#+2
yrotate object 2,ca#
`Show the camera angle
print "Object angle:",object angle y(2)
`The main sliding collision code
gosub _collision
`My code to walk up a ramp if the angle isn't too steep
gosub _ramp
`A just in case reset
if spacekey()=1 then position object 2,0,200,0
`Camera follows the object
posx#=object position x(2)
posy#=object position y(2)
posz#=object position z(2)
angle#=object angle y(2)
set camera to follow posx#,posy#,posz#,angle#,50,posy#+20,30,1
sync
loop
_ramp:
`get positions again
cx#=object position x(2)
cz#=object position z(2)
`Get your old height
oldht#=object position y(2)
`calc new height using intersect object from the old height down charht# units
sub#=intersect object(1,cx#,oldht#,cz#,cx#,oldht#-(charht#*2),cz#)
ht#=(oldht#+charht#)-sub#
if sub#=0 then ht#=charht#
`do some gravity
grav#=grav#-0.25
`if you are going up a ramp
if oldht#+grav#<ht#
grav#=0.0
position object 2,cx#,ht#,cz#
else
`if you are falling
ht#=oldht#+grav#
position object 2,cx#,ht#,cz#
endif
return
_collision:
`make 72 collision points. You can use more or less, but this number seems to work good.
`These are vectors every 5 degrees from the camera position out.
`They return the distance when they hit an object
for x=0 to checks-1
chx#=newxvalue(cx#,x*angwidth,1)
chz#=newzvalue(cz#,x*angwidth,1)
ang#(x,1)=intersect object(1,cx#,cy#,cz#,chx#,cy#,chz#)
if ang#(x,1)=0 then ang#(x,1)=999999
ang#(x,2)=x*angwidth
sort#(x,1)=ang#(x,1)
sort#(x,2)=ang#(x,2)
next x
`sort the array to find the closest object and it's degrees
for x=0 to checks-2
for y=x+1 to checks-1
if ang#(x,1)>ang#(y,1)
temp#=ang#(x,1)
temp2#=ang#(x,2)
ang#(x,1)=ang#(y,1)
ang#(x,2)=ang#(y,2)
ang#(y,1)=temp#
ang#(y,2)=temp2#
endif
next x
next y
`This is the closest wall and what degrees you would face to see it
print "Angle to closest wall:",ang#(0,2)
print "Distance to that wall:",ang#(0,1)
`find +-90 degrees from the closest one for when you walk into a corner so it doesn't shake
prev=wrapvalue(ang#(0,2)-90)/angwidth
nxt=wrapvalue(ang#(0,2)+90)/angwidth
newd#=radius#-ang#(0,1)
newa#=wrapvalue(ang#(0,2)-180)
newd1#=radius#-sort#(prev,1)
newa1#=wrapvalue(sort#(prev,2)-180)
newd2#=radius#-sort#(nxt,1)
newa2#=wrapvalue(sort#(nxt,2)-180)
`if you are less than radius from a wall, push you out to 20 from it
if ang#(0,1)<radius# and ang#(0,1)>0.0
repx#=newxvalue(cx#,newa#,newd#)
repz#=newzvalue(cz#,newa#,newd#)
position object 2,repx#,cy#,repz#
endif
cx#=object position x(2)
cz#=object position z(2)
`this is if you are coming into a corner, this pushes you sideways
if sort#(prev,1)<radius# and sort#(prev,1)>0.0
repx1#=newxvalue(cx#,newa1#,newd1#)
repz1#=newzvalue(cz#,newa1#,newd1#)
position object 2,repx1#,cy#,repz1#
endif
cx#=object position x(2)
cz#=object position z(2)
`and the other way. above is left, this is right
if sort#(nxt,1)<radius# and sort#(nxt,1)>0.0
repx2#=newxvalue(cx#,newa2#,newd2#)
repz2#=newzvalue(cz#,newa2#,newd2#)
position object 2,repx2#,cy#,repz2#
endif
return
Current project: Dodge Viper Car Game (Not named yet) Other car models are going to be included soon