求as3物体移动算法
舞台上已有一个mc实例名称为sp,速度(speed)=3,鼠标点击一下舞台的某个位置,sp慢慢的向鼠标点击的位置移动,求实例代码(as3)...
舞台上已有一个mc实例名称为sp,速度(speed) = 3,鼠标点击一下舞台的某个位置,sp慢慢的向鼠标点击的位置移动,求实例代码(as3)
展开
4个回答
展开全部
下面是核心代码
private function onMouseClickHandle(evt:MouseEvent):void
{
//记录目标位置
targetPosX = evt.stageX;
targetPosY = evt.stageY;
//分别记录x方向和y方向上的速度
var ang:Number = Math.atan2(targetPosY - mc.y, targetPosX - mc.x);
speedX = speed * Math.cos(ang);
speedY = speed * Math.sin(ang);
//设置mc运动
isMove = true;
}
上面的方法是在点击舞台的时候调用
private function onEnterFrameHandle(evt:TimerEvent):void
{
if(!isMove)
{
return;
}
if(Math.sqrt((mc.x - targetPosX) * (mc.x - targetPosX) + (mc.y - targetPosY) * (mc.y - targetPosY)) < 2 )
{
//如果mc和目标位置的距离小于2,将设置mc不可运动,将mc位置调至目标位置
isMove = false;
mc.x = targetPosX;
mc.y = targetPosY;
}
else
{
mc.x += speedX;
mc.y += speedY;
}
}
上面的方法是在Event.ENTER_FRAME中触发,我这里用的是Timer
详细的代码,请看附件,直接新建一个Fla(Actionscript 3.0)文档 将此类设置为文档类,测试,就会出效果了,不明白的话 Hi我
展开全部
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.events.Event;
var speed:Number = 3;
var stp:Point;
var edp:Point;
var timeValue:Number;
var timeValueSpeed:Number;
stage.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
function onMouseDown(e:MouseEvent):void
{
stp = new Point(sp.x,sp.y);
edp = new Point(mouseX,mouseY);
timeValue = 0;
timeValueSpeed = speed/edp.subtract(stp).length;
removeEventListener(Event.ENTER_FRAME,onEnterFrame);
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
function onEnterFrame(e:Event):void
{
timeValue = Math.min(1,timeValue+timeValueSpeed);
var p:Point = Point.interpolate(edp,stp,timeValue);
sp.x = p.x;
sp.y = p.y;
if(timeValue >= 1)
{
removeEventListener(Event.ENTER_FRAME,onEnterFrame);
}
}
追问
谢谢你
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
var ax:Number;
var ay:Number;
var aa:Number;
var ab:Number;
var bx:Number;
var by:Number;
var a1:Timer=new Timer(100);
var a2:Timer=new Timer(100);
var a3:Timer=new Timer(100);
var a4:Timer=new Timer(100);
var a5:Timer=new Timer(100);
a1.addEventListener(TimerEvent.TIMER,b1);
a2.addEventListener(TimerEvent.TIMER,b2);
a3.addEventListener(TimerEvent.TIMER,b3);
a4.addEventListener(TimerEvent.TIMER,b4);
a5.addEventListener(TimerEvent.TIMER,b);
stage.addEventListener(MouseEvent.CLICK,b5)
function b1(event:TimerEvent):void
{
sp_mc.x+=aa;
}
function b2(event:TimerEvent):void
{
sp_mc.x-=aa;
}
function b3(event:TimerEvent):void
{
sp_mc.y+=ab;
}
function b4(event:TimerEvent):void
{
sp_mc.y-=ab;
}
function b5(event:MouseEvent):void
{
a5.start();
ax=mouseX;
ay=mouseY;
bx=sp_mc.x;
by=sp_mc.y;
if(ax>bx)
{
aa=(ax-bx)/20;
a1.start();
}
else if(bx>ax)
{
aa=(bx-ax)/20;
a2.start();
}
if(ay>by)
{
ab=(ay-by)/20;
a3.start();
}
else if(by>ay)
{
ab=(by-ay)/20
a4.start();
}
}
function b(event:TimerEvent):void
{
bx=sp_mc.x;
by=sp_mc.y;
if(ax<bx
&& ay<by)
{
if((by-ay)<10
&& (bx-ax)<10)
{
a1.stop();
a2.stop();
a3.stop();
a4.stop();
a5.stop();
}
}
else if(ax>bx
&& ay>by)
{
if((ay-by)<10
&& (ax-bx)<10)
{
a1.stop();
a2.stop();
a3.stop();
a4.stop();
a5.stop();
}
}
else if(ax>bx
&& ay<by)
{
if((by-ay)<10
&& (ax-bx)<10)
{
a1.stop();
a2.stop();
a3.stop();
a4.stop();
a5.stop();
}
}
else if(ax<bx
&& ay>by)
{
if((ay-by)<10
&& (bx-ax)<10)
{
a1.stop();
a2.stop();
a3.stop();
a4.stop();
a5.stop();
}
}
}
我的就不能看看吗?也是会来的。
至少采取一下嘛。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
推荐你去用一下greensock这个库
import com.greensock.TweenLite;
后面在代码里面写
var sp:Sprite = new Sprite();
//xxxxxx对sp的初始化
TweenLite.to(sp,1,{x:100,y:100});
greensock这个缓动库 对于很多运动都打包的很好 除了直线运动 变速运动 bezier曲线什么的都能用
import com.greensock.TweenLite;
后面在代码里面写
var sp:Sprite = new Sprite();
//xxxxxx对sp的初始化
TweenLite.to(sp,1,{x:100,y:100});
greensock这个缓动库 对于很多运动都打包的很好 除了直线运动 变速运动 bezier曲线什么的都能用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询