Skip to content

Instantly share code, notes, and snippets.

@azcdev
Created August 9, 2014 15:05
Show Gist options
  • Save azcdev/85b118b2facb2a04d37f to your computer and use it in GitHub Desktop.
Save azcdev/85b118b2facb2a04d37f to your computer and use it in GitHub Desktop.

Revisions

  1. azcdev created this gist Aug 9, 2014.
    121 changes: 121 additions & 0 deletions pathfinding.as
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,121 @@
    package
    {
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.display.MovieClip;
    public class pathfinding extends Sprite
    {
    private var ANCHO:int = stage.stageWidth;
    private var ALTO:int = stage.stageHeight;
    private var anchoCelda:int = 10;
    private var altoCelda:int = 10;
    private var cuadricula:Cuadricula;
    private var agente:Sprite;
    private var indice:int;
    private var ruta:Array;
    public function pathfinding()
    {
    stage.align = StageAlign.TOP_LEFT;
    stage.scaleMode = StageScaleMode.NO_SCALE;
    dibujaAgente();
    hazCuadricula();
    stage.addEventListener(MouseEvent.CLICK, onCuadriculaClick);
    }
    private function dibujaAgente():void
    {
    agente = new Sprite();
    agente.graphics.beginFill(0xff0000);
    agente.graphics.drawCircle(0, 0, 5);
    agente.graphics.endFill();
    agente.x = Math.random() * ANCHO;
    agente.y = Math.random() * ALTO;
    addChild(agente);
    }
    private function hazCuadricula():void
    {
    cuadricula = new Cuadricula(20,20);
    for (var i:int = 0; i< 150; i++)
    {
    var fila:int = Math.floor(Math.random() * 20);
    var columna:int = Math.floor(Math.random() * 20);
    cuadricula.fijarNodoPermitido(fila,columna,false);
    }
    dibujaCuadricula();
    }
    private function dibujaCuadricula():void
    {
    graphics.clear();
    for (var i:int = 0; i < cuadricula.Columnas; i++)
    {
    for (var j:int = 0; j < cuadricula.Filas; j++)
    {
    var nodo:Nodo = cuadricula.dameNodo(i,j);
    graphics.lineStyle(0);
    graphics.beginFill(pintarNodo(nodo));
    graphics.drawRect(i * anchoCelda, j * altoCelda, anchoCelda, altoCelda);
    }
    }
    }
    private function pintarNodo(nodo:Nodo):uint
    {
    if (! nodo.permitido)
    {
    return 0x00ccff;
    }
    if (nodo == cuadricula.nodoInicial)
    {
    return 0x00ff00;
    }
    if (nodo == cuadricula.nodoFinal)
    {
    return 0xccff00;
    }
    return 0x669900;
    }
    private function onCuadriculaClick(event:MouseEvent):void
    {
    var xpos:int = Math.floor(mouseX / anchoCelda);
    var ypos:int = Math.floor(mouseY / altoCelda);
    cuadricula.fijarNodoFinal(xpos, ypos);
    xpos = Math.floor(agente.x / anchoCelda);
    ypos = Math.floor(agente.y / altoCelda);
    cuadricula.fijarNodoInicial(xpos, ypos);
    dibujaCuadricula();
    buscaRuta();
    }
    private function buscaRuta():void
    {
    var astar:Astar = new Astar();
    if (astar.buscaRuta(cuadricula))
    {
    ruta = astar.ruta;
    indice = 0;
    addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }
    }
    private function onEnterFrame(event:Event):void
    {
    var posicionFinalX:Number = ruta[indice].x * anchoCelda + altoCelda / 2;
    var posicionFinalY:Number = ruta[indice].y * altoCelda + anchoCelda / 2;
    var dx:Number = posicionFinalX - agente.x;
    var dy:Number = posicionFinalY - agente.y;
    var dist:Number = Math.sqrt(dx * dx + dy * dy);
    if (dist < 1)
    {
    indice++;
    if (indice >= ruta.length)
    {
    removeEventListener(Event.ENTER_FRAME, onEnterFrame);
    }
    }
    else
    {
    agente.x += dx * .5;
    agente.y += dy * .5;
    }
    }
    }
    }