Просмотр полной версии : Движение объекта по линии
CJIECAPb
06.02.2011, 14:55
onMouseDown = function () {
speed = 1;
posX = _root._xmouse;
posY = _root._ymouse;
objX = _root.obj._x;
objY = _root.obj._y;
angle = Math.atan2(posY-objY, posX-objX);
moveX = Math.cos(angle)*speed;
moveY = Math.sin(angle)*speed;
// LINE
_root.createEmptyMovieClip("line1", 1);
color = (255);
_root.line1.lineStyle(1, color, 100);
_root.line1.moveTo(objX, objY);
_root.line1.lineTo(posX, posY);
};
onEnterFrame = function () {
_root.obj._x += moveX;
_root.obj._y += moveY;
};
Скрипт на первый взгляд работает, проблема в том что если провести линию через точки где начинается движение и заканчивается видно что Объект сдвигается под конец на пикселей 5-10 в сторону от линии( на больших дистанциях ), особенно это заметно если двигать его по диагонали ! Помогите решить эту геометрическую задачку , спасибо !
rainbowrussia
06.02.2011, 17:13
Флеш неточно работает с нецелыми числами. Не используйте конструкции типа _coord += delta. Сделайте вычисление очередной координаты по типа _coord = src + (dest - src) * current_step / total_steps. И еще почитайте по Tween, это может упростить вашу задачу.
CJIECAPb
06.02.2011, 19:07
import mx.transitions.Tween;
import mx.transitions.easing.*;
onMouseDown = function () {
var distance:Number = Math.sqrt(((_root.obj._x-_root._xmouse)*(_root.obj._x-_root._xmouse))+((_root.obj._y-_root._ymouse)*(_root.obj._y-_root._ymouse)));
var time:Number = distance/100;
var TweenX = new Tween(_root.obj, "_x", None.easeNone, _root.obj._x, _root._xmouse, time, true);
var TweenY = new Tween(_root.obj, "_y", None.easeNone, _root.obj._y, _root._ymouse, time, true);
};
Ситуация с классом Tween, всё вроде тоже работает но есть одно но ! тыркаеш по сцене, объект двигается нормально из точки А в точку Б , но стоит нажать на него и всё! после этого куда-бы ты его не засылал по достижению конечной точки он моментом возвращается на точку откуда он начал движение.
Просто это доигрывают предыдущие твины.
Вы их объявляете как локальные переменные, они и живут, и накладываются. Убираем var, и "засовываем" экземпляры tween'ов прямо в obj, как свойство (в принципе без разницы куда, но так удобнее, когда объектов много и легче потом обращаться будет).
Останавливаем и затираем предыдущий твин новым под тем же именем, не давая тем самым предыдущему доиграть.
Вот так:
import mx.transitions.Tween;
import mx.transitions.easing.*;
onMouseDown = function ()
{
var distance:Number = Math.sqrt(((_root.obj._x - _root._xmouse) * (_root.obj._x - _root._xmouse)) +( (_root.obj._y - _root._ymouse) * (_root.obj._y - _root._ymouse)));
var time:Number = distance/100;
obj.tweenX.stop();
obj.tweenY.stop();
obj.tweenX = new Tween(_root.obj, "_x", None.easeNone, _root.obj._x, _root._xmouse, time, true);
obj.tweenY = new Tween(_root.obj, "_y", None.easeNone, _root.obj._y, _root._ymouse, time, true);
};
К слову сказать, если использовать не стандартный Tween, а TweenLite от greensock (http://www.greensock.com/tweenlite/), то там это делается автоматом.
Бросайте сразу адобовский, он менее удобен и менее производителен.
CJIECAPb
06.02.2011, 21:38
Спасибо за инфу ,уже проверил TweenLite всё работает так как надо и проц по менее грузит !
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.