PDA

Просмотр полной версии : плавное перемещение мувмка к мышке.


sspy
26.02.2010, 17:19
в общем есть муви клип (обычный круг 5х5px) у клипа в Linkage прописано main.Cor

Вот содержимое main/Cor.as

package main
{
import flash.display.MovieClip;
import flash.events.*;

public class Cor extends MovieClip
{
var step:int = 1;
var o:Boolean = false;
var fx,fy,stepx,stepy:Number = 0;

function Cor():void
{
stage.addEventListener(MouseEvent.CLICK,EventMouseClick);
stage.addEventListener(Event.ENTER_FRAME,EventEneterFrame);
this.fx = this.x;
this.fy = this.y;
this.x = Math.floor(this.x);
this.y = Math.floor(this.y);
}

function EventMouseClick(eve:MouseEvent):void
{
this.o=false;
this.fx = Math.floor(eve.localX);
this.fy = Math.floor(eve.localY);
var tx:Number = fx - this.x;
var ty:Number = fy - this.y;

var countstep:Number = 0;
if (Math.abs(tx) > Math.abs(ty))
{
countstep = tx/this.step;
this.stepy = ty/countstep;
this.stepx = tx/Math.abs(tx);
}
else
{
countstep = ty/this.step;
this.stepy = ty/Math.abs(ty);
this.stepx = tx/countstep;
}
trace('x: '+((this.stepx*countstep)==tx));
trace('y: '+((this.stepy*countstep)==ty));
this.o=true;
}

function EventEneterFrame(event:Event):void
{
if (this.o === true)
{
if (this.x != this.fx)
this.x+=this.stepx;

if (this.y != this.fy)
this.y+=this.stepy;
}
}

}
}


мне нужно чтоб как только я щелкал по области флешки (не по муви клипу) так сразу мувиклип постепенно перемещался к этой точке, но у меня проблемма в том что постоянно мувик либо проезжает точку либо не доежает.... помогите.

d_ruha
26.02.2010, 18:15
Это проще реализовать твинами. После клика есть координаты мувика и координаты точки, куда его нужно перемещать.
Tween(mov, "x", Strong.easeOut, this.x, stage.mouseX, 1, true);
Tween(mov, "y", Strong.easeOut, this.y, stage.mouseY, 1, true);
это если делать стандартным твином. Можно и сторонними реализациями.

Zebestov
26.02.2010, 18:21
package main
{
import flash.display.MovieClip;
import flash.events.*;
import fl.transitions.Tween;
import fl.transitions.TweenEvent;
import fl.transitions.easing.None;

public class Cor extends MovieClip
{
private const _speed:uint = 31; // устанавливаем скорость движения в px/сек
private var _xTween:Tween;
private var _yTween:Tween;

public function Cor():void
{
stage.addEventListener(MouseEvent.CLICK,EventMouseClick);
}

private function EventMouseClick(e:MouseEvent):void
{
var dx:int = int(e.localX - this.x);
var dy:int = int(e.localY - this.y);
var timeForAnimation:Number = Math.sqrt(dx*dx + dy*dy) / _speed;

_xTween = new Tween(this, "x", None.easeNone, thix.x, e.localX, timeForAnimation, true)
_yTween = new Tween(this, "y", None.easeNone, thix.y, e.localY, timeForAnimation, true)
_xTween.addEventListener(TweenEvent.MOTION_FINISH, onFinishHandler);
{

private function onFinishHandler(e:TweenEvent):void
{
e.target.removeEventListener(TweenEvent.MOTION_FINISH, onFinishHandler);
_xTween = null;
_yTween = null;
{
}
}


В данном примере будет происходить анимация твоего кружочка с одинаковой скоростью на любую дистанцию... и никаких недолетов/перелетов =)

silin
26.02.2010, 19:29
еще, как вариант без сторонних твинов, имхо для таких вещей без них спокойнее
package main
{
import flash.display.*;
import flash.events.*;

public class Cor extends MovieClip
{

private var clickX:Number;
private var clickY:Number;

function Cor():void
{
//круг
graphics.beginFill(0x0);
graphics.drawCircle(0, 0, 5);

addEventListener(Event.ADDED_TO_STAGE, onStage);
}

private function onStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onStage);
stage.addEventListener(MouseEvent.CLICK, onStageClick);
addEventListener(Event.ENTER_FRAME, onCorEneterFrame);
}

private function onStageClick(eve:MouseEvent):void
{
clickX = stage.mouseX;
clickY = stage.mouseY;
}

private function onCorEneterFrame(event:Event):void
{
x += (clickX - x) / 4;//4 - на глаз, на вкус
y += (clickY - y) / 4;
}

}
}

Zebestov
27.02.2010, 00:39
Тут уж дело стиля =)
Мне напротив спокойней организовать твин по случаю, подтереть его после всех дел и никаких забот.
Кстати — в твоем примере стиль анимации будет типа easeOut. Но это красиво =)
Некрасиво только то, что анимация уже закончилась, а ENTER_FRAME еще работает, да еще и считает там что-то уже бесполезное. Но и это решается: проверил, выровнял, отписался.
Просто надо это все учесть.

dimarik
27.02.2010, 01:58
обычный круг 5х5px

Улыбнуло. Насколько помню, у круга есть радиус и длина окружности.