45도 각도 맵 캐릭터 걷기 길찾기
11221 단어 지도.
최근 45도 지도를 연구하면서 데모를 썼는데,
주요 유형은 두 가지가 있는데, 첫 번째, 인물 통제 유형이 있다.
package view
{
import com.friendsofed.isometric.IsoObject;
import constVars.Directions;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.utils.Dictionary;
import flash.utils.getTimer;
public class SpriteSheet extends IsoObject
{
//
protected var _source:BitmapData;
//
protected var _frameWidth:Number;
//
protected var _frameHeight:Number;
// bitmap
private var _frameBitmap:Bitmap;
//
private var _frameRect:Rectangle;
//
protected var _direction:String;
//
protected var _rowNum:int;
//
private var _col:int = 0;
// ,
public static const RENDER_INTERVAL:Number = 64;
//render timer
protected var _oldTime:Number = 0;
// ,
protected var _renderInterval:Number;
//
protected var _maxCol:int;
//
protected var _maxRow:int = 8;//8
// rectangle
protected var _rects:Dictionary;
//
private var _isIdle:Boolean;
public function SpriteSheet(source:BitmapData,frameWidth:Number, frameHeight:Number,renderInterval:Number = RENDER_INTERVAL)
{
super(size);
_source = source;
_frameWidth = frameWidth;
_frameHeight = frameHeight;
_maxCol = Math.floor(_source.width/_frameWidth);
_renderInterval = renderInterval;
_frameRect = new Rectangle(0, 0, frameWidth, frameHeight);
_rects = new Dictionary();
for(var i:int = 0; i < _maxRow; i++)
for(var j:int = 0; j < _maxCol; j++)
{
var rect:Rectangle = new Rectangle(j*_frameWidth, i*_frameHeight, _frameWidth, _frameHeight);
_rects[j+","+i] = rect;// rectangle dictrony
}
_oldTime = getTimer();
render();
}
/**
*
*/
public function idle():void
{
_isIdle = true;
};
/**
*
*
*/
public function action():void
{
_isIdle = false;
startRender();
};
// , _renderInterval ,
protected function onEnterFrame(event:Event):void
{
var elapsed:Number = getTimer() - _oldTime;
if (elapsed >= _renderInterval)
{
render();
_oldTime = getTimer();
}
}
//
private function stopRender():void
{
removeEventListener(Event.ENTER_FRAME,onEnterFrame);
}
//
private function startRender():void
{
if(!hasEventListener(Event.ENTER_FRAME))
{
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
}
public function render():void
{
if (_frameBitmap == null)
{
// bitmap bitmapData
_frameBitmap = new Bitmap(new BitmapData(_frameWidth, _frameHeight, true, 0x00000000));
addChild(_frameBitmap);
//
_frameBitmap.x = -39;
_frameBitmap.y = -115;
}
_frameBitmap.bitmapData.lock();
if(_isIdle)// ,
{
_frameRect = _rects[0 +","+_rowNum] as Rectangle;
_frameBitmap.bitmapData.copyPixels(_source, _frameRect, new Point(0, 0), null, null, false);
stopRender();
}
else
{
if(_col < _maxCol)
{
// _rects rectangle
_frameRect = _rects[_col+","+_rowNum] as Rectangle;
}
else
{
_col = 0;
}
_col++;// 1
_frameBitmap.bitmapData.copyPixels(_source, _frameRect, new Point(0, 0), null, null, false);
}
_frameBitmap.bitmapData.unlock();
}
//
public function setDirection(direction:String):void
{
_direction = direction;
switch (direction)
{
case Directions.S:
_rowNum = 0;
break;
case Directions.W:
_rowNum = 1;
break;
case Directions.E:
_rowNum = 2;
break;
case Directions.N:
_rowNum = 3;
break;
case Directions.SW:
_rowNum = 4;
break;
case Directions.SE:
_rowNum = 5;
break;
case Directions.NW:
_rowNum = 6;
break;
case Directions.NE:
_rowNum = 7;
break;
default:
_rowNum = 0;
}
}
}
}
두 번째, 메인 프로그램의 클래스
package
{
import com.friendsofed.isometric.DrawnIsoTile;
import com.friendsofed.isometric.IsoUtils;
import com.friendsofed.isometric.IsoWorld;
import com.friendsofed.isometric.Point3D;
import constVars.Directions;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import path.AStar;
import path.Grid;
import path.Node;
import view.PathNode;
import view.SpriteSheet;
[SWF(width="1000",height="600",frameRate="30")]
public class PlayerTest extends Sprite
{
[Embed(source='0001.png')]
public const SHEET:Class;
//
public const SHEET_FRAME_WIDTH:Number = 79;
public const SHEET_FRAME_HEIGHT:Number = 108;
private var _ss:SpriteSheet;
private var _world:IsoWorld;
// tile
private static const SIZE:int = 40;
private static const GIRD_SIZE:int = 20;
//
private var _grid:Grid;
// ,
private var _path:Array;
//
private var _index:int;
//
private var _speed:int = 2;
public function PlayerTest()
{
createWorld();
_ss = new SpriteSheet(new SHEET().bitmapData, SHEET_FRAME_WIDTH, SHEET_FRAME_HEIGHT);
_world.addChildToWorld(_ss);
//
_ss.position = new Point3D(SIZE/2, 0, SIZE/2);
_world.addEventListener(MouseEvent.CLICK,onClick);
makeGrid();
}
//
private function makeGrid():void
{
// TODO Auto Generated method stub
_grid = new Grid(GIRD_SIZE, GIRD_SIZE);
for(var i:int = 0; i < GIRD_SIZE; i++)
{
for(var j:int = 0; j < GIRD_SIZE; j++)
{
_grid.setWalkable(i,j,true);
}
}
}
//
private function createWorld():void
{
_world = new IsoWorld();
_world.x = stage.stageWidth / 2;
_world.y = 100;
addChild(_world);
for(var i:int = 0; i < GIRD_SIZE; i++)
{
for(var j:int = 0; j < GIRD_SIZE; j++)
{
var tile:DrawnIsoTile = new DrawnIsoTile(SIZE, 0xcccccc);
tile.position = new Point3D(i * SIZE, 0, j * SIZE);
_world.addChildToFloor(tile);
}
}
}
private function onClick(event:MouseEvent):void
{
var pos:Point3D = IsoUtils.screenToIso(new Point(_world.mouseX, _world.mouseY));
var col:int = Math.round(pos.x/SIZE);
var row:int = Math.round(pos.z/SIZE);
// node
_grid.setStartNode(Math.round(_ss.x/SIZE),Math.round(_ss.z/SIZE));
// node
_grid.setEndNode(col,row);//
//
findPath();
//
_ss.action();
}
private function findPath():void
{
//A*
var astar:AStar = new AStar();
if(astar.findPath(_grid))
{
_path = astar.path;
_index = 0;
showPath();//
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
}
private function showPath():void
{
_world.clearPathTip();//
var node:Node;
for(var i:int = 0; i< _path.length; i++)
{
node = _path[i] as Node;
var pathNode:PathNode = new PathNode();
//
pathNode.position = new Point3D(node.x*SIZE,0,node.y*SIZE);
_world.addChildToPathTip(pathNode);
}
}
protected function onEnterFrame(event:Event):void
{
var node:Node = _path[_index];
var targetPoint:Point = IsoUtils.isoToScreen(new Point3D(node.x*SIZE+SIZE/2,0,node.y*SIZE+SIZE/2));
var playPoint:Point = IsoUtils.isoToScreen(_ss.position);
var dx:Number = targetPoint.x - playPoint.x;
var dy:Number = targetPoint.y - playPoint.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);
if(dist < _speed)
{
_index++;
if(_index >= _path.length)//
{
_ss.idle();
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}
}
else
{
var angle:Number = Math.atan2( dy, dx );//
var speedX:Number = _speed * Math.cos( angle );
var speedY:Number = _speed * Math.sin( angle );
var ang:Number=angle*180/Math.PI;
// ,
if(ang > -22.5 && ang <= 22.5)
{
_ss.setDirection(Directions.E);
}
else if(ang > 22.5 && ang <= 67.5)
{
_ss.setDirection(Directions.SE);
}
else if(ang > 67.5 && ang <= 112.5)
{
_ss.setDirection(Directions.S);
}
else if(ang > 112.5 && ang <= 157.5)
{
_ss.setDirection(Directions.SW);
}
else if(ang > -157.5 && ang <= -112.5)
{
_ss.setDirection(Directions.NW);
}
else if(ang > -67.5 && ang <= -22.5)
{
_ss.setDirection(Directions.NE);
}
else if(ang > -112.5 && ang <= -67.5)
{
_ss.setDirection(Directions.N);
}
else
{
_ss.setDirection(Directions.W);
}
var newX:Number=_ss.screenX+speedX;
var newY:Number=_ss.screenY+speedY;
var newPos:Point3D=IsoUtils.screenToIso(new Point(newX,newY));
_ss.position=newPos;//
}
}
}
}
소스 코드가 첨부 파일에 있음
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
도쿄도 건축물 환경 계획서의 데이터로 물건 사이트를 만들어 봤어요.나는 원래 이 집을 좋아했지만 도쿄도 건축물 환경계획서의 데이터가 좋아서 그것을 바탕으로 이 사이트를 만들었다. 이 물건의 구조물의 규격정보, 지도정보, 거주편안정보를 조합하여 감각이 좋은 물건 사이트를 만들고 싶다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.