Quote: "Thirdly, people will not just write the code for you (this is a surefire way to get ignored with future requests)."
Except for me, that is
init_Xcol:
global grav#
`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
global checks as integer
global angwidth as integer
global jumping as integer
checks=12
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)
return
function Xcol(testobj as integer , charht as float , radius as float)
`XCollision - by Kensupen and Lodikecat
`Edited by Calcyman to work as a function
`testobj = terrain object
`charht = height of character
`radius = collision radius
`get positions again
cx#=camera position x()
cz#=camera position z()
`Get your old height
oldht#=camera position y()
`calc new height using intersect object from the old height down charht# units
sub#=intersect object(testobj,cx#,oldht#,cz#,cx#,oldht#-(charht*2.0),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
jumping=0
position camera cx#,ht#,cz#
else
`if you are falling
ht#=oldht#+grav#
position camera cx#,ht#,cz#
endif
If grav#>0
`get positions again
cx#=camera position x()
cz#=camera position z()
`Get your old height
oldht#=camera position y()
`calc new height using intersect object from the old height up charht# units
sub#=intersect object(testobj,cx#,oldht#,cz#,cx#,oldht#+(charht*2.0)+(grav#),cz#)
ht#=(oldht#-charht)+sub#
`if you are hitting a ceiling
if oldht#+grav#<ht#
grav#=-2.0
jumping=0
position camera cx#,ht#-charht,cz#
else
`if you are flying
ht#=oldht#+grav#
position camera cx#,ht#,cz#
endif
endif
`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
cy# = camera position y()
for x=0 to checks-1
chx#=newxvalue(cx#,x*angwidth,100)
chz#=newzvalue(cz#,x*angwidth,100)
ang#(x,1)=intersect object(testobj,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
`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 camera repx#,cy#,repz#
endif
cx#=camera position x()
cz#=camera position z()
`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 camera repx1#,cy#,repz1#
endif
cx#=camera position x()
cz#=camera position z()
`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 camera repx2#,cy#,repz2#
endif
IF ABS(grav#)=>20 then grav#=SGN(grav#)*20
endfunction
The optomist's right, The pessimist's right.