K
koirapoika74
Guest
I downloaded this free project from marketplace (Minecraft Engine) and it has really wonky collisions when hitting the wall. I've been trying to figure this out but its just way too complicated for me so I was wondering if any if you guys could help me with my problem. Thanks!
SCR: collide
SCR: boundaries
SCR: collide
// collide(player width, player height)
// makes the player object collide with the block-world
// to exectute this script the player-object needs a 'z', 'zspeed' and a 'jump' variable
// this script is still not perfect
var ww,hh, x1,y1,z1,x2,y2,z2,x3,y3,x4,y4,z5;
ww=argument0/2
hh=argument1/2
// current position
x1=floor((x-ww)/global.size)
y1=floor((y-ww)/global.size)
z1=floor((z-hh)/global.size)
x2=floor((x+ww)/global.size)
y2=floor((y+ww)/global.size)
z2=floor((z+hh)/global.size)
// go up when trapped
if floor(z/global.size)<global.cz
while(ds_grid_get(global.layer[floor(z/global.size)],floor(x/global.size),floor(y/global.size)))
{
z+=global.size
z1=floor((z-hh)/global.size)
z2=floor((z+hh)/global.size)
if floor(z/global.size)>=global.cz break
}
// previous position
x3=floor((x-hspeed-ww)/global.size)
y3=floor((y-vspeed-ww)/global.size)
z3=floor((z-zspeed-hh)/global.size)
x4=floor((x-hspeed+ww)/global.size)
y4=floor((y-vspeed+ww)/global.size)
z4=floor((z-zspeed+hh)/global.size)
//
z5=round(z3+(z4-z3)/2)
if z1>=0 if z1<=global.cz-1
if ds_grid_get(global.layer[z1],x3,y3)
or ds_grid_get(global.layer[z1],x3,y4)
or ds_grid_get(global.layer[z1],x4,y4)
or ds_grid_get(global.layer[z1],x4,y3)
{z=z3*global.size+hh zspeed=0 jump=true}
if z2>=0 if z2<=global.cz-1
if ds_grid_get(global.layer[z2],x3,y3)
or ds_grid_get(global.layer[z2],x3,y4)
or ds_grid_get(global.layer[z2],x4,y4)
or ds_grid_get(global.layer[z2],x4,y3)
{z=(z4+1)*global.size-hh-.01 zspeed=0}
if z1>=0 if z3>=0 if z1<=global.cz-1 if z3<=global.cz-1
{
z2=min(z2,global.cz-1)
z4=min(z4,global.cz-1)
z5=min(z5,global.cz-1)
//x
if ds_grid_get(global.layer[z3],x1,y3)
or ds_grid_get(global.layer[z3],x1,y4)
or ds_grid_get(global.layer[z4],x1,y4)
or ds_grid_get(global.layer[z4],x1,y3)
or ds_grid_get(global.layer[z5],x1,y3)
or ds_grid_get(global.layer[z5],x1,y4)
{x=x3*global.size+ww hspeed=0}
if ds_grid_get(global.layer[z3],x2,y3)
or ds_grid_get(global.layer[z3],x2,y4)
or ds_grid_get(global.layer[z4],x2,y4)
or ds_grid_get(global.layer[z4],x2,y3)
or ds_grid_get(global.layer[z5],x2,y3)
or ds_grid_get(global.layer[z5],x2,y4)
{x=(x4+1)*global.size-ww-.01 hspeed=0}
//y
if ds_grid_get(global.layer[z3],x3,y1)
or ds_grid_get(global.layer[z3],x4,y1)
or ds_grid_get(global.layer[z4],x4,y1)
or ds_grid_get(global.layer[z4],x3,y1)
or ds_grid_get(global.layer[z5],x3,y1)
or ds_grid_get(global.layer[z5],x4,y1)
{y=y3*global.size+ww vspeed=0}
if y2>=0 if y2<=global.cy-1
if ds_grid_get(global.layer[z3],x3,y2)
or ds_grid_get(global.layer[z3],x4,y2)
or ds_grid_get(global.layer[z4],x4,y2)
or ds_grid_get(global.layer[z4],x3,y2)
or ds_grid_get(global.layer[z5],x3,y2)
or ds_grid_get(global.layer[z5],x4,y2)
{y=(y4+1)*global.size-ww-.01 vspeed=0}
}
// still trapped? go to the previous position
x1=floor((x-ww)/global.size)
y1=floor((y-ww)/global.size)
z1=floor((z-hh)/global.size)
x2=floor((x+ww)/global.size)
y2=floor((y+ww)/global.size)
z2=floor((z+hh)/global.size)
if x1>=0 if x2<=global.cx-1
if y1>=0 if y2<=global.cy-1
if z1>=0 if z2<=global.cz-1
if ds_grid_get(global.layer[z1],x1,y1)
or ds_grid_get(global.layer[z1],x2,y1)
or ds_grid_get(global.layer[z1],x1,y2)
or ds_grid_get(global.layer[z2],x1,y1)
or ds_grid_get(global.layer[z1],x2,y2)
or ds_grid_get(global.layer[z2],x1,y2)
or ds_grid_get(global.layer[z2],x2,y1)
or ds_grid_get(global.layer[z2],x2,y2)
{
x-=hspeed
y-=vspeed
z-=zspeed
speed=0
zspeed=0
}
// makes the player object collide with the block-world
// to exectute this script the player-object needs a 'z', 'zspeed' and a 'jump' variable
// this script is still not perfect
var ww,hh, x1,y1,z1,x2,y2,z2,x3,y3,x4,y4,z5;
ww=argument0/2
hh=argument1/2
// current position
x1=floor((x-ww)/global.size)
y1=floor((y-ww)/global.size)
z1=floor((z-hh)/global.size)
x2=floor((x+ww)/global.size)
y2=floor((y+ww)/global.size)
z2=floor((z+hh)/global.size)
// go up when trapped
if floor(z/global.size)<global.cz
while(ds_grid_get(global.layer[floor(z/global.size)],floor(x/global.size),floor(y/global.size)))
{
z+=global.size
z1=floor((z-hh)/global.size)
z2=floor((z+hh)/global.size)
if floor(z/global.size)>=global.cz break
}
// previous position
x3=floor((x-hspeed-ww)/global.size)
y3=floor((y-vspeed-ww)/global.size)
z3=floor((z-zspeed-hh)/global.size)
x4=floor((x-hspeed+ww)/global.size)
y4=floor((y-vspeed+ww)/global.size)
z4=floor((z-zspeed+hh)/global.size)
//
z5=round(z3+(z4-z3)/2)
if z1>=0 if z1<=global.cz-1
if ds_grid_get(global.layer[z1],x3,y3)
or ds_grid_get(global.layer[z1],x3,y4)
or ds_grid_get(global.layer[z1],x4,y4)
or ds_grid_get(global.layer[z1],x4,y3)
{z=z3*global.size+hh zspeed=0 jump=true}
if z2>=0 if z2<=global.cz-1
if ds_grid_get(global.layer[z2],x3,y3)
or ds_grid_get(global.layer[z2],x3,y4)
or ds_grid_get(global.layer[z2],x4,y4)
or ds_grid_get(global.layer[z2],x4,y3)
{z=(z4+1)*global.size-hh-.01 zspeed=0}
if z1>=0 if z3>=0 if z1<=global.cz-1 if z3<=global.cz-1
{
z2=min(z2,global.cz-1)
z4=min(z4,global.cz-1)
z5=min(z5,global.cz-1)
//x
if ds_grid_get(global.layer[z3],x1,y3)
or ds_grid_get(global.layer[z3],x1,y4)
or ds_grid_get(global.layer[z4],x1,y4)
or ds_grid_get(global.layer[z4],x1,y3)
or ds_grid_get(global.layer[z5],x1,y3)
or ds_grid_get(global.layer[z5],x1,y4)
{x=x3*global.size+ww hspeed=0}
if ds_grid_get(global.layer[z3],x2,y3)
or ds_grid_get(global.layer[z3],x2,y4)
or ds_grid_get(global.layer[z4],x2,y4)
or ds_grid_get(global.layer[z4],x2,y3)
or ds_grid_get(global.layer[z5],x2,y3)
or ds_grid_get(global.layer[z5],x2,y4)
{x=(x4+1)*global.size-ww-.01 hspeed=0}
//y
if ds_grid_get(global.layer[z3],x3,y1)
or ds_grid_get(global.layer[z3],x4,y1)
or ds_grid_get(global.layer[z4],x4,y1)
or ds_grid_get(global.layer[z4],x3,y1)
or ds_grid_get(global.layer[z5],x3,y1)
or ds_grid_get(global.layer[z5],x4,y1)
{y=y3*global.size+ww vspeed=0}
if y2>=0 if y2<=global.cy-1
if ds_grid_get(global.layer[z3],x3,y2)
or ds_grid_get(global.layer[z3],x4,y2)
or ds_grid_get(global.layer[z4],x4,y2)
or ds_grid_get(global.layer[z4],x3,y2)
or ds_grid_get(global.layer[z5],x3,y2)
or ds_grid_get(global.layer[z5],x4,y2)
{y=(y4+1)*global.size-ww-.01 vspeed=0}
}
// still trapped? go to the previous position
x1=floor((x-ww)/global.size)
y1=floor((y-ww)/global.size)
z1=floor((z-hh)/global.size)
x2=floor((x+ww)/global.size)
y2=floor((y+ww)/global.size)
z2=floor((z+hh)/global.size)
if x1>=0 if x2<=global.cx-1
if y1>=0 if y2<=global.cy-1
if z1>=0 if z2<=global.cz-1
if ds_grid_get(global.layer[z1],x1,y1)
or ds_grid_get(global.layer[z1],x2,y1)
or ds_grid_get(global.layer[z1],x1,y2)
or ds_grid_get(global.layer[z2],x1,y1)
or ds_grid_get(global.layer[z1],x2,y2)
or ds_grid_get(global.layer[z2],x1,y2)
or ds_grid_get(global.layer[z2],x2,y1)
or ds_grid_get(global.layer[z2],x2,y2)
{
x-=hspeed
y-=vspeed
z-=zspeed
speed=0
zspeed=0
}
SCR: boundaries
// boundaries(player width, player height)
// keeps the player into the map
// to exectute this script the player-object needs a 'z', 'zspeed' and a 'jump' variable
var ww,hh;
ww=argument0/2
hh=argument1/2
//x
if x<ww
{
x=ww
hspeed=0
}
else
if x>global.cx*global.size-ww-1
{
x=global.cx*global.size-ww-1
hspeed=0
}
//y
if y<ww
{
y=ww
vspeed=0
}
else
if y>global.cy*global.size-ww-1
{
y=global.cy*global.size-ww-1
vspeed=0
}
//z
if z<hh
{
z=hh
zspeed=0
jump=true
}
// keeps the player into the map
// to exectute this script the player-object needs a 'z', 'zspeed' and a 'jump' variable
var ww,hh;
ww=argument0/2
hh=argument1/2
//x
if x<ww
{
x=ww
hspeed=0
}
else
if x>global.cx*global.size-ww-1
{
x=global.cx*global.size-ww-1
hspeed=0
}
//y
if y<ww
{
y=ww
vspeed=0
}
else
if y>global.cy*global.size-ww-1
{
y=global.cy*global.size-ww-1
vspeed=0
}
//z
if z<hh
{
z=hh
zspeed=0
jump=true
}