Форум 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=171855)

bov 25.11.2011 21:39

Как повторить в цикле анимацию по таймеру?
 
Подскажите?

Есть код:

Код AS3:

var animateTimer:Timer = new Timer(10,50);
 
var redDot:RedDot = new RedDot();
redDot.x = Math.random()*stage.stageWidth;
redDot.y = Math.random()*stage.stageHeight;
addChild(redDot);
 
var slopeX = Math.random()*10-5;
var slopeY = Math.random()*10-5;
 
animateTimer.addEventListener(TimerEvent.TIMER, moveDot);
 
function moveDot(e:TimerEvent): void {
        redDot.x += slopeX;
        redDot.y += slopeY;
}
animateTimer.start();

Экземпляр шарика движется из случайной точки, в случайном направлении. 50 шагов через 10 мс.

В идеале нужно, чтобы он из этой точки пробежал в том направлении например 10 раз.

DaFive 25.11.2011 23:35

Ну естественно вы в цикле одному таймеру 10 раз сказали стартовать и выполинть движение для последнего экземпляра реддот. Заведите таймер и по событию в нем циклом перебирайте созданные реддоты и двигайте куда надо.

bov 26.11.2011 08:29

Ну вот. Здесь 1 шарик 10 раз начинает бежать из случайной точки по 10 шагов в каждом забеге.

Но, я то о том, что он бегает, понимаю только из trace.

Как задать время одного шага в цикле?

Код AS3:

var animateTimer:Timer = new Timer(1000,10);
 
var redDot:RedDot = new RedDot();
addChild(redDot);
 
animateTimer.addEventListener(TimerEvent.TIMER, moveDot);
 
animateTimer.start();
 
function moveDot(e:TimerEvent): void {
redDot.x = Math.random()*stage.stageWidth;
redDot.y = Math.random()*stage.stageHeight;
var slopeX = Math.random()*10-5;
var slopeY = Math.random()*10-5;
        for (var i:Number=0; i<10; i++) {
                redDot.x += slopeX;
                redDot.y += slopeY;
                trace(animateTimer.currentCount);
                trace(redDot.x);
        }
 
}


ProxyGreen 26.11.2011 16:44

Как уже DaFive сказал, у вас один шарик, координаты которого вы десять раз изменяете в цикле.

bov 26.11.2011 18:31

Вопрос изначально такой:
как этот экземпляр шарика, не просто с помощью таймера сдвинуть из х1,у1 на расстояние slopeX, slopeY 10 раз с интервалом шага в 1000 миллисек (var animateTimer:Timer = new Timer(1000,10));, т.е. из начальной точки А в конечную точку В

а это все повторить еще несколько раз. т.е. А-В, А-В, А-В, ..., А-В
?

Добавлено через 3 часа 26 минут
Вот, что хотелось:
Код AS3:

 
var animateTimer:Timer = new Timer(50,100);
 
var redDot:RedDot = new RedDot();
redDot.x = Math.random()*stage.stageWidth;
redDot.y = Math.random()*stage.stageHeight;
var slopeX = Math.round(Math.random()*20-10);
var slopeY = Math.round(Math.random()*20-10);
addChild(redDot);
 
animateTimer.addEventListener(TimerEvent.TIMER, moveDot);
 
animateTimer.start();
 
function moveDot(e:TimerEvent): void {
        if ((animateTimer.currentCount)%10 !=0) {
                        redDot.x += slopeX;
                        redDot.y += slopeY;
        } else {
                trace(animateTimer.currentCount);
                redDot.x -= slopeX*9;
                redDot.y -= slopeY*9;
                trace(redDot.x);
        }       
}

Можно ли это сделать, как-то используя new Timer(50,10)
и цикл for(var i=:Number; i<10; i++)

Спасибо.

ProxyGreen 26.11.2011 23:28

Хммм... что-то я не вижу в этом всём логики, но существует событие TimerEvent.TIMER_COMPLETE. Установите свой таймер на десять итераций (или сколько вам надо):
Код AS3:

var timerRep:int=10;
var animateTimer:Timer = new Timer(1000, timerRep);

Подпишите на события, по TimerEvent.TIMER изменяйте координаты, а по TimerEvent.TIMER_COMPLETE возвращайте объект на исходную позицию, (которую следует предварительно сохранить в переменной естественно) и перезапускайте таймер:
Код AS3:

var pointA:Point=new Point(); 
 
var redDot:RedDot = new RedDot();
 
redDot.x = pointA.x=Math.random()*stage.stageWidth;
redDot.y = pointA.y= Math.random()*stage.stageHeight;
 
animateTimer.addEventListener(TimerEvent.TIMER, timerListener);
animateTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteListener);
animateTimer.start();

Код AS3:

private function timerListener(e:TimerEvent):void{
  redDot.x += slopeX;
  redDot.y += slopeY;
}
 
private function timerCompleteListener(e:TimerEvent):void{
  redDot.x = pointA.x;
  redDot.y = pointA.y;
  animateTimer.start();
}

Цикл понадобился бы здесь для того что-бы обойти массив с несколькими такими объектами, но у вас один. Перемещение имхо луче определять в полярном виде, а потом уже вычислять сдвиги по декартовым координатам.

imena 27.11.2011 00:22

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

В общем, то что показал ProxyGreen и есть правильно.

bov 27.11.2011 06:53

ProxyGreen: Спасибо.

Но вопрос был такой: как 10 раз вернуть объект в начальную точку, кстати, добавил reset
Код AS3:

function timerCompleteListener(e:TimerEvent):void{
  redDot.x = pointA.x;
  redDot.y = pointA.y;
  animateTimer.reset();
  animateTimer.start();
}

Вот, чтобы 10 раз запустить timerCompleteListener, можно ли использовать цикл for.? Как я понимаю этого сделать нельзя? Поэтому только через проверку условия (какой-нибудь еще переменной<timerRep)?
вроде того
Код AS3:

var schetchik:int=0;
 
function timerCompleteListener(e:TimerEvent):void{
        if (schetchik<timerRep) {
                schetchik++; 
                redDot.x = pointA.x;
                redDot.y = pointA.y;
                animateTimer.reset();
                animateTimer.start();
        }
}

Добавлено через 35 секунд

imena: Спасибо


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

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