Wow really? I tip my hat. Surely raycasting is easier though? It could work with moving objects (such as other cars) without having to recalculate everything every time... Let me whip up a quick demo of my thoughts on this and get back to you.
EDIT: Here's a quick demo using raycasting.
rem
rem AGK Application
rem
rem Landscape App
SetDisplayAspect( 4.0/3.0 )
rem create some random scenery
for i=1 to 5
spr = createSprite(0)
setSpriteSize(spr,random(1,10),random(1,10))
setSpriteOffset(spr,getSpriteWidth(spr)*0.5,getSpriteHeight(spr)*0.5)
setSpritePositionByOffset(spr,random(10,90),random(10,90))
setSpriteAngle(spr,random(0,359))
setSpritePhysicsOn(spr,1)
setSpriteGroup(spr,1)
next
rem set Physics up
setPhysicsGravity(0,0)
setPhysicsWallLeft(0)
setPhysicsWallRight(0)
setPhysicsWallTop(0)
setPhysicsWallBottom(0)
rem create a cars
carnum = 10
type carType
spr as integer
speed as float
endtype
dim cars[carnum] as carType
for i=1 to carnum
spr = createSprite(0)
setSpriteColor(spr,255,0,0,255)
setSpriteSize(spr,4,3)
setSpriteOffset(spr,getSpriteWidth(spr)*0.5,getSpriteHeight(spr)*0.5)
setSpritePositionByOffset(spr,random(0,100),random(0,100))
setSpriteAngle(spr,random(0,359))
setSpritePhysicsOn(spr,2)
setSpriteGroup(spr,1)
cars[i].spr=spr
cars[i].speed=0.0
next
checkDist# = 20.0
aspect# = getDisplayAspect()
acc# = 0.8
maxspeed# = 30.0
rem A baxslash Did It!
do
rem drive the car
`check what's in front
for i=1 to carnum
car = cars[i].spr
speed# = cars[i].speed
ang# = getSpriteAngle(car)
x# = getSpriteXbyOffset(car)
if x#<0 then x#=x#+100
if x#>100 then x#=x#-100
y# = getSpriteYbyOffset(car)
if y#<0 then y#=y#+100
if y#>100 then y#=y#-100
setSpritePositionByOffset(car,x#,y#)
x1# = x#+2*cos(ang#-90)
y1# = y#+2*sin(ang#-90)
x2# = x#+2*cos(ang#+90)
y2# = y#+2*sin(ang#+90)
x3# = x#+checkDist#*cos(ang#)
y3# = y#+checkDist#*sin(ang#)
x4# = x3#+x1#-x#
y4# = y3#+y1#-y#
x5# = x3#+x2#-x#
y5# = y3#+y2#-y#
hit1 = PhysicsRayCastGroup(1,x1#,y1#,x4#,y4#)
f1# = GetRayCastFraction()
hit2 = PhysicsRayCastGroup(1,x2#,y2#,x5#,y5#)
f2# = GetRayCastFraction()
if hit1>0
if hit2>0
rem double hit so slow down
if speed#>0
speed#=speed#-acc#*2
else
speed#=speed#-acc#*0.5
endif
if f1#<f2#
if speed#>0
setSpriteAngle(car,ang#+5)
else
setSpriteAngle(car,ang#-5)
endif
else
if speed#<0
setSpriteAngle(car,ang#+5)
else
setSpriteAngle(car,ang#-5)
endif
endif
else
rem object to left so turn right
speed#=speed#-acc#
setSpriteAngle(car,ang#+2)
endif
else
if hit2>0
rem object to right so turn left
speed#=speed#-acc#
setSpriteAngle(car,ang#-2)
endif
endif
if speed#<-maxspeed#*0.25
speed# = -maxspeed#*0.25
endif
if hit1+hit2=0
speed# = speed#+acc#
if speed#>maxspeed#
speed#=maxspeed#
endif
endif
ang# = getSpriteAngle(car)
setSpritePhysicsVelocity(car,speed#*cos(ang#),speed#*sin(ang#)*aspect#)
cars[i].speed = speed#
next
Sync()
loop
EDIT 2: And just for more kicks, here's a version with cops and robbers too
rem
rem AGK Application
rem
rem Landscape App
SetDisplayAspect( 4.0/3.0 )
rem create some random scenery
for i=1 to 5
spr = createSprite(0)
setSpriteSize(spr,random(1,10),random(1,10))
setSpriteOffset(spr,getSpriteWidth(spr)*0.5,getSpriteHeight(spr)*0.5)
setSpritePositionByOffset(spr,random(10,90),random(10,90))
setSpriteAngle(spr,random(0,359))
setSpritePhysicsOn(spr,1)
setSpriteGroup(spr,1)
next
rem set Physics up
setPhysicsGravity(0,0)
setPhysicsWallLeft(0)
setPhysicsWallRight(0)
setPhysicsWallTop(0)
setPhysicsWallBottom(0)
rem create a cars
carnum = 50
type carType
spr as integer
speed as float
state as integer
endtype
dim cars[carnum] as carType
carwidth# = 2
for i=1 to carnum
spr = createSprite(0)
setSpriteColor(spr,0,255,0,255)
setSpriteSize(spr,carwidth#,carwidth#*0.75)
setSpriteOffset(spr,getSpriteWidth(spr)*0.5,getSpriteHeight(spr)*0.5)
setSpritePositionByOffset(spr,random(0,100),random(0,100))
setSpriteAngle(spr,random(0,359))
setSpritePhysicsOn(spr,2)
setSpriteGroup(spr,1)
cars[i].spr=spr
cars[i].speed=0.0
cars[i].state=0
rem create some random cops
if random(1,10)=1
cars[i].state=1
setSpriteColor(spr,0,0,255,255)
endif
rem create a fugitive
if i=1
cars[i].state=2
setSpriteColor(spr,255,0,0,255)
fugitive=spr
endif
next
checkDist# = carwidth#*2.5
aspect# = getDisplayAspect()
acc# = carwidth#*0.2
maxspeed# = carwidth#*7.5
rem A baxslash Did It!
do
rem drive the car
`check what's in front
copx#=0
copy#=0
copnum=0
for i=1 to carnum
state = cars[i].state
car = cars[i].spr
speed# = cars[i].speed
select state
case 0
ang# = getSpriteAngle(car)
x# = getSpriteXbyOffset(car)
if x#<0 then x#=x#+100
if x#>100 then x#=x#-100
y# = getSpriteYbyOffset(car)
if y#<0 then y#=y#+100
if y#>100 then y#=y#-100
setSpritePositionByOffset(car,x#,y#)
x1# = x#+getSpriteWidth(car)*0.55*cos(ang#-90)
y1# = y#+getSpriteWidth(car)*0.55*sin(ang#-90)
x2# = x#+getSpriteWidth(car)*0.55*cos(ang#+90)
y2# = y#+getSpriteWidth(car)*0.55*sin(ang#+90)
x3# = x#+checkDist#*cos(ang#)
y3# = y#+checkDist#*sin(ang#)
x4# = x3#+(x1#-x#)*1.5
y4# = y3#+(y1#-y#)*1.5
x5# = x3#+(x2#-x#)*1.5
y5# = y3#+(y2#-y#)*1.5
hit1 = PhysicsRayCastGroup(1,x1#,y1#,x4#,y4#)
f1# = GetRayCastFraction()
hit2 = PhysicsRayCastGroup(1,x2#,y2#,x5#,y5#)
f2# = GetRayCastFraction()
if hit1>0
if hit2>0
rem double hit so slow down
if speed#>0
speed#=speed#-acc#*2
else
speed#=speed#-acc#*0.5
endif
if f1#<f2#
if speed#>0
setSpriteAngle(car,ang#+5)
else
setSpriteAngle(car,ang#-5)
endif
else
if speed#<0
setSpriteAngle(car,ang#+5)
else
setSpriteAngle(car,ang#-5)
endif
endif
else
rem object to left so turn right
speed#=speed#-acc#
setSpriteAngle(car,ang#+2)
endif
else
if hit2>0
rem object to right so turn left
speed#=speed#-acc#
setSpriteAngle(car,ang#-2)
endif
endif
if speed#<-maxspeed#*0.25
speed# = -maxspeed#*0.25
endif
if hit1+hit2=0
speed# = speed#+acc#
if speed#>maxspeed#
speed#=maxspeed#
endif
endif
ang# = getSpriteAngle(car)
setSpritePhysicsVelocity(car,speed#*cos(ang#),speed#*sin(ang#)*aspect#)
endcase
case 1
rem steer cops
x# = getSpriteXbyOffset(car)
if x#<0 then x#=x#+100
if x#>100 then x#=x#-100
y# = getSpriteYbyOffset(car)
if y#<0 then y#=y#+100
if y#>100 then y#=y#-100
setSpritePositionByOffset(car,x#,y#)
ang# = getSpriteAngle(car)
turnSpriteTo(car,getSpriteXbyOffSet(fugitive),getSpriteYbyOffSet(fugitive),0.1)
speed# = speed#+acc#
if speed#>maxspeed#*1.2
speed#=maxspeed#*1.2
endif
setSpritePhysicsVelocity(car,speed#*cos(ang#),speed#*sin(ang#)*aspect#)
copx#=copx#+x#
copy#=copy#+y#
copnum=copnum+1
endcase
case 2
rem steer fugitive
x# = getSpriteXbyOffset(car)
if x#<0 then x#=x#+100
if x#>100 then x#=x#-100
y# = getSpriteYbyOffset(car)
if y#<0 then y#=y#+100
if y#>100 then y#=y#-100
setSpritePositionByOffset(car,x#,y#)
eang# = atanfull(escapex#-x#,(escapey#-y#)*aspect#)+90
turnSpriteTo(car,100*cos(eang#),100*sin(eang#),0.1)
speed# = speed#+acc#
if speed#>maxspeed#
speed#=maxspeed#
endif
ang# = getSpriteAngle(car)
setSpritePhysicsVelocity(car,speed#*cos(ang#),speed#*sin(ang#)*aspect#)
endcase
endselect
cars[i].speed = speed#
next
escapex# = copx#/copnum
escapey# = copy#/copnum
Sync()
loop
function turnSpriteTo(spriteID,x#,y#,value#)
rem get display data
dw# = getVirtualWidth()
dh# = getVirtualHeight()
aspect# = (dw# / dh#)
if aspect# = 1.0
aspect# = getDisplayAspect()
else
aspect# = 1.0
endif
dx# = x#-getSpriteX(spriteID)
dy# = y#-getSpriteY(spriteID)
ang# = getSpriteAngle(spriteID)
targ# = atanfull(dx#,dy#/aspect#)-90
diff# = targ#-ang#
while diff#>=180
diff# = diff#-360
endwhile
while diff#<=-180
diff# = diff#+360
endwhile
new# = ang# + diff# * value#
setSpriteAngle(spriteID,new#)
endfunction
