fb:porticula NoPaste
noch ne kollisionsengine die nich geht, diesmal mit MOVE zusammen
Uploader: | flo |
Datum/Zeit: | 24.03.2008 13:52:41 |
sub move (byref object as TPhysics,d_T as double)
dim as double dx,dy,laufabstand,wandabstand,j,xtemp,ytemp,wandx,wandy
dim as byte bx1,by1,bx2,by2,i,bumm
with object
.vx=.vx+.ax*d_T
.vy=.vy+.ay*d_T
if .vx<0 then .direction=0':.nowmove=-.move
if .vx>0 then .direction=1':.nowmove=.move
if .vx=0 and .energy <>0 then .walkstatus=1 else if timer-.walktime>.walkspeed then .walktime=timer:.walkstatus+=1: if .walkstatus>.maxwalkstatus then .walkstatus=1
.xalt=.x
.yalt=.y
dx=.vx*d_T
dy=.vy*d_T
if dx<>0 or dy <>0 then
laufabstand=sqr(dx^2+dy^2)
if abs(dx)>abs(dy) then 'in genauen schritten exakt in bewegungsrichtung gehen,
j=0 'und sobald er auf einen block (wand) stößt, diese koordinaten merken
do
xtemp=fix(.x+j)
ytemp=fix(.y+(j/dx*dy))
bx1=fix((xtemp)/xlen)+1
by1=fix((ytemp)/ylen)+1
bx2=fix((xtemp+.width)/xlen)+1
by2=fix((ytemp-.height)/ylen)+1
for i=bx1 to bx2
if blocksolid(i,by1) then exit do
if blocksolid(i,by2) then exit do
next
for i=by2 to by1
if blocksolid(bx1,i) then exit do
if blocksolid(bx2,i) then exit do
next
j=j+sgn(dx)
loop
wandx=xtemp:wandy=ytemp
else
j=0
do
ytemp=fix(.y+j)
xtemp=fix(.x+(j/dy*dx))
bx1=fix((xtemp)/xlen)+1
by1=fix((ytemp)/ylen)+1
bx2=fix((xtemp+.width)/xlen)+1
by2=fix((ytemp-.height)/ylen)+1
for i=bx1 to bx2
if blocksolid(i,by1) then exit do
if blocksolid(i,by2) then exit do
next
for i=by2 to by1
if blocksolid(bx1,i) then exit do
if blocksolid(bx2,i) then exit do
next
j=j+sgn(dy)
loop
wandx=xtemp:wandy=ytemp
end if 'fertig... unten wird der abstand zur wand errechnet
wandabstand=sqr((.x-wandx)^2+(.y-wandy)^2)
locate 2,2:?(wandabstand);"| ";(laufabstand);"| "
locate 3,1:?wandx,.x,wandx-.x
if laufabstand>wandabstand then 'wenn der spieler nu weiter gehen will als er kann:
dx=dx*laufabstand/wandabstand'deltaX und deltaY so verkleinern, dass er vor der wand stehen blebt
dy=dy*laufabstand/wandabstand
bumm=true
else
bumm=false
end if
.x=.x+dx
.y=.y+dy
if bumm then 'das ist dazu da, die geschwindigkeiten zu nullen...
bx1=fix((.x+1)/xlen)+1 'wenn 1px rechts von den koordinaten die wand war, und vx>0, dann vx=0
by1=fix((.y)/ylen)+1 'usw...
bx2=fix((.x+1+.width)/xlen)+1
by2=fix((.y-.height)/ylen)+1
bummtest()
if bumm then
if .vx>0 then .vx=0
if .ax>0 then .ax=0
'.x=.x-1
end if
bx1=fix((.x-1)/xlen)+1
'by1=fix((.y)/ylen)+1
bx2=fix((.x-1+.width)/xlen)+1
'by2=fix((.y-.height)/ylen)+1
bummtest()
if bumm then
if .vx<0 then .vx=0
if .ax<0 then .ax=0
'.x=.x+1
end if
bx1=fix((.x)/xlen)+1
by1=fix((.y+1)/ylen)+1
bx2=fix((.x+.width)/xlen)+1
by2=fix((.y+1-.height)/ylen)+1
bummtest()
if bumm then
if .vy>0 then .vy=0
if .ay>0 then .ay=0
'.y=.y-1
end if
'bx1=fix((.x)/xlen)+1
by1=fix((.y-1)/ylen)+1
'bx2=fix((.x+.width)/xlen)+1
by2=fix((.y-1-.height)/ylen)+1
bummtest()
if bumm then
if .vy<0 then .vy=0
if .ay<0 then .ay=0
'.y=.y
end if
end if
end if
'.vxalt=.vx
'.vyalt=.vy
if .unverwundbarende<>0 then if timer > .unverwundbarende then .unverwundbarende=0
end with
end sub