Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Работа с циклом for (http://www.flasher.ru/forum/showthread.php?t=165432)

DarkKnight2009 23.08.2011 00:17

Работа с циклом for
 
Здравсвуйте.
Подскажите пожалуйста.
Есть массив координат и есть функия, которая должна в цикле проходить по массиву и вызывать анимацию для каждой ячейки, но у мея почему то вызывается только последняя ячейка.
Код AS3:

var speedCoords:Array = [195, 235, 310, 335];
var speedMax:int = speedCoords.length;
var transmission:int = 0;
var i:int = 0;
 
addEventListener(Event.ENTER_FRAME, onLoop, false, 0, true);
function onLoop(event:Event):void
{
        for(i; i < speedMax; i ++)
        {
                TweenMax.to(spd_mc, 4, {shortRotation:{rotation:speedCoords[i]}});
        }
}

Что не так, как исправить код?
Подскажите пожалуйста

GBee 23.08.2011 00:28

Так не успевает выполнить первые три анимации. Создайте последовательность в цикле, а потом запускайте, но в ентерфрейме все это делаете, опять вряд ли успеет.

Котяра 23.08.2011 00:32

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

DarkKnight2009 23.08.2011 00:35

Я не совсем понял. можно пример?

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

Сообщение от Котяра (Сообщение 1024610)
Тут энтерфрэйм не нужен и каждый следующий твин надо запускать по окончанию предыдущего, делать цепочку твинов.

А как же мне без цикла, мне ведь нужно по массиву проходить?
А в противном случае прийдется лепить 4 строки подряд одной анимации, или я ошибаюсь ?
Можно пример?

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

Сообщение от GBee (Сообщение 1024609)
Так не успевает выполнить первые три анимации. Создайте последовательность в цикле, а потом запускайте, но в ентерфрейме все это делаете, опять вряд ли успеет.

Если не в Ентерфрейме, тогда где. подскажите пожалуйста?

silin 23.08.2011 00:59

нет под рукой TweenMax'а
есть http://code.google.com/p/eaze-tween/, но суть та же:
Код AS3:

var speedCoords:Array = [195, 235, 310, 335];
var speedMax:int = speedCoords.length;
 
PropertyShortRotation.register();
var tween:EazeTween = new EazeTween(spd_mc);
for (var i:int = 0; i < speedMax; i++)
{
        tween.to(4).short(speedCoords[i]);
}


DarkKnight2009 23.08.2011 01:02

Цитата:

Сообщение от silin (Сообщение 1024620)
нет под рукой TweenMax'а
есть http://code.google.com/p/eaze-tween/, но суть та же:
Код AS3:

var speedCoords:Array = [195, 235, 310, 335];
var speedMax:int = speedCoords.length;
 
PropertyShortRotation.register();
var tween:EazeTween = new EazeTween(spd_mc);
for (var i:int = 0; i < speedMax; i++)
{
        tween.to(4).short(speedCoords[i]);
}


Разве в твинмаксе с rotation такое проканает?

GBee 23.08.2011 01:26

Почитайте про TimelineLite.append или TimelineMax.append http://www.greensock.com/as/docs/tween/ слева найдете.

silin 23.08.2011 01:28

упс, я извиняюсь, но и EazeTween, то что я написал через цикл что-то не совсем внятное дает
хотя вот так нормально все:
Код AS3:

eaze(spd_mc).to(4).short(195).to(4).short(235).to(4).short(310).to(4).short(335);

про твинмакс не могу сказать, нету

UPD: с "нанизыванием" твинов в цикле затык был в том, что следующий твин присоединялся не цепочке, а к исходному
чтобы в цикле это запустить надо на каждой итерации сохранять ссылку на возвращаемую цепочку, т.е.
Код AS3:

PropertyShortRotation.register();
var tween:EazeTween = new EazeTween(spd_mc);
for (var i:int = 0; i < speedMax; i++)
{
        tween=tween.to(4).short(speedCoords[i]);
}


DarkKnight2009 23.08.2011 01:32

Цитата:

Сообщение от silin (Сообщение 1024630)
упс, я извиняюсь, но и EazeTween, то что я написал через цикл что-то не совсем внятное дает
хотя вот так нормально все:
Код AS3:

eaze(spd_mc).to(4).short(195).to(4).short(235).to(4).short(310).to(4).short(335);

про твинмакс не могу сказать, нету

Спасибо большое, но мне нужен именно твинмакс :(

Добавлено через 49 секунд
Цитата:

Сообщение от GBee (Сообщение 1024629)
Почитайте про TimelineLite.append или TimelineMax.append http://www.greensock.com/as/docs/tween/ слева найдете.

Спасибо, сейчас поищу

Aquahawk 23.08.2011 09:55

Ребят вы чего! Тут же i локальная переменная, как я понимаю в функции(кадре). В onLoop она попадёт в замыкание и при новом вызове onLoop сохранит своё старое значение. В начале цикла она не обнуляется. Причём если этот кадр(а это похоже кадр) вызывается несколько раз, то получим наростающее количество обработчиков ентерфрейма.
DarkKnight2009 Запомните, всегда, во всех циклах, обнуляйте счётчик:
Код AS3:

for(i=0; i < speedMax; i ++)

До наложения твинов скорее всего дело не доходит, после первого старта i будет иметь максимальное значение.

silin 23.08.2011 10:40

>> Ребят вы чего!
да мы ничего, собственно, типа твины запускаем :)

TweenMax не поддерживает возможности 'нанизать' твины в цепочку,
как вариант можно их через delay запустить
Код AS3:

var speedCoords:Array = [195, 235, 310, 335];
var speedMax:int = speedCoords.length;
 
for (var i:int = 0; i < speedMax; i++)
{
        TweenMax.to(spd_mc, 4, { delay:i * 4, shortRotation: { rotation:speedCoords[i] }} );
}

UPD:
сори: поспешил с выводами сгоряча,
на самом деле поддрживает - через TimelineLite/TimelineMax
Код AS3:

var t:TimelineMax= new TimelineMax();
for (var i:int = 0; i < speedMax; i++)
{
        t.append(new TweenMax(spd_mc, 4, { ease:Linear,shortRotation: { rotation: speedCoords[i] }} ));
}


fish_r 23.08.2011 11:03

Можно наверное и без delay, если создавать экземпляр TweenMax'а, а не юзать статик... Наверное, не проверял, юзаю TimeLineLite, в таких случаях ( проще делается, без "for in"-ов), но думаю, что будет работать.

Добавлено через 7 минут
Гы.. а еще есть метод TweenMax.allTo(). Туда тоже можно без "for in"-а массив охапкой пихать.

DarkKnight2009 23.08.2011 11:23

Вложений: 1
Цитата:

Сообщение от silin (Сообщение 1024692)
>> Ребят вы чего!
да мы ничего, собственно, типа твины запускаем :)

TweenMax не поддерживает возможности 'нанизать' твины в цепочку,
как вариант можно их через delay запустить
Код AS3:

var speedCoords:Array = [195, 235, 310, 335];
var speedMax:int = speedCoords.length;
 
for (var i:int = 0; i < speedMax; i++)
{
        TweenMax.to(spd_mc, 4, { delay:i * 4, shortRotation: { rotation:speedCoords[i] }} );
}


Цитата:

Сообщение от carrotoff (Сообщение 1024698)
Сам удивился, открыв соседний топик.

Прошу, прощения за дежавю(кто знает - поймет) писал вчера с аккаунта друга, так как только зарегистрировался и можератор сказал, что тема будет опубликована только завтра, вот и пришлось писать тоже самое с чужого аккаунта.
Я все сделал, но подскажите, у меня что-то не то получается, анимация какая-то "рваная" что ли :(
Я архив прикрепил к сообщению, посмотрите кто-нибудь пожалуйста, что не так
Вложение 26951

fish_r 23.08.2011 11:35

Ага, вам "помоги", чтобы вы, потом, свой сарказм оттачивали?

Цитата:

Сообщение от DarkKnight2009 (Сообщение 1024631)
Спасибо большое, но мне нужен именно твинмакс :(

сглаживание делайте визуальных объектов... тогда будет плавно.

DarkKnight2009 23.08.2011 11:37

Цитата:

Сообщение от fish_r (Сообщение 1024706)
Ага, вам "помоги", чтобы вы, потом, свой сарказм оттачивали?

сглаживание делайте визуальных объектов... тогда будет плавно.

Я кого-то обидел, тем что написал?
Если да, то прошу прощения!

silin 23.08.2011 11:43

рваная она из-за того, что в каждом ENTER_FRAME ты запускаешь эти твины по новой, они путаются с уже запущенными..
вот сравни
Код AS3:

//addEventListener(Event.ENTER_FRAME, onLoop, false, 0, true);
//function onLoop(event:Event):void
//{
        for(var i:int = 0; i < speedMax; i ++)
        {               
                TweenMax.to(spd_mc, 1, {delay:i * 1.5, shortRotation:{rotation:speedCoords[i]}, ease:Linear.easeNone});
        }
 
//}


DarkKnight2009 23.08.2011 11:49

Цитата:

Сообщение от silin (Сообщение 1024708)
рваная она из-за того, что в каждом ENTER_FRAME ты запускаешь эти твины по новой, они путаются с уже запущенными..
вот сравни
Код AS3:

//addEventListener(Event.ENTER_FRAME, onLoop, false, 0, true);
//function onLoop(event:Event):void
//{
        for(var i:int = 0; i < speedMax; i ++)
        {               
                TweenMax.to(spd_mc, 1, {delay:i * 1.5, shortRotation:{rotation:speedCoords[i]}, ease:Linear.easeNone});
        }
 
//}


Спасибо огромное!
А если мне нужно будет сделать эффект переключения скорости, сбрасывание срелки на пару градусов назад, то это мне нужно после каждой выполненной функции добавлять ф-ю, которая будет сбрасывать стрелку? То есть, если не ошибаюсь у твинмакса есть CurrentStep, правильно?

silin 23.08.2011 12:11

а если нужно будет сделать всякое там еще, то нужно прикидывать когда и что запустить через delay или addCallback на окончание чего-то, обычная логика в-общем

>>если не ошибаюсь у твинмакса есть CurrentStep, правильно?
да много там чего есть навскидку, но вот не пользовался TweenMax'ом до сих пор, сейчас глянул и понял, что не буду, видимо, и впредь
а буду EazeTween'ом, рационально в нем все как-то и интуитивно понятно, плюс fluent interface c дружественным FD автокомплитом, вместо невнятных объектов

GBee 23.08.2011 12:13

Цитата:

TweenMax не поддерживает возможности 'нанизать' твины в цепочку,
как вариант можно их через delay запустить
А TimelineMax для чего тогда?

silin 23.08.2011 12:22

упс, виноват: неверно сказал, если иметь ввиду весь пакет
я искал в самом TweenMax и проглядел, что есть для этого специальный класс

DarkKnight2009 23.08.2011 12:30

У меня почему то стрелка на последней анимации падает назад на градусов так 180, почему так? :(
Код AS3:

var speedCoords:Array = [195, 235, 310, 335];
var speedMax:int = speedCoords.length;
var transmission:int = 0;
 
for(var i:int = 0; i < speedMax; i ++)
{               
        TweenMax.to(spd_mc, 1, {delay:i * 1.5, shortRotation:{rotation:speedCoords[i]}, ease:Linear.easeNone, onComplete: speedComplete});                       
}
 
function speedComplete():void
{
        TweenMax.to(spd_mc, 2, {shortRotation:{rotation:185}, ease:Linear.easeNone});
}


silin 23.08.2011 12:49

>>почему так?
по завершении каждого из твинов, запущенных в цикле вызывается запуск еще одного (того что в speedComplete), что при этом происходит предлагаю додумать самому..


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

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