

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
第一步:先搞懂自定义事件的核心逻辑——别再对着文档懵圈
其实自定义事件没你想的那么复杂,本质就是“发消息”:你得先写好消息内容(事件类),找个人把消息发出去(派发者,比如按钮),再找个人接收并回应(监听者,比如角色组件)。去年我朋友就是没搞清楚“谁发消息、谁收消息”,把监听绑到了角色上,结果按钮发的消息没人接,自然没反应。
先给你理清楚三个核心概念,用“发消息”打比方你就懂了:
怎么写一个能用的事件类?——别漏了clone方法!
写事件类的第一步,是继承Flash的Event
类(就像消息得有个“基础格式”),然后加你需要的自定义属性,最后必须重写clone
方法——这步最容易忘,我刚开始写的时候也栽过坑,结果事件触发后,处理函数里的参数全是undefined
。
比如你要做“角色移动”的事件,事件类得这么写(直接给你能复制的代码):
package com.events {
import flash.events.Event; // 引入基础事件类
public class CharacterMoveEvent extends Event {
//
定义事件类型(相当于消息的“主题”,必须唯一)
public static const MOVE:String = "characterMove";
//
加自定义属性(你要传递的数据,比如方向、距离)
public var direction:String; // 移动方向:left/right/up/down
public var distance:Number; // 移动距离:比如100像素
//
构造函数——初始化事件的“主题”和自定义数据
public function CharacterMoveEvent(
type:String, // 事件类型(就是上面的MOVE)
direction:String, // 自定义参数:方向
distance:Number, // 自定义参数:距离
bubbles:Boolean = false, // 要不要“冒泡”(后面讲,一般设false)
cancelable:Boolean = false // 能不能取消事件(一般设false)
) {
super(type, bubbles, cancelable); // 调用父类的构造函数
this.direction = direction; // 把参数存到事件对象里
this.distance = distance;
}
//
必须重写!——Flash会复制事件对象,没这个方法参数传不过去
override public function clone():Event {
return new CharacterMoveEvent(
type, direction, distance, bubbles, cancelable
);
}
}
}
每一步的作用我都标清楚了,你复制过去改改属性名就能用。记住:事件类型要用static const
,这样后面绑监听时不会拼错字符串——比如用CharacterMoveEvent.MOVE
比直接写"characterMove"
安全100倍,我朋友之前就是因为拼错字符串,查了半小时BUG。
第二步:监听和处理事件——别绑错对象、漏接参数
写好事件类,接下来要解决两个问题:怎么让派发者“发消息”?和怎么让监听者“收消息”?
第一步:让派发者把事件“发出去”——按钮点击后该做什么?
派发者就是触发事件的那个对象,比如按钮。点击按钮后,你得先创建事件实例(填好要传递的参数),然后用dispatchEvent
把事件“发出去”。
比如按钮的点击处理函数要这么写:
// 假设按钮的实例名是moveBtn
(在Flash舞台上拖的按钮)
private function onMoveBtnClick(e:MouseEvent):void {
//
创建事件实例——填好方向和距离(比如向右走100像素)
var moveEvent:CharacterMoveEvent = new CharacterMoveEvent(
CharacterMoveEvent.MOVE, // 事件类型(主题)
"right", // 自定义参数:方向
100 // 自定义参数:距离
);
//
派发事件——从按钮这个对象“发出去”
this.dispatchEvent(moveEvent);
trace("按钮把事件发出去啦!"); // 方便Debug,看有没有触发派发
}
注意:this.dispatchEvent
里的this
,指的是按钮本身——因为事件是从按钮这里发出去的,后面监听者得“盯着”按钮才能收到消息。
第二步:让监听者“收到”事件——别绑错对象!
监听者要做的事,是“盯着”派发者(按钮),一旦收到CharacterMoveEvent.MOVE
类型的事件,就执行处理函数。
比如角色组件的监听逻辑要这么写:
// 角色组件的初始化函数(比如场景加载完成后执行)
private function initCharacter():void {
//
找到派发者:按钮对象(假设按钮在舞台上的名字是moveBtn
)
var moveBtn:SimpleButton = this.parent.getChildByName("moveBtn") as SimpleButton;
//
绑定监听——“盯着”按钮,收MOVE
类型的事件
moveBtn.addEventListener(CharacterMoveEvent.MOVE, onCharacterMove);
trace("角色开始盯着按钮啦!");
}
//
事件处理函数——收到消息后做什么?
private function onCharacterMove(e:CharacterMoveEvent):void {
// 从事件对象里拿自定义参数(方向和距离)
trace("收到移动命令:向" + e.direction + "走" + e.distance + "像素");
// 执行移动逻辑——比如向右走就加x坐标
if (e.direction == "right") {
this.x += e.distance; // 角色的x坐标增加100,向右移动
} else if (e.direction == "left") {
this.x -= e.distance;
}
}
这里最容易犯的错,就是把监听绑错了对象——比如我朋友之前把监听绑到了角色自己身上,结果按钮发的消息没人收,角色当然不动。记住:监听要绑在“派发者”身上(按钮),而不是监听者(角色)!
第三步:最实用的Debug技巧——快速找出“事件没触发”的原因
就算你跟着步骤写,也可能遇到“事件没触发”的情况,我 了3个一分钟定位问题的技巧,帮你省时间:
trace
看事件有没有“发出去”和“收到”在派发函数和处理函数里加trace
,比如:
trace("要派发事件了:" + moveEvent.type)
; trace("收到事件:" + e.type)
。 如果派发时输出了,但处理函数没输出,说明监听绑错了对象;如果都没输出,说明派发者没触发(比如按钮没绑定点击事件)。
clone
方法有没有写对如果处理函数里的参数是undefined
,90%是没重写clone
方法——Flash在派发事件时,会复制事件对象,没clone
方法的话,复制出来的对象没有你的自定义属性。
我把去年帮朋友调BUG时遇到的问题,整理成了一个表格,你碰到问题直接对照着查:
常见问题 | 问题原因 | 解决方法 |
---|---|---|
点击按钮,角色没反应 | 监听绑错了对象(比如绑到了角色自己身上) | 把监听绑到“派发者”(按钮)身上 |
处理函数里的参数是undefined | 没重写clone方法,或处理函数参数类型错了 |
|
事件触发多次(角色一直动) | 重复绑定了监听(比如init函数执行了多次) | 绑定前先执行removeEventListener,比如:moveBtn.removeEventListener(…, onMove); 再绑定 |
最后:给新手的小提醒——别贪多,先把基础流程走通
我刚开始学自定义事件时,总想着加各种复杂功能,比如让事件“冒泡”(往上传递给父容器)、让事件可取消,结果反而把基础流程搞乱了。 你先把“简单版”走通:
等你把这些搞熟了,再去试“冒泡”“取消事件”这些高级功能——比如把bubbles
设为true
,这样父容器也能收到事件,但一般小游戏或互动内容用不到。
对了,如果你按照上面的步骤做了,还是遇到问题,欢迎在评论区告诉我具体情况——比如是trace
没输出,还是参数不对,我帮你一起想想办法。毕竟我也是从“对着代码挠头”过来的,特懂那种着急的感觉~
赶紧去试试吧,等你回来告诉我“角色终于动了”的好消息!
自定义事件类里为什么必须重写clone方法?
因为Flash在派发事件时,会复制一份事件对象传递给处理函数。如果没重写clone方法,复制出来的对象就没有你加的自定义属性(比如方向、距离),处理函数里的参数自然就变成undefined了。这步真的别忘,我刚开始写的时候就栽过坑,后来加上clone方法,参数就正常了。
监听自定义事件时,为什么绑在角色身上收不到按钮发的消息?
因为消息是按钮(派发者)发的,你得把监听绑在发消息的人身上啊!就像别人给你发微信,你得加对方好友才能收到消息。如果绑在角色(监听者)身上,相当于你盯着自己的微信,别人发的消息怎么会到你这?所以监听一定要绑在派发者(比如按钮)身上,这样才能收到它发的事件。
自定义事件没触发,怎么快速找出问题?
先试试这几个办法:首先在派发函数和处理函数里加trace,看有没有输出——如果派发时输出了但处理函数没输出,说明监听绑错对象了;如果都没输出,可能是派发者没触发(比如按钮没绑点击事件)。再检查事件类的clone方法有没有写对,要是没写或写错了,处理函数里的参数会是undefined。还有,看看监听是不是重复绑定了,比如init函数执行多次,导致事件触发多次。
自定义事件里的方向、距离参数怎么传到处理函数里?
首先得在事件类里加自定义属性,比如direction(方向)、distance(距离),然后在构造函数里把这些参数存到事件对象里。接着重写clone方法,把这些属性也复制进去——不然复制的事件对象没有这些数据。最后处理函数里,从事件对象(比如e)里直接拿就行,比如e.direction、e.distance,这样就能拿到你传递的参数了。
新手学自定义事件,先从什么步骤开始比较好?
新手别贪多,先把基础流程走通最关键。第一步写个简单的事件类,加几个自定义属性(比如方向、距离),重写clone方法;第二步让派发者(比如按钮)发事件,点击按钮时创建事件实例并dispatch;第三步让监听者(比如角色)把监听绑在派发者身上,处理函数里拿到参数执行简单逻辑(比如移动角色)。等这些搞熟了,再去试冒泡、取消事件这些高级功能,不然容易把基础搞乱。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com