PDA

Просмотр полной версии : Пауза выполнения кода


firuz
12.03.2010, 17:03
Собствено сабж.
Форум почитал, поиском попользовался. Кое-что нашел. Но для себя решения так и не нашел. Опыта маловато. Однако нужно решить задачу


function play_m5(e:Event):void {
kulisi.play();
gotoAndPlay("go_m5");
}


Эта функция работает. Все хорошо.

Но внутри функции мне надо осуществить задержку выполнения кода. Между kulisi.play(); и gotoAndPlay("go_m5");. Хочу сделать задержку 2 секунды.
Понимаю что во Флеше этим почти никто не пользуется. Но у меня уж такая задача. Иначе мне сейчас никак. Помогите, плиз

Добавлено через 1 минуту
Про таймеры начитался, но как ими нормально воспользоваться, пока не разобрался.

Rzer
12.03.2010, 17:17
package ru.atflash.utils {

import flash.display.Sprite;
import flash.events.Event;
import flash.utils.getTimer;

/**
* Реализует задерженные вызовы
* @author rzer
* @version 1.0
*/
public class AtDelayedCalls
{

private static var timeCalls:Array = [];

private static var eventflow:Sprite;

/**
* Откладывает вызов функции, на некоторое время.
*
* @param func Function Функция, вызов которой откладывается
* @param args Array Аргументы функции
* @param after uint Задержка перед вызовом (при значении 0 - через один кадр)
* @param alwaysAdd Boolean Добавление происходит, даже если такая функция уже в стеке
* @param resetTimer Boolean Обнуляется ли таймер после добавления
*/
public static function doLater(func:Function, args:Array = null, after:uint = 0, alwaysAdd:Boolean = false, resetTimer:Boolean = false):void {

if (!eventflow) {
eventflow = new Sprite();
eventflow.addEventListener(Event.ENTER_FRAME, onFrame);
}

var index:int = timeCalls.indexOf(func);
var dTime:uint = after + getTimer();

if (alwaysAdd || index == -1){
timeCalls.push(func, args, dTime);
}else {
if (resetTimer) {
if (index != -1) {
timeCalls[index + 2] = dTime;
}
}
}

}

public static function forget(func:Function, deleteAll:Boolean = false):void {

var aFunc:Function;

for (var i:int = timeCalls.length - 1; i > 0; i = i - 3) {

aFunc = timeCalls[i - 2];

if (aFunc == func) {

timeCalls.splice(i - 2, 3);

if (!deleteAll) {
return;
}

}
}
}


private static function onFrame(e:Event):void {

var args:Array;
var func:Function;
var after:uint;
var time:uint;

time = getTimer();

for (var i:int = timeCalls.length - 1; i > 0; i = i - 3) {

after = timeCalls[i];
args = timeCalls[i - 1];
func = timeCalls[i - 2];

if (after < time) {
timeCalls.splice(i - 2, 3);
func.apply(null,args);
}

}

}


}

}

Используй AtDelayedCalls.doLater(gotoAndPlay,["go_m5"], 2000);

firuz
12.03.2010, 17:22
ого.. все так сложнно?

из этого мне мало понятно как осуществить.. но спасибо

Rzer
12.03.2010, 17:35
Это вспомогательный класс, тебе его надо положить в корень твоего проекта в папку ru/atflash/utils/, назвав AtDelayedCalls.as и забыть о том, что он там лежит.

Там где надо, делаешь нужный импорт:
import ru.atflash.utils.AtDelayedCalls;
И делаешь задержку одной строчкой:
AtDelayedCalls.doLater(gotoAndPlay,["go_m5"], 2000);

firuz
12.03.2010, 17:44
так. Я правильно понял? В папке где лежит project.fla нужно разместить файл следующего вложения:
.../ru/atflash/utils

или где-то в самом корне Adobe?

Rzer
12.03.2010, 17:46
Всё правильно (где лежит project.fla)

firuz
12.03.2010, 17:49
А для этого обязательно содавать именно проект во флеше?
Или имея только fla-файл сделать в его папке нужно вложение и все заработает.
Ну сейчас попробую

Добавлено через 42 секунды
обоже! как криво написал..

Rzer
12.03.2010, 17:52
Файл текстовый AtDelayedCalls.as. Относительно project.fla он лежит в папке ru/atflash/utils/

firuz
12.03.2010, 17:54
Сказочно!! Все работает! Ура! Спасибо