Hello guys,
I've been working on a little game project of mine where I have a tile-based engine.
I've got a lot so far... But the collision detection is not working for me.
As far as I can see, it should work, but it just doesn't somehow.
I've got a demo here:
http://murtada.nl/experiments/tiles/
Move with WASD keys.
The edge function for collidable tiles:
Code:
function get_edges(object):Array
{
var r = Math.floor(Math.round(object.x+object.speedX+object.width*0.5)/WORLD.tileWidth);
var l = Math.floor(Math.round(object.x+object.speedX-object.width*0.5)/WORLD.tileWidth);
var b = Math.floor(Math.round(object.y+object.speedY+object.height*0.5)/WORLD.tileHeight);
var t = Math.floor(Math.round(object.y+object.speedY-object.height*0.5)/WORLD.tileHeight);
var tr = currentLevel[t][r];
var tl = currentLevel[t][l];
var bl = currentLevel[b][l];
var br = currentLevel[b][r];
var finalArray:Array = new Array();
finalArray["tr"] = tr;
finalArray["br"] = br;
finalArray["bl"] = bl;
finalArray["tl"] = tl;
finalArray["b"] = b;
finalArray["t"] = t;
finalArray["l"] = l;
finalArray["r"] = r;
return finalArray;
}
and here's the code for the actual collision detection and collision resolving:
Code:
function CollisionObjectTile(object)
{
var edges:Array = get_edges(object);
// GOING DOWN
if (object.speedY > 0)
{
if (in_array(edges["br"],collidables) || in_array(edges["bl"],collidables))
{
object.speedY = 0;
object.y = edges["b"] * WORLD.tileHeight - object.height * 0.5;
object.onGround = true;
if (! object.walking)
{
object.speedX *= WORLD.groundFriction;
}
}
}
// GOING UP
else if (object.speedY < 0)
{
if (in_array(edges["tr"],collidables) || in_array(edges["tl"],collidables))
{
object.speedY = 0;
object.y = (edges["t"]+1) * WORLD.tileHeight + object.height * 0.5;
if (! object.walking)
{
object.speedX *= WORLD.groundFriction;
}
}
}
edges = get_edges(object);
// GOING LEFT
if (object.speedX < 0)
{
if (in_array(edges["tl"],collidables) || in_array(edges["bl"],collidables))
{
object.x = (edges["l"]+1) * WORLD.tileWidth + object.width * 0.5;
object.speedX = 0;
}
}
// GOING RIGHT
else if (object.speedX > 0)
{
if (in_array(edges["tr"],collidables) || in_array(edges["br"],collidables))
{
object.x = edges["r"] * WORLD.tileWidth - object.width * 0.5;
object.speedX = 0;
}
}
}
I'd greatly appreciate it if someone could point me in the right direction or figure out what exactly I am doing wrong.
Thanks!