论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Flash AS教程
Tag:2.0,3.0菜鸟,游戏,,cs,技巧,源码,,文本,文字,函数,音乐,随机,拖拽,asp,access,xml,mc,视频教程

Flash as中有关IntervalManager, setInterval 扩展的的介绍

文章类别:Flash AS | 发表日期:2009-8-2 16:09:08

Flash as中有关IntervalManager, setInterval 扩展的的介绍


以下是我在学习Flash as中整理出来的关于IntervalManager, setInterval 扩展的介绍以及用法。

另见 IntervalCaster

如何使用
// 首先准备一下 array 的 prototype
Array.prototype.remove = function(index) {
 if (index == 0){
  this.shift();
 } else if (index == (this.length - 1)){
  this.pop();
 } else if (index > 0 && index < (this.length - 1) ){
  this.splice(index, 1);
 }
}
_global.ASSetPropFlags(Array.prototype, "remove", 1, 0);
// 导入包
import MirageSystem.utils.IntervalManager;
function test1 (arg1, arg2) {
 trace("scope : " + this);
 trace("arguments.length : " + arguments.length);
 for (var i in arguments) {
  trace("arg[" + i + "] : " + arguments[i]);
 }
}
// test2 是带返回值的例子
var test2ReturnValue:String;
function test2 () {
 trace("我是 test2");
 return "这里是 test2";
}
// test3 会被无限持续调用, 看看 test2ReturnValue 的改变吧
function test3 () {
 trace("我是 test3, test2ReturnValue 的结果是 : " + test2ReturnValue);
}
function test4 () {
 trace("我是 test4, 现在暂停 test3");
 intervalMgr3.pause();
}
function test5 () {
 trace("我是 test5, 恢复 test3");
 intervalMgr3.start();
}
function test6 () {
 trace("我是 test6, 释放所有 interval");
 IntervalManager.cleanUp();
}
function intervalMgr1_invoke (e:Object) {
 trace("intervalMgr1.currentCount : " + e.currentCount);
}
function intervalMgr1_stop (e:Object) {
 trace("intervalMgr1 已停止");
}
// 设置一个 interval, 第 1 个例子还包括了如何设置侦听器
var intervalMgr1:IntervalManager = IntervalManager.run(test1, 1000, ["arg1", "arg2"], true, 3, this);
intervalMgr1.addEventListener(IntervalManager.INVOKE, intervalMgr1_invoke);
intervalMgr1.addEventListener(IntervalManager.STOP, intervalMgr1_stop);
var intervalMgr2:IntervalManager = IntervalManager.run(test2, 1500, null, false, 1, this, [this, "test2ReturnValue"]);
var intervalMgr3:IntervalManager = IntervalManager.run(test3, 100);
var intervalMgr4:IntervalManager = IntervalManager.run(test4, 800, null, null, 1);
var intervalMgr5:IntervalManager = IntervalManager.run(test5, 1300, null, null, 1);
var intervalMgr6:IntervalManager = IntervalManager.run(test6, 5000);
 提示:您可以先修改部分代码再运行
下面是我的运行结果
scope : _level0
arguments.length : 2
arg[1] : arg2
arg[0] : arg1
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test4, 现在暂停 test3
intervalMgr1.currentCount : 2
scope : _level0
arguments.length : 2
arg[1] : arg2
arg[0] : arg1
我是 test5, 恢复 test3
我是 test3, test2ReturnValue 的结果是 : undefined
我是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
intervalMgr1.currentCount : 3
scope : _level0
arguments.length : 2
arg[1] : arg2
arg[0] : arg1
intervalMgr1 已停止
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test3, test2ReturnValue 的结果是 : 这里是 test2
我是 test6, 释放所有 interval
 提示:您可以先修改部分代码再运行
IntervalManager.as
/**
 * IntervalManager, 提供一组管理 interval 的功能
 * 
 * @author kakera
 * @version 1.0
 */
class MirageSystem.utils.IntervalManager extends MirageSystem.core.EventObject
{
 //
 // 一些状态常量
 //
 
 public static var RUNNING:Number = 0;
 public static var STOPPED:Number = 1;
 public static var PAUSED:Number = 2;
 
 
 //
 // interval 被 invoke 的事件
 //
 public static var INVOKE:String = "invoke";
 public static var STOP:String = "stop";
 
 //
 // 存放所有 intervals
 //
 private static var intervals:Array = new Array();
 
 
 //
 // 用于保存变量, 这里为了优化输出 swf 的体积没有做相应的 getter / setter
 //
 
 public var id:Number;
 public var func:Function;
 public var interval:Number;
 public var totalCount:Number;
 public var scope:Object;
 public var args:Array;
 public var delay:Boolean;
 public var returnVar:String;
 public var returnScope:Object;
 public var hasReturnValue:Boolean;
 public var state:Number;
 public var intervalId:Number;
 public var currentCount:Number;
 
 /**
  * 设置一个新的 IntervalManager, 返回 IntervalManager 实例
  * 
  * @usage 
  * @param func 要执行的函数
  * @param interval 每次执行间隔
  * @param args 可选, 传递的参数
  * @param delay 可选, 确定首次执行的时间, 0 或者 interval 的时间
  * @param count 可选, 运行的间隔
  * @param scope 可选, 修改函数的执行范围, 起到 Delegate 的作用
  * @param returnValue 可选, 指定存放返回值的变量, 该数组的第 1 个元素是变量的范围, 第 2 个元素是变量的名称 (字符串表示)
  * @return 
  */
 public static function run (func:Function, interval:Number, args:Array, delay:Boolean, count:Number, scope:Object, returnValue:Array):IntervalManager {
  var intervalMgr = new IntervalManager(func, interval, args, delay, count, scope, returnValue, intervals.length);
  intervals.push(intervalMgr);
  return intervalMgr;
 }
 
 
 /**
  * 释放所有的 interval
  * 
  * @usage 
  * @return 
  */
 public static function cleanUp ():Void {
  for (var i in intervals)
   intervals[i].release();
 }
 
 
 
 private function IntervalManager (func:Function, interval:Number, args:Array, delay:Boolean, count:Number, scope:Object, returnValue:Array, id:Number) {
  
  //
  // 错误检查, 如果觉得多余可以注释掉. 减少文件尺寸
  //
  
  if (id == undefined)
   throw new Error("参数 id 不能为空");
   
   
  //
  // 根据 returnValue 参数确定该函数是否有返回值
  //
  
  if (returnValue instanceof Array) {
   if (returnValue.length != 2) {
    throw new Error("参数 returnValue 只能是长度为 2 的数组");
   }
   hasReturnValue = true;
  } else {
   hasReturnValue = false;
  }
   
  this.func = func;
  this.interval = interval;
  this.args = args;
  this.delay = delay;
  this.totalCount = count == undefined ? Infinity : count;
  this.currentCount = 0;
  this.scope = scope;
  this.id = id;
  this.returnScope = returnValue[0]
  this.returnVar = returnValue[1];
  
  start();
 }
 
 
 /**
  * 开始 interval
  * 
  * @usage 
  * @return 
  */
 public function start ():Void {
  
  if (state != PAUSED) {
   
   //
   // 确定首次执行时间
   //
   
   if (delay)
    invoke(func);
   
   intervalId = setInterval(this, "invoke", interval, func);
  
  }
  setState(RUNNING);
  
 }
 /**
  * 停止 Interval, 或者可以通过使用 release 来释放 IntervalManager 实例
  * 
  * @usage 
  * @return 
  */
 public function stop ():Void {
  //trace("stop()");
  
  //
  // 重置 currentCount 计数并清除 interval
  //
  
  dispatchEvent( {type : STOP, currentCount : currentCount, totalCount : totalCount} );
  currentCount = 0;
  clearInterval(intervalId);
  intervalId = 0;
  setState(STOPPED);
 }
 
 
 
 /**
  * 暂停 interval, 如果已经在暂停中则会恢复 interval
  * 
  * @usage 
  * @return 
  */
 public function pause ():Void {
  if (state != PAUSED) {
   setState(PAUSED);
  } else {
   this.start();
  }
 }
 
 
 
 /**
  * 提供释放 IntervalManager 的功能, 虽然我不知道这么干到底有没有用 -_-,
  * 如果你觉得不需要可以改掉
  * 
  * @usage 
  * @return 
  */
 public function release ():Void {
  //trace("release()");
  
  //
  // 直接使用 stop() 是调用不到的 -0-
  //
  
  this.stop();
  
  
  //
  // 移除数组中关联的 IntervalManager 实例
  //
  
  intervals.remove(id);
  
  //
  // 如果上面的句子报错, 请注释掉上面的, 并取消注释下面这句
  // intervals["remove"](id);
  //
  // 或者你可以通过为 Array 类增加一个方法 remove 来解决此问题
  //
  
  
  for (var i in this)
   delete this[i];
   
 }
 
 
 
 /**
  * 设置当前状态
  * 
  * @usage 
  * @param state 
  * @return 
  */
 private function setState (state:Number):Void {
  this.state = state;
 }
 
 
 
 /**
  * 调用方法的方法
  * 
  * @usage 
  * @param method 要调用的方法的引用
  * @return 
  */
 private function invoke (method:Function):Void {
  
  //
  // 判断 count 是否继续循环, 否则释放循环
  //
  
  if (totalCount > currentCount) {
   
   //
   // 如果当前状态是暂停中就跳过
   //
   
   if (state != PAUSED) {
     currentCount++;
    
    //
    // 广播 INVOKE 事件, 返回当前执行了的次数和总次数
    //
    
    dispatchEvent( {type : INVOKE, currentCount : currentCount, totalCount : totalCount} );
    
    
    //
    // 判断是否有是有返回值的调用
    //
    
    if (hasReturnValue) {
     returnScope[returnVar] = method.apply(scope, args);
    } else {
     method.apply(scope, args);
    }
   }
   
   if (totalCount <= currentCount) {
    release();
   }
   
  } else {
   release();
  }
 }
 
}
 提示:您可以先修改部分代码再运行
EventObject.as
/**
 * EventObject
 * 
 * @author kakera
 * @version 1.0
 */
class MirageSystem.core.EventObject
{
 private var dispatchEvent:Function;
 public var addEventListener:Function;
 public var removeEventListener:Function;
 
 private static var __MIX_IN__ = MirageSystem.event.EventDispatcher.initialize(EventObject.prototype);
 public function EventObject () {
 }
}
 提示:您可以先修改部分代码再运行
EventDispatcher.as
就是 mx.event.EventDispatcher -_-

主要功能是
增加了停止, 暂停 interval 功能
增加了删除所有 interval 的方法
在每次触发 interval 的时候广播事件跟踪, 更高的可扩展性
解决了函数返回值出路的问题 -0-
视频教程列表
文章教程搜索
 
Flash AS推荐教程
Flash AS热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058