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:
and here's the code for the actual collision detection and collision resolving: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; }
I'd greatly appreciate it if someone could point me in the right direction or figure out what exactly I am doing wrong.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; } } }
Thanks!




Reply With Quote
