事件系统

Next2D Player 使用与 W3C DOM 事件模型类似的三阶段事件流机制。

EventDispatcher

所有具有事件功能的对象的基类。

addEventListener(type, listener, useCapture, priority)

注册事件侦听器。

const { PointerEvent } = next2d.events;

displayObject.addEventListener(PointerEvent.POINTER_DOWN, (event) => {
    console.log("指针被按下");
});

// 在捕获阶段接收
displayObject.addEventListener(PointerEvent.POINTER_DOWN, handler, true);

// 指定优先级
displayObject.addEventListener(PointerEvent.POINTER_DOWN, handler, false, 10);

removeEventListener(type, listener, useCapture)

移除事件侦听器。

displayObject.removeEventListener(PointerEvent.POINTER_DOWN, handler);

removeAllEventListener(type, useCapture)

移除特定类型的所有事件侦听器。

displayObject.removeAllEventListener(PointerEvent.POINTER_DOWN);

hasEventListener(type)

检查是否注册了指定类型的侦听器。

if (displayObject.hasEventListener(PointerEvent.POINTER_DOWN)) {
    console.log("已注册指针按下侦听器");
}

willTrigger(type)

检查此对象或祖先是否具有该事件类型的侦听器。

if (displayObject.willTrigger(PointerEvent.POINTER_DOWN)) {
    console.log("此对象或祖先有侦听器");
}

dispatchEvent(event)

派发事件。

const { Event } = next2d.events;

const event = new Event("customEvent");
displayObject.dispatchEvent(event);

Event 类

属性

属性类型说明
typeString事件类型
targetObject事件源
currentTargetObject当前侦听器目标
eventPhaseNumber事件阶段
bubblesBoolean是否冒泡

方法

方法说明
stopPropagation()停止传播
stopImmediatePropagation()立即停止传播

标准事件类型

显示列表相关

事件说明
added添加到 DisplayObjectContainer
addedToStage添加到舞台
removed从 DisplayObjectContainer 移除
removedFromStage从舞台移除
sprite.addEventListener("addedToStage", (event) => {
    console.log("添加到舞台");
});

时间轴相关

事件说明
enterFrame每帧发生
frameConstructed帧构建完成
exitFrame离开帧时
movieClip.addEventListener("enterFrame", (event) => {
    // 每帧执行的处理
    updatePosition();
});

加载相关

事件说明
complete加载完成
progress加载进度
ioErrorIO 错误
httpStatusHTTP 状态接收
const { Loader } = next2d.display;
const { URLRequest } = next2d.net;

const loader = new Loader();

// 使用 async/await 加载
await loader.load(new URLRequest("animation.json"));
const content = loader.content;
stage.addChild(content);

// 使用进度事件
loader.contentLoaderInfo.addEventListener("progress", (event) => {
    const percent = (event.bytesLoaded / event.bytesTotal) * 100;
    console.log(`${percent}% 已加载`);
});

指针事件

PointerEvent 统一处理指针设备的操作(鼠标、笔、触摸)。

事件常量说明
pointerDownPointerEvent.POINTER_DOWN按钮按下开始
pointerUpPointerEvent.POINTER_UP按钮释放
pointerMovePointerEvent.POINTER_MOVE指针坐标变化
pointerOverPointerEvent.POINTER_OVER指针进入命中测试边界
pointerOutPointerEvent.POINTER_OUT指针离开命中测试边界
pointerLeavePointerEvent.POINTER_LEAVE指针离开元素区域
pointerCancelPointerEvent.POINTER_CANCEL指针交互被取消
doubleClickPointerEvent.DOUBLE_CLICK双击/双触发生
const { PointerEvent } = next2d.events;

sprite.addEventListener(PointerEvent.POINTER_DOWN, (event) => {
    console.log("指针按下:", event.localX, event.localY);
});

sprite.addEventListener(PointerEvent.POINTER_MOVE, (event) => {
    console.log("指针移动:", event.stageX, event.stageY);
});

sprite.addEventListener(PointerEvent.DOUBLE_CLICK, (event) => {
    console.log("双击");
});

键盘事件

事件常量说明
keyDownKeyboardEvent.KEY_DOWN按键按下
keyUpKeyboardEvent.KEY_UP按键释放
const { KeyboardEvent } = next2d.events;

stage.addEventListener(KeyboardEvent.KEY_DOWN, (event) => {
    console.log("键码:", event.keyCode);

    switch (event.keyCode) {
        case 37: // 左箭头
            player.x -= 10;
            break;
        case 39: // 右箭头
            player.x += 10;
            break;
    }
});

焦点事件

事件常量说明
focusInFocusEvent.FOCUS_IN元素获得焦点
focusOutFocusEvent.FOCUS_OUT元素失去焦点
const { FocusEvent } = next2d.events;

textField.addEventListener(FocusEvent.FOCUS_IN, (event) => {
    console.log("获得焦点");
});

滚轮事件

事件常量说明
wheelWheelEvent.WHEEL鼠标滚轮旋转
const { WheelEvent } = next2d.events;

stage.addEventListener(WheelEvent.WHEEL, (event) => {
    console.log("滚轮旋转");
});

视频事件

事件常量说明
playVideoEvent.PLAY播放被请求
playingVideoEvent.PLAYING播放已开始
pauseVideoEvent.PAUSE已暂停
seekVideoEvent.SEEK跳转操作

作业事件

补间动画用的事件。

事件常量说明
updateJobEvent.UPDATE属性已更新
stopJobEvent.STOP作业已停止

自定义事件

const { Event } = next2d.events;

// 定义自定义事件
const customEvent = new Event("gameOver", true, true);

// 派发事件
gameManager.dispatchEvent(customEvent);

// 监听事件
gameManager.addEventListener("gameOver", (event) => {
    showGameOverScreen();
});

事件传播

事件分三个阶段传播:

  1. 捕获阶段:从根到目标(eventPhase = 1)
  2. 目标阶段:在目标处处理(eventPhase = 2)
  3. 冒泡阶段:从目标到根(eventPhase = 3)
const { PointerEvent } = next2d.events;

// 在捕获阶段处理
parent.addEventListener(PointerEvent.POINTER_DOWN, handler, true);

// 在冒泡阶段处理(默认)
child.addEventListener(PointerEvent.POINTER_DOWN, handler, false);

相关