Some days ago I posted the Dungeon Raid iPhone game engine made with Flash and AS3 but unfortunately it suffered of a little bug in the backtracking engine.
It was just one missing line, line 68 in the following script:
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
public class Main extends Sprite {
private var fieldWidth:int=8;// field width, in tiles
private var fieldHeight:int=6;// field height, in tiles
private var tileSize:int=80;// tile size, in pixels
private var tileVector:Vector.;
private var visitedVector:Vector.;// vector to store all visited tiles, as Point as it's easy to store x and y coordinate
public function Main() {
// adding tiles on stage and initializing tile vector
tileVector=new Vector.();
for (var i:int=0; i();
for (var j:int=0; j();
visitedVector.push(new Point(i,j));
// highlighting the tile and setting it as "taken";
tileVector[i][j].tile.gotoAndStop(2);
tileVector[i][j].taken=true;
// updating listeners, removing mouse down, adding mouse move and mouse up;
stage.removeEventListener(MouseEvent.MOUSE_DOWN,startDrawing);
stage.addEventListener(MouseEvent.MOUSE_MOVE,drawing);
stage.addEventListener(MouseEvent.MOUSE_UP,stopDrawing);
}
private function drawing(e:MouseEvent):void {
// getting tile
var i:int=Math.floor(mouseX/tileSize);
var j:int=Math.floor(mouseY/tileSize);
// checking if we are inside the sensible area
var distX:Number=mouseX-(i*tileSize+tileSize/2);
var distY:Number=mouseY-(j*tileSize+tileSize/2);
// 1225 is 35^2, where 35 is the radius of the sensible area
if (distX*distX+distY*distY<1225) {
// now checking if we moved from the last tile visited
if (i!=visitedVector[visitedVector.length-1].x || j!=visitedVector[visitedVector.length-1].y) {
// now, let's see if we moved to an adjacent tile. we don't want the player to jump here and there
if (Math.abs(i-visitedVector[visitedVector.length-1].x)<=1 && Math.abs(j-visitedVector[visitedVector.length-1].y)<=1) {
// ok we moved, now let's see if we are backtracking:
if (visitedVector.length>1&&i==visitedVector[visitedVector.length-2].x&&j==visitedVector[visitedVector.length-2].y) {
// we are backtracking, so we have to remove the last element from visitedVector and turn off the tile
var backtrackPoint:Point=visitedVector.pop();
tileVector[backtrackPoint.x][backtrackPoint.y].tile.gotoAndStop(1);
tileVector[backtrackPoint.x][backtrackPoint.y].taken=false;
removeChild(tileVector[backtrackPoint.x][backtrackPoint.y].path);
// the infamous bug line
tileVector[backtrackPoint.x][backtrackPoint.y].path=null;
// adding the arrow to latest path
if (visitedVector.length>=2) {
tileVector[visitedVector[visitedVector.length-1].x][visitedVector[visitedVector.length-1].y].path.gotoAndStop(tileVector[visitedVector[visitedVector.length-1].x][visitedVector[visitedVector.length-1].y].path.currentFrame+8);
}
}
else {
// we aren't backtracking, let's see if the new tile was already taken (illegal move);
if (! tileVector[i][j].taken) {
// it's a new tile, let's insert it into the vector and highlight it
visitedVector.push(new Point(i,j));
tileVector[i][j].tile.gotoAndStop(2);
tileVector[i][j].taken=true;
// then place the path movieclip
tileVector[i][j].path=new Path();
tileVector[i][j].path.x=visitedVector[visitedVector.length-2].x*tileSize+tileSize/2;
tileVector[i][j].path.y=visitedVector[visitedVector.length-2].y*tileSize+tileSize/2;
// showing the right frame with arrow
var iDiff:int=i-visitedVector[visitedVector.length-2].x;
var yDiff:int=j-visitedVector[visitedVector.length-2].y;
switch (iDiff) {
case -1 :
tileVector[i][j].path.gotoAndStop(Math.abs(yDiff)*(4+3*yDiff)+1+8);
break;
case 0 :
tileVector[i][j].path.gotoAndStop(5+2*yDiff+8);
break;
case 1 :
tileVector[i][j].path.gotoAndStop(5+yDiff+8);
break;
}
addChild(tileVector[i][j].path);
// removing arrow from previous path
if (visitedVector.length>=3) {
tileVector[visitedVector[visitedVector.length-2].x][visitedVector[visitedVector.length-2].y].path.gotoAndStop(tileVector[visitedVector[visitedVector.length-2].x][visitedVector[visitedVector.length-2].y].path.currentFrame-8);
}
}
else {
// invalid move, stop drawing;
stopDrawing(null);
}
}
}
}
}
}
private function stopDrawing(e:MouseEvent):void {
// updating listeners
stage.addEventListener(MouseEvent.MOUSE_DOWN,startDrawing);
stage.removeEventListener(MouseEvent.MOUSE_MOVE,drawing);
stage.removeEventListener(MouseEvent.MOUSE_UP,stopDrawing);
// turning off all tiles
for (var i:int=0; i
Moreover, I added eight new frames to Path
movieclip in order to show the arrow at the end of the path like in the original game.
Enjoy:
...and download the source code .