collision detection - ActionScript 3 - Walls don't collide properly -
for several weeks i'm been trying make topdown game. went time, @ point wanted create scrolling map walls everywhere. now, make easy create map (and add more later) made class called "wall" hit test. works, when hits, map must stop scrolling. does, far.
now, when player moves away object, want map able scroll again, works too, player can't move side player came from. know because need define sides, player enters, in order tell game movement must set 0 @ point.
you can see code here:
public function addwalls(player:movieclip) { wallobjects = new array(); (var i:int = 0; < this.numchildren; i++) { var mc = this.getchildat(i); if (mc wall) { var wallobj:object = new object(); wallobj.mc = mc; wallobj.leftside = mc.x; wallobj.rightside = mc.x + mc.width; wallobj.topside = mc.y; wallobj.bottomside = mc.y + mc.height; wallobj.width = mc.width; wallobj.height = mc.height; wallobjects.push(wallobj); } } } public function enablecollisionwithwalls():void { (var k:int = 0; k < wallobjects.length; k++) { //if (player.y > wallobjects[k].topside && player.y < wallobjects[k].bottomside && player.x > wallobjects[k].leftside && player.x < wallobjects[k].rightside) if (player.hittestobject(wallobjects[k].mc)) { if (player.x > wallobjects[k].leftside && player.x < wallobjects[k].leftside+15) { lefthit = true; trace(debugvar); debugvar++; player.x = wallobjects[k].leftside; scroll_x = 0; } else if ( player.x < wallobjects[k].leftside -1 || (player.y > wallobjects[k].leftside )) { lefthit = false; } if (player.hittestobject(derp)) { lefthit = false; } } } } public function enablemovement():void { map.x += scroll_x; map.y += scroll_y; (var i:int = 0; < this.numchildren; i++) { var mc = this.getchildat(i); if (mc wall) { mc.x += scroll_x; mc.y += scroll_y; } } } public function movementkeysdown(move:keyboardevent):void { var speed:int = -5; switch (move.keycode) { case 37: // venstre knap scroll_x = -speed; break; case 38: // op scroll_y = -speed; break; case 39: // højre knap scroll_x = speed; if (lefthit) { scroll_x = 0; } break; case 40: // ned scroll_y = speed; break; default: } } public function movementkeysup(move:keyboardevent):void { switch (move.keycode) { case 37: scroll_x = 0; break; case 38: scroll_y = 0; break; case 39: scroll_x = 0; break; case 40: scroll_y = 0; break; default: } }
might syntax errors (since removed code in editor). can see current version here.
in version scroll keeps on going. did come "fix" it, check if player 1 pixel away movieclip, inside hit test (which reason works, guess shouldn't since doesn't hit anymore) , setting lefthit false. not solution , if continue or down away movieclip, still not able go right anymore...
i've been baffled long time, thought time asked help. couldn't find on how control movement in top-down game, scrolling map + wall :/
the simplest (but not resource friendly) solution (if anyway have single storage walls) iterating through walls , instead of using flash default hittest
(i don't way works since actionscript 2) - check coordinates , if see there's going collision on next simulation step - handle according game logic.
the useful optimization algorithm creating filter/data structure getting walls near player , can affected test collisions.
Comments
Post a Comment