Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Одновременная работа твинеров (http://www.flasher.ru/forum/showthread.php?t=142450)

Xel'[Naga] 21.07.2010 18:10

Одновременная работа твинеров
 
Есть объект, его координаты x=0, y=0

Мы применяем к нему твинер, который за 5 секунд должен будет изменить y на 200.

Через 4.5 секунды мы запускаем 2 твинер, который должен поднять(y) объект на 50px

В итоге у нас получается, что у объекта в конце Y равен 180(4.5*200/5) +50 =230. А нужно, чтобы Y у объекта после выполнения 2 твина был равен 250. Вообщем надеюсь ясно обяснил :)

PS: Все цифры динамические, нельзя например запустить 2й твинер с delay.

mikhailk 21.07.2010 18:15

На мой взгляд, два варианта:

1. Делать два твинера, первый по х, второй по х и y. В нужный момент прибивать первый и запускать второй от текущих координат объекта.

2. Написать ручками. Ничего там волшебного нет. Задаете объекту по enterFrame или по таймеру (имхо, лучше по таймеру, либо по enterFrame, но с пересчетом позиции по таймеру) смещение по х и y, в нужный момент изменяете смещение по y.

Genzo 21.07.2010 18:23

Код AS3:

 
main.x = 0;
main.y = 0;
 
var t:Tween = new Tween(main , "x",Strong.easeOut,0,300,5,true);
t.addEventListener(TweenEvent.MOTION_CHANGE , test);
t.start();
 
function test(e:TweenEvent){
        if(e.time > 4.5){
        e.currentTarget.stop();
        var t2:Tween =  new Tween(main , "x",Strong.easeOut,e.position,e.currentTarget.finish+50,1,true);
        t2.start();
        }
}

Добавлено через 49 секунд
2 Tween с одним объектом и параметром одновременно работать не будут

Mur4ik 21.07.2010 18:58

Во втором твине указать чтоб не прибавлял к текущей "у" 50, а довел этот "у" до 250.
А то как то не логично получается, вам нужно чтоб объект оказался в координате 250 и вы при этом надеетесь что в момент запуска второго твина координата "у" почему то должна быть именно 200.

mikhailk 21.07.2010 22:13

Цитата:

Сообщение от Genzo (Сообщение 923940)
2 Tween с одним объектом и параметром одновременно работать не будут

Если вместо штатного Tween использовать TweenLite, то там можно менять одновременно несколько параметров в рамках одного твина.

Xel'[Naga] 21.07.2010 22:59

mikhailk: 1. Это тоже самое о чём я написал в начале.
Как такое реализовать с помощью Tweenlite(tweenMax)?

Mur4ik: Нужно именно прибавлять, а не указывать новую координату. И про 200 нигде не было речи, речь было про то как сделать объект на высоте 250px учитывая условия указанные в 1 посте.

Mur4ik 21.07.2010 23:16

Цитата:

Сообщение от Xel'[Naga] (Сообщение 924004)
Как такое реализовать с помощью Tweenlite(tweenMax)?

По поводу нормальных твинеров, обычно присутствует свойство overwrite (TweenLite/Max) или что то типа того у других. И обычно по дефолту оно включено, т.е следующий твин перепишет идентичные свойства твинуемые в первом.

Цитата:

Сообщение от Xel'[Naga] (Сообщение 924004)
И про 200 нигде не было речи...

Если вы прибавляете 50 и хотите получить 250, значит ожидаете что "у" в данный момент именно 200.

Цитата:

Сообщение от Xel'[Naga] (Сообщение 924004)
... речь было про то как сделать объект на высоте 250px учитывая условия указанные в 1 посте.

Если нужно на 250, укажите второму твину двигать объект до 250.

В противном случае, здается мне, вы неправильно/не точно описываете проблему
Из ваших слов имеем
Цитата:

Сообщение от Xel'[Naga] (Сообщение 923930)
Есть объект, его координаты x=0, y=0

Мы применяем к нему твинер, который за 5 секунд должен будет изменить y на 200.

Через 4.5 секунды мы запускаем 2 твинер, который должен поднять(y) объект на 50px

За 5 сек нужно пройти до 200, а в 4.5сек еще этих 200 не будет.
Но вы все же берете данные объекта на этапе незаконченного твина (который до 200 еще не дошел), прибавляете к нему 50 и ожидаете получить 250?

Xel'[Naga] 21.07.2010 23:45

Цитата:

Сообщение от Mur4ik (Сообщение 924006)
По поводу нормальных твинеров, обычно присутствует свойство overwrite (TweenLite/Max) или что то типа того у других. И обычно по дефолту оно включено, т.е следующий твин перепишет идентичные свойства твинуемые в первом.

Пробовал, объект уезжает в точку указанной в 1 твинере или во 2м...возможно конечно что я что-то не так сделал.

Цитата:

Сообщение от Mur4ik (Сообщение 924006)
Если вы прибавляете 50 и хотите получить 250, значит ожидаете что "у" в данный момент именно 200.

Неправда, хотелось бы такой вариант, что 2й твинер извлекёт из 1 конечную координату и продолжит анимацию учитывая изменения. И совсем неважно где сейчас объект находится.

Цитата:

Сообщение от Mur4ik (Сообщение 924006)
Если нужно на 250, укажите второму твину двигать объект до 250.

Допустим, я указал 250, через 3 секунды нужно снова прибавить 50, т.е. уже нужно 300. Вы же понимаете, что речь идёт о динамических данных, которые меняет пользователь когда ему вздумается и если бы так просто было указать 250, я бы так и сделал :) Всё же думаю, в твинерах(сам использую от greensock) есть реализация подобной штуки, наверняка ктото сталкивался. Идея Genzo интересна, но интересно услышать ещё какие-то мысли.

Цитата:

Сообщение от Mur4ik (Сообщение 924006)
В противном случае, здается мне, вы неправильно/не точно описываете проблему
Из ваших слов имеем

За 5 сек нужно пройти до 200, а в 4.5сек еще этих 200 не будет.
Но вы все же берете данные объекта на этапе незаконченного твина (который до 200 еще не дошел), прибавляете к нему 50 и ожидаете получить 250?

Всё верно.

Давайте тогда более детально. В моём случае есть поле, разделённое на блоки(скажем 10х10), каждый объект знает где он находится, в случае движения объекта(он может двигаться только вниз) сам объект знает где он будет находится (например клетка 1х10).

Теперь ситуация:
Создаётся объект(А) в клетке 1х1 и начинает падение в 1х10 - время падения всегда равно 5 сек, независимо от того, сколько клеток нужно пролететь. Но вот теперь представьте, что во время падения объекта, пользователь создаёт ещё 1 объект(Б) в клетке 1х10 - этот объект никуда не падает, т.к. находится в самой нижней точке. Дык вот проблема, как обновить данные у 1(А) объекта(ведь теперь он должен упать в клетку 1х9)?

Это простейший пример, который пришёл в голову. Надеюсь я хоть немного смог объяснить суть.


PS: Добавлю, что движение объекта не может быть по 1 клетке(т.е. для каждой клетки создавать анимацию).

mikhailk 22.07.2010 00:08

Xel'[Naga],
Вы даете другим участникам форума недостаточно информации для того, чтобы советы были для Вас полезными.


Цитата:

Дык вот проблема, как обновить данные у 1(А) объекта(ведь теперь он должен упать в клетку 1х9)?
Это лучше делать без твинов. Объект должен сам знать, куда он движется, и должен сам постоянно выяснять, может ли он переместиться в следующую клетку. Это самое простое.

Можно это реализовать через некоторый контроллер, который будет его передвигать и тогда уже он будет проверять возможность перемещения в следующую клетку.

Mur4ik 22.07.2010 00:28

Кто то из ваших компонентов все равно должен знать конечную точку/координату прибытия.
Добавляя объект Б вы уже знаете что объекту А нужно пролететь меньше на одну клетку (знаете ведь?), вот и получив такие данные обновляете твин А с нужными новыми координатами, только конечными а не на основе текущих и не прибавляя постоянную величину, а указывая до куда ему лететь.

Xel'[Naga] 22.07.2010 15:16

mikhailk: Извиняюсь мне показалось, что данные условия были достаточны, чтобы понять суть проблемы. Изначально я сделал, что объект сам себя двигал и следил за собой, потом понадобился контроллер, его конечно же я и сделал, теперь он управляет всеми объектами - управляет с помощью твинов. Зачем ведь определять каждые N фреймов, может ли какой-то объект двигаться в нужную точку, когда есть возможность передвинуть этот объект уже в нужную точку(точнее суть вопрос была в том, как изменить данные твинера).

Mur4ik: Вообщем, решил я проблему, точнее нашёл проблемное место. С вашей помощью конечно, за что и говорю всем вам спасибо. Проблема - это моя вина, я запускал твинер с delay 5сек, по прошествии 4.5 сек появлялась преграда. но 1й твинер незнал о ней, т.к. он уже был запущен но с паузой - это ключевой момент, который я упустил, я его обнаружил после просмотра старых участков кода ;)

PS: Всем ещё раз спасибо.


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

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