11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 2513|回复: 6
上一主题 下一主题

[已解决悬赏] 怎么在enterframe事件里面添加自定义参数?

[复制链接] TA的其它主题
发表于 2019-5-8 15:10:03 | 显示全部楼层 |阅读模式
60银子
如题,怎么在enterframe事件里面添加自定义参数?
每次都要使用全局参数感觉不够灵活。
自行定义timer之类的事件感觉又不好用,没enterframe事件来的快
有没有什么办法重写或者自定义这个事件的参数啊?

最佳答案

查看完整内容

推荐做法是不使用addEventListener(ENTER_FRAME) 使用链表数据结构自行制作事件流处理机制 例子,下面省略了双向链表的add/remove实现。
发表于 2019-5-8 15:10:04 | 显示全部楼层
推荐做法是不使用addEventListener(ENTER_FRAME)
使用链表数据结构自行制作事件流处理机制

例子,下面省略了双向链表的add/remove实现。

  1. public class OEFManager{
  2.   public var dic:Dictionary = new Dictionary;
  3.   public var chain:双向链表
  4.   public function OEFManager(stage:Stage){
  5.     stage.addEventListener(Event.ENTER_FRAME, enterFrame);
  6.   }
  7.   public function enterFrame(e:Event):void{
  8.     if(chain.firstNode){
  9.       var ptr:节点 = chain.firstNode
  10.       while(ptr){
  11.         var saveNext:节点 = ptr.next//必须在此处保存,ptr.execute可能将ptr自身移除
  12.         ptr.execute();
  13.         ptr = saveNext;
  14.       }
  15.     }
  16.   }
  17.   public function add(func:Function, args:* = null):void{
  18.     if(!dic[func]){
  19.       var node:节点 = new 节点
  20.       node.callback = func;
  21.       node.callbackArgs = args;
  22.       chain.add(node);
  23.       dic[func] = node;
  24.     }
  25.   }
  26.   public function remove(func:Function):void{
  27.     var node:节点 = dic[func];
  28.     if(node){
  29.       node.remove();
  30.     }
  31.   }
  32. }
  33. public class 节点{
  34.   public var prev:节点
  35.   public var next:节点
  36.   public var callback:Function;
  37.   public var callbackArgs:*;
  38.   public function execute():void{
  39.     if(callback.length == 0){
  40.       callback();
  41.     }else{
  42.       callback(callbackArgs);
  43.     }
  44.   }
  45. }
复制代码
回复

使用道具 举报

发表于 2019-5-8 18:59:38 | 显示全部楼层
没看懂,你想做什么
回复

使用道具 举报

发表于 2019-5-8 23:32:37 | 显示全部楼层
本帖最后由 general_clarke 于 2019-5-8 23:40 编辑

然后是一个利用闭包实现的投机取巧做法。



  1. public function testFunc():void{
  2.   var args:String = "要传递的参数";
  3.   stage.addEventListener(Event.ENTER_FRAME, function callback(e:Event):void{
  4.         trace(args);
  5.     });

  6. }
复制代码


如果使用这个闭包写法,在removeEventListener解除对闭包引用之前,
闭包的父函数,也就是testFunc()内的局部变量不释放。
在较大项目或较长函数中慎用,可能导致内存问题
回复

使用道具 举报

发表于 2019-5-8 23:39:38 | 显示全部楼层
闭包实现第二种,比上一个安全。



  1. addEventListener(Event.ENTER_FRAME, function 壳(e:Event):void{
  2.   真正要回调的函数(e, "我是参数");
  3. })

  4. public function 真正要回调的函数(e:Event, args:*):void{
  5. }
复制代码



经常使用的话,比起每次想闭包写法还是应该编写管理器。

强烈推荐前面一种写管理器的写法,
一劳永逸,之后也容易进行扩展,比如“暂停所有ENTER_FRAME事件”、"ENTER_FRAME事件分组并根据功能排序"、"功耗统计"等
回复

使用道具 举报

 楼主| 发表于 2019-5-9 15:54:41 | 显示全部楼层
general_clarke 发表于 2019-5-8 23:39
闭包实现第二种,比上一个安全。

谢谢大哥,第二种的稍微能看懂,第一种略显复杂啊,要用字典什么的,我再仔细看看,感谢。
回复

使用道具 举报

 楼主| 发表于 2019-5-9 15:55:52 | 显示全部楼层
TKCB 发表于 2019-5-8 18:59
没看懂,你想做什么

就是enterFrame事件本身不是只有一个event参数吗?我想加一些自定义的参数用来做一些动画效果
可能是我描述不清楚,感谢T大回复
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表