Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   спрайт от точки A до точки B - как лучше решить (http://www.flasher.ru/forum/showthread.php?t=205627)

viktorami 12.12.2013 15:20

спрайт от точки A до точки B - как лучше решить
 
спрайт находится в точке x;y а должен переместится в точку x1;y1 как легче и проще решить такую задачу?
(кода не надо, речь о самой концепции- может какие есть спецсредства в as3?)
то есть требуется плавное перемещение от начала линии до конца.

Akopalipsis 12.12.2013 15:24

Есть! Анимация, но если Вы сами не можете просто передвинуть обьект, то это наверное немного плохо.

caseyryan 12.12.2013 15:25

Кэп мне тут подсказывает, что нужно просто задать ему новые координаты x и y

viktorami 12.12.2013 15:32

нет нет. речь идет о плавном перемещении по линии от начала и до конца.

KumoKairo 12.12.2013 15:39

Это называется анимация.
Можно подойти с двух сторон:
1. Высчитать нормированный вектор направления движения, и в каждом кадре прибавлять к вектору положения вектор перемещения умноженный на скорость перемещения до тех пор, пока объект не будет находиться в эпсилон окрестности конечной точки.
2. Составить уравнение кривой Безье первого порядка с учетом желаемого времени прибытия в конечную точку, и в каждом кадре высчитывать, сколько времени прошло от начала запуска анимации и делить на общее время анимации. В результате вычислений получим нормированное значение переменной t в линейном уравнении Безье, что позволит нам получить текущую координату нашего объекта

viktorami 12.12.2013 15:44

я попытался взять так:
уравнение линии
y=kx+b
если я буду знать наклон угла линии - то смогу и найти его тангенс - k
но как по двум кординатам найти этот угол?

Akopalipsis 12.12.2013 16:15

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class AnimationTest extends Sprite
        {
                private var sprite:Sprite;
                private var array:Array;
                public function AnimationTest()
                {
 
                        sprite = new Sprite();
                        sprite.graphics.beginFill(0x8E6828);
                        sprite.graphics.drawRect(0, 0, 100, 100);
                        sprite.graphics.endFill();
                        sprite.x = sprite.y = 200;
                        addChild(sprite);
                        array = ['x' ,sprite.x, 400, 'y', sprite.y, 400];
                        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                }
                private var allTime:Number = 0;
                private var duration:Number = 3;
                private function enterFrameHandler(event:Event):void
                {
                        var time:Number = 1 / 1000 * stage.frameRate;
                        allTime += time;
                        var ratio:Number = allTime / duration;
                        if (allTime >= duration) ratio = 1;
                        var length:int = array.length / 3;
                        for (var i:int = 0; i < length; i++)
                        {
                                const property:String = array[i * 3];
                                const start:Number = array[i * 3 + 1];
                                const finish:Number = array[i * 3 + 2] - start;
                                sprite[property] = ratio * finish + start;
                        }
                }
 
        }
 
}


viktorami 12.12.2013 16:20

да нет. что то тут не то

Akopalipsis 12.12.2013 16:27

Цитата:

да нет. что то тут не то
Что?) Тогда могу посоветовать почитать про вектора.

KumoKairo 12.12.2013 16:31

Я же написал как можно сделать. Не нужны никакие углы, это простейшая векторная алгебра

viktorami 12.12.2013 16:33

1. Высчитать нормированный вектор направления движения, и в каждом кадре прибавлять к вектору положения вектор перемещения умноженный на скорость перемещения до тех пор, пока объект не будет находиться в эпсилон окрестности конечной точки.
----------
а как его высчитывать то? а прибавлять? какие в as3 механизмы то есть? об этом и спрашиваю

Akopalipsis 12.12.2013 16:35

Так я Вам это уже сделал.

KumoKairo 12.12.2013 16:40

Цитата:

а как его высчитывать то? а прибавлять? какие в as3 механизмы то есть? об этом и спрашиваю
Вы говорили что код не нужен, только концепция.

Akopalipsis, ваш код просто ужасен.
Во-первых, для определения времени есть функция getTimer()
Во-вторых, массив с элементами разного типа, это вообще никуда не годится. в AS3 есть класс Point, его желательно использовать для представления точек. Или хотя бы простой объект со свойствами x и у
Код AS3:

var length:int = array.length / 3; 
sprite[property] = ratio * finish + start;

Вообще каша

viktorami 12.12.2013 16:43

array = ['x' ,sprite.x, 400, 'y', sprite.y, 400];
------
а что тут делается?
это только одна строка массива или вообще что?

Akopalipsis 12.12.2013 16:46

Цитата:

это только одна строка массива или вообще что?
Это массив, в который поместили значения. Обычный при обычный массив.

viktorami 12.12.2013 16:48

да. спасибо! этот код работает. но я совершенно не пойму как. не в плане as3 а саму логику.
что это за странный массив был создан через который все действует?

Добавлено через 43 секунды
а сам вектор перемещения он где высчитывается?

Добавлено через 1 минуту
просто из за того что все обращается через массив я слабо понимаю математический смысл.

Akopalipsis 12.12.2013 16:53

KumoKairo я всегда прислушиваюсь к советам и благодарю за них, но не в этот раз. Вы не правы. Каша это Ваш пример о кнопках, который вообще на другом языке.
getTimer(), Point, "Или хотя бы простой объект со свойствами x и у" - вперёд! Сделайте и покажите!

Добавлено через 4 минуты
Цитата:

просто из за того что все обращается через массив я слабо понимаю математический смысл.
Смысл смешанного массива в том, что обычно это делается с специальным классом, в котором есть свойства,
но с ним было бы ещё более не понятно. А вектор высчитывается в -
Код AS3:

const finish:Number = array[i * 3 + 2] - start;

Добавлено через 6 минут
Цитата:

находиться в эпсилон окрестности конечной точки.
Это прям не каша, а откровение. Вот прочёл и сразу понял как анимацию делать...

viktorami 12.12.2013 17:06

а вот мой совет. вот так код удобен и хорош. а то массив из шести элементов, цикл до двух повторений))) ну ну
x1 и y1-начальные координаты
x2 и y2-целевые
Код AS3:

        var  start:Number = x1;         
                        var  finish:Number = x2 - start;
                myCursor.x = ratio * finish + start;
                  start  = y1;       
                  finish  =y2  - start;
                myCursor.y = ratio * finish + start;

Добавлено через 1 минуту
а вот за сам код большое спасибо. я бы фиг знает сколько разбирался бы

Akopalipsis 12.12.2013 17:16

Цитата:

а вот за сам код большое спасибо. я бы фиг знает сколько разбирался бы
А на самом деле Вам ещё разбираться и разбираться. Код показывает только направление, но до конечного результата ещё очень и очень много учить.


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

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