首先让我们准备一张简陋的地图
物体要从A点移动到B点,速率为speed(每帧移动的长度)
public class Dot {
//横坐标
public var x:int;
//纵坐标
public var y:int;
// constructor code
x = xPoz;
y = yPoz;
}
}
回到game.fla,把我们画好的地图导入到舞台,对齐到(0,0),新建一个图层,在上面直接写下以下的代码,
import flash.events.Event;
//路径数据,数组中的每个元素代表一个点,顺序是从起点到终点
var pathArr:Array = [new Dot(850, 27),
new Dot(800, 27),
new Dot(627, 20),
new Dot(444, 22),
new Dot(391, 30),
new Dot(150, 31),
new Dot(90, 50),
new Dot(73, 133),
new Dot(71, 193),
new Dot(80, 220),
new Dot(110, 260),
new Dot(162, 302),
new Dot(228, 324),
new Dot(282, 320),
new Dot(540, 233),
new Dot(590, 227),
new Dot(630, 250),
new Dot(646, 293),
new Dot(651, 543),
new Dot(643, 600)];
//创建小怪物,添加到舞台,并设定初始位置
var monster:Monster = new Monster();
addChild(monster);
monster.x = Dot(pathArr[0]).x;
monster.y = Dot(pathArr[0]).y;
//小怪的运动速率
var speed:int = 6;
//分解到两个方向,水平vx和竖直vy
var vx:Number;
var vy:Number;
//连点之间的距离除以速率的值
var stepNums:int;
//循环用变量
var stepCount:int = 0;
//当前是否经过一个关键点(数组中指定的点 )
var passedDot:Boolean = true;
//当前对应的关键点
var currentIndex:int = 0;
//关键点数量
var num:int = pathArr.length;
this.addEventListener(Event.ENTER_FRAME, onEnterFm);
function onEnterFm(e:Event):void
{
//如果正好通过一个关键点
if(passedDot)
{
//如果还没有到最后一个关键路径点
if(currentIndex < num - 1)
{
//两相邻关键点Y坐标差值
var deltaY:Number = Dot(pathArr[currentIndex+1]).y - Dot(pathArr[currentIndex]).y;
//两相邻关键点X坐标差值
var deltaX:Number = Dot(pathArr[currentIndex+1]).x - Dot(pathArr[currentIndex]).x;
//计算出两相邻关键点连线的角度
var angle:Number = Math.atan2(deltaY, deltaX);
//调整小怪的角度
monster.rotation = angle * (180/Math.PI);
//计算出在这两个关键点之间每帧在两个方向上的移动距离
vx = speed*Math.cos(angle);
vy = speed*Math.sin(angle);
计算出两相邻关键点连线的长度(勾股定理)
var dis:Number = Math.sqrt(deltaY*deltaY+deltaX*deltaX);
//距离除以速率,得到的值表示在这个值表示的帧数内不用再计算vx和vy
stepNums = int(dis/speed);
}
//
passedDot = false;
}
if(stepCount < stepNums)
{
//只要小于stepNums,怪物移动的方式如下
monster.x += vx;
monster.y += vy;
}
else
{
//没有运动到终点
if(currentIndex < num - 1)
{
//对应关键点移动到下一个
currentIndex++;
//循环计数重置
stepCount = 0;
//通过了一个点,开始一段新路程
passedDot = true;
//将小怪定位到新起点
monster.x = Dot(pathArr[currentIndex]).x;
monster.y = Dot(pathArr[currentIndex]).y;
}
}
stepCount++;
}
按下cltr+enter运行一下,看到小怪的确是按照指定的路径在运动,而且小怪的自转角度也是合适的。
文章来自http://cdbym.blog.163.com/blog/static/28331498201167104013925/