PDA

Просмотр полной версии : Помогите разобратся с Timer()


wolhw
07.09.2011, 20:15
Хочу организовать контролированое ускорение спавна обьектов, делаю ето так:

private var timer_raund: Timer;
private var timer_secunda: Timer;
private var timer_faster: Timer;
private const MIN_del: int=300;
private const startDel: int=1100;
private var faster_delay: int=startDel;
private var tick_del: int=10;

// timer-----------------------------------------
public function ModelCore()
{
super();

timer_raund=new Timer(raundLen);
timer_raund.addEventListener(TimerEvent.TIMER,tick_raundEnd);
timer_secunda=new Timer(1000);
timer_secunda.addEventListener(TimerEvent.TIMER,tick_secunda);
timer_faster=new Timer(faster_delay);
timer_faster.addEventListener(TimerEvent.TIMER,tick_faster);
}

private function tick_secunda(event: TimerEvent): void
{
if(timer_faster.delay>MIN_del){
faster_delay-=tick_del;
timer_faster.delay=faster_delay;
}
// event.updateAfterEvent();
secunda();
}

private function tick_faster(e: TimerEvent): void
{
trace(e.target.delay);

spam();
// e.updateAfterEvent();
}

private function secunda(): void
{
secundomir--;
dispatchEvent(new Event(Model.SECUNDA));
}

private function tick_raundEnd(event: TimerEvent): void
{
timer_raund.stop();
timer_secunda.stop();
timer_faster.stop();
faster_delay=startDel;
secundomir=0;
dispatchEvent(new Event(Model.END_ROUND));
}

public function startRaund(): void
{
timer_faster.start();
timer_raund.start();
timer_secunda.start();

secundomir=raundLen/1000;

dispatchEvent(new Event(Model.START_ROUND));
}

проц загружен на 30%

1. почему когда startDel > 960(вычислил експрериментальным путем) спавн начинается с задержкой больше 5 сек?
2. delay трейсит что меняет но на самом деле ускорятся начинает только когда daley < 500 делая ето мгновенно, а мне нужно плавное ускорение.
И если можно както подругому без таймеров и фреймов реализовать ускорение подскажите как плиз:o

Wolsh
07.09.2011, 21:06
Уменьшать не время, а расстояние/угол, проходимые за один "шаг" (один "тик")?
Используйте готовые твины (Tweener, Greensock TweenLite/TweenMax) или напишите свой для конкретной задачи.

wolhw
07.09.2011, 21:17
уточню: нужно увеличение количества созданных обьектов в секунду.

function spam():void
{
obj=new MyObj();
addChild(obj);
}

Azo
07.09.2011, 22:20
Используйте greenshok.

Wolsh
07.09.2011, 23:15
нужно увеличение количестваНу ничего страшного. Создаете свойство с начальным значением количества, создаете твин, в котором указываете максимальное количество за шаг, время, за которое надо дойти до этого показателя, и функцию, управляющую графиком изменения. В обработчике на каждый шаг (onUpdate или как-то так у гринсока) запускаете цикл от ноля до текущего значения этого свойства (твин будет его менять), и в этом цикле на каждую итерацию создаете новый объект и добавляете в дисплей лист. Вот и управление количеством.

wolhw
07.09.2011, 23:25
спасибо попробую так, но все же почему таймеры неработают?

Добавлено через 34 минуты
если упростить мой код(ато оч много текста)----



var timer1:Timer;
var timer2:Timer;

function onTimer1(e:TimerEvent):void
{
timer2.delay-=10;
}

function onTimer2(e:TimerEvent):void
{
//похоже проблема в етом, свойство delay несоответствует реальному шагу("тику")????!!!!!
//


хих думалось клас Таймер ето основа и зеленыйНосок тоже на нем базируется, но видимо я ошибался, чтож буду ковырять библиотеку носка...

Wolsh
08.09.2011, 01:31
Ну вообщето при присвоении свойству delay нового значения во время работы таймера тот перезапускается. Тогда, скажем, он уже отсчитал 100 миллисекунд из 110, и тут другой таймер задал ему новое значение - 90. Первый таймер начинает считать 90 миллисекунд СНАЧАЛА, и значит реальный промежуток между событиями составит 100 + 90 = 190 миллисекунд.
В Вашем случае проще увеличивать кол-во итераций в цикле добавления новых объектов, тем более что, как я понял, Вам нужно обычное равноускоренное увеличение.. Можно просто спрашивать у таймера currentCount, умножать на 10 (к примеру) и создавать в цикле именно столько объектов - 10, 20, 30, 40...

Bgg
08.09.2011, 01:41
Плюс: Не рекомендуется задавать свойству delay значение меньше 20 миллисекунд. Частота объекта Timer ограничена 60 кадрами в секунду, то есть задержка меньше 16,6 миллисекунд вызывает проблемы во время выполнения. (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/utils/Timer.html#delay)

wolhw
08.09.2011, 02:57
Да, теперь все сложилось)), надо почаще в справку заглядывать хм.
Цыкл мне неподойдет обьекты мне нужно по одному бросать а не групой,
решение наверное ето event.delay (когда таймер сам себя перезапускает с новым значением делей ну и регулировать просто ето значение учитывая уже предыдущее ускорение)