package { import flash.display.Sprite; import flash.events.MouseEvent; public class GridView2 extends Sprite { private var _cellSize:int = 20; private var _grid:Grid; public function GridView2(grid:Grid) { _grid = grid; for(var i:int = 0; i < _grid.numCols; i++) { for(var j:int = 0; j < _grid.numRows; j++) { //为每个节点设置不同的“代价权重因子” var mult:Number = Math.sin(i * .50) + Math.cos(j * .2 + i * .05); _grid.getNode(i, j).costMultiplier = Math.abs(mult) + 1; } } drawGrid(); findPath(); addEventListener(MouseEvent.CLICK, onGridClick); } //画网格 public function drawGrid():void { graphics.clear(); for(var i:int = 0; i < _grid.numCols; i++) { for(var j:int = 0; j < _grid.numRows; j++) { var node:Node = _grid.getNode(i, j); graphics.lineStyle(0); graphics.beginFill(getColor(node)); graphics.drawRect(i * _cellSize, j * _cellSize, _cellSize, _cellSize); } } } //取得单元格的颜色(与权重因子关联,costMultiplier越小,颜色越深) private function getColor(node:Node):uint { if(!node.walkable) return 0; if(node == _grid.startNode) return 0x666666; if(node == _grid.endNode) return 0x666666; var shade:Number = 300 - 70 * node.costMultiplier; return shade << 16 | shade << 8 | shade; } //单元格点击时,切换节点为普通节点或障碍物节点 private function onGridClick(event:MouseEvent):void { var xpos:int = Math.floor(event.localX / _cellSize); var ypos:int = Math.floor(event.localY / _cellSize); _grid.setWalkable(xpos, ypos, !_grid.getNode(xpos, ypos).walkable); drawGrid(); findPath(); } //找路 private function findPath():void { var astar:AStar = new AStar(); if(astar.findPath(_grid)) { //showVisited(astar); showPath(astar); } } private function showVisited(astar:AStar):void { var visited:Array = astar.visited; for(var i:int = 0; i < visited.length; i++) { graphics.beginFill(0xcccccc); graphics.drawRect(visited[i].x * _cellSize, visited[i].y * _cellSize, _cellSize, _cellSize); graphics.endFill(); } } private function showPath(astar:AStar):void { var path:Array = astar.path; for(var i:int = 0; i < path.length; i++) { graphics.lineStyle(0); graphics.beginFill(0); graphics.drawCircle(path[i].x * _cellSize + _cellSize / 2, path[i].y * _cellSize + _cellSize / 2, _cellSize / 3); } } } }