Четверг, 03.07.2025, 05:41
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Call.as
defaultNickДата: Пятница, 29.05.2020, 01:36 | Сообщение # 1
Генерал-майор
Группа: Администраторы
Сообщений: 311
Репутация: 0
Статус: Offline
package simplify {

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

/**
* Задержанные вызовы
*
* Call.nextFrame(redraw, arg1, arg2);
* private function redraw(arg1, arg2):void{
* //Этот метод будет вызван в следующем кадре и только один раз
* }
*
* Call.after(1000, onNextSecond); //Метод onNextSecond будет вызван через одну секунду
* Call.forget(onNextSecond); //А теперь не будет вызван
*
* @author rzer & reraider
* @version 1.0
*/

public class Call extends Sprite{

private static var dispatcher:Call = new Call();
private static var calls:Dictionary = new Dictionary();
private static var afterCalls:Array = [];

private static var currentTime:uint = 0;
private static var forgetHandler:Function;


public function Call():void {
this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}

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

var makeCalls:Dictionary = calls;
calls = new Dictionary();

for (var func:* in makeCalls) {
var handler:Function = func as Function;
handler.apply(null, makeCalls[func]);
}

currentTime = getTimer();


var makeAfterCalls:Array = afterCalls.concat();

for (var i:int = 0; i < makeAfterCalls.length; i++) {

var call:AfterCaller = makeAfterCalls[i];

if (call.time <= currentTime) {
call.handler.apply(null, call.args);
}

}

afterCalls = afterCalls.filter(afterCheck);

}

public static function nextFrame(handler:Function, ...args:Array):void {
calls[handler] = args;
}

public static function after(time:uint, handler:Function, ...args):void {
afterCalls.push(new AfterCaller(getTimer()+time, handler, args))
}

private static function afterCheck(call:AfterCaller, index:int, afterCalls:Array):Boolean {

if (call.time <= currentTime) {
return false;
}

return true;

}


public static function forget(handler:Function):void {
delete calls[handler];

forgetHandler = handler;

afterCalls = afterCalls.filter(afterForget);
forgetHandler = null;
}

private static function afterForget(call:AfterCaller, index:int, afterCalls:Array):Boolean {
return !(call.handler == forgetHandler);
}
}

}

internal class AfterCaller extends Object {

public var time:uint;
public var handler:Function;
public var args:Array;

public function AfterCaller(time:uint, handler:Function, args:Array):void {

this.args = args;
this.handler = handler;
this.time = time;

}

}
 
  • Страница 1 из 1
  • 1
Поиск:

Хостинг от uCoz | Sitemap | Sitemap-Forum