Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Движение объекта по линии (http://www.flasher.ru/forum/showthread.php?t=150100)

CJIECAPb 06.02.2011 14:55

Движение объекта по линии
 
Код AS1/AS2:

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

Код AS1/AS2:

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, всё вроде тоже работает но есть одно но ! тыркаеш по сцене, объект двигается нормально из точки А в точку Б , но стоит нажать на него и всё! после этого куда-бы ты его не засылал по достижению конечной точки он моментом возвращается на точку откуда он начал движение.

mooncar 06.02.2011 19:46

Просто это доигрывают предыдущие твины.

Вы их объявляете как локальные переменные, они и живут, и накладываются. Убираем var, и "засовываем" экземпляры tween'ов прямо в obj, как свойство (в принципе без разницы куда, но так удобнее, когда объектов много и легче потом обращаться будет).

Останавливаем и затираем предыдущий твин новым под тем же именем, не давая тем самым предыдущему доиграть.
Вот так:
Код AS1/AS2:

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, то там это делается автоматом.
Бросайте сразу адобовский, он менее удобен и менее производителен.

CJIECAPb 06.02.2011 21:38

Спасибо за инфу ,уже проверил TweenLite всё работает так как надо и проц по менее грузит !


Часовой пояс GMT +4, время: 01:05.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.