第八课 事件系统与计时器

本文详细介绍了JavaScript前端开发中事件系统的使用,包括如何访问节点、节点属性的修改、计时器的实现(定时计时器、一次性计时器和关闭计时器)、场景切换,以及重点讲解了事件系统,特别是自定义事件的创建、监听和取消监听,还涉及了跨脚本监听事件的实现策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.如何访问别的节点

1.通过属性检查器设置节点来访问别的节点
2.通过代码子节点父节点的访问
①通过子节点名字访问
②通过子节点数组访问
const { ccclass, property } = cc._decorator;

@ccclass
export default class sp2 extends cc.Component {
    onLoad() {
        //sp2脚本挂载在cavans节点下
        //①通过子节点的名字访问子节点
        console.log("输出cavans节点下子节点background", this.node.getChildByName("background"));
        //②通过子节点数组访问子节点
        console.log("输出cavans节点下第0个子节点", this.node.children[0]);
        console.log("输出cavans节点下第1个子节点", this.node.children[1]);
        console.log("输出cavans节点下第2个子节点", this.node.children[2]);
        console.log("输出cavans节点下第3个子节点", this.node.children[3]);
    }
}
③通过属性访问父节点
④通过方法访问父节点
const { ccclass, property } = cc._decorator;

@ccclass
export default class sp2 extends cc.Component {
    onLoad() {    //sp2脚本挂载在cavans节点下
        //③通过属性访问父节点
        console.log("输出cavans节点的父节点cc.Scene", this.node.parent);
        //④通过方法访问父节点
        console.log("输出cavans节点的父节点cc.Scene", this.node.getParent());
    }
}
⑤通过场景节点树路径访问节点
const { ccclass, property } = cc._decorator;

@ccclass
export default class sp2 extends cc.Component {
    onLoad() {    //sp2脚本挂载在cavans节点下
        //通过节点树访问Cavans的子节点cocoslogo
        let cocoslogo = cc.find("Canvas/cocoslogo");
        console.log(cocoslogo);
    }
}
3.Cavans与Camera

①Cavans:用来做屏幕适配,建议所有UI节点及可渲染节点都放在Cavans节点下.

②:Camera:RPG游戏用于锁定主角视角

二.节点的常用属性与修改

1.节点常用属性

①Position→位置

②Rotation→旋转

③Scale→缩放

④Anchor→锚点

⑤Size→尺寸

⑥Color→颜色

⑦Opacity→不透明度

⑧Skew→倾斜度

⑨Group→组

2.节点常用属性修改

this:当前的脚本组件

this.node:当前脚本所绑定的节点

①直接修改属性值

②调用set方法

const { ccclass, property } = cc._decorator;

@ccclass
export default class sp2 extends cc.Component {
    onLoad() {    //sp2脚本挂载在cavans节点下
        console.log("cavans属性", this.node);
        //①直接修改属性值
        this.node.opacity = 100
        //②调用set方法修改属性值
        this.node.setScale(1.2,1.2);
    }
}

三.计时器

1.定时计时器

①局部函数方法

const { ccclass, property } = cc._decorator;

@ccclass
export default class sp2 extends cc.Component {
    onLoad() {    //sp2脚本挂载在cavans节点下
        //开启定时计时器 参数1:局部函数 参数2:时间
        this.schedule(
            function () {
                console.log("定时执行计时器");
            }
            , 5)
    }
}

②类的成员函数方法

const { ccclass, property } = cc._decorator;

@ccclass
export default class sp2 extends cc.Component {
    onLoad() {    //sp2脚本挂载在cavans节点下
        //开启定时计时器 参数1:成员函数 参数2:时间
        this.schedule(this.CallFun, 3)
    }
    CallFun(){
        console.log("成员函数方法执行计时器")
    }
}
2.执行一次的计时器
const { ccclass, property } = cc._decorator;

@ccclass
export default class sp2 extends cc.Component {
    onLoad() {    //sp2脚本挂载在cavans节点下
        //只执行一次的计时器 参数1:函数 参数2:时间
        this.scheduleOnce(
            function () {
                console.log("只执行一次的计时器");
            }
            , 3)
    }
}
3.关闭计时器

①关闭指定定时器

const { ccclass, property } = cc._decorator;

@ccclass
export default class sp2 extends cc.Component {
    onLoad() {    //sp2脚本挂载在cavans节点下
        //开启定时器
        this.schedule(this.CallFun, 3)
        this.scheduleOnce(function () {
            console.log("关闭计时器");
            //关闭计时器 参数1:callFun函数
            this.unschedule(this.CallFun);
        }.bind(this)
            , 8
        )
    }
    CallFun() {
        console.log("成员函数方法执行计时器")
    }
}

②关闭当前组件所有计时器

        //关闭当前组件所有定时器
        this.unscheduleAllCallbacks();

四.切换场景

cc.director.loadScene("场景名")

五.事件系统

鼠标事件

触摸事件

键盘事件

重力传感事件

自定义事件

六.自定义事件详解

全局事件分发器只有一个,把接受到的事件分发给不同的事件监听器,事件监听器调用回调函数进行处理.

1.创建事件监听
const { ccclass, property } = cc._decorator;

@ccclass
export default class sp2 extends cc.Component {
    start() {
        //创建事件监听器
        let ec=new cc.EventTarget();
        //事件监听 参数1:事件名 参数2:事件回调函数
        ec.on("Dead",function(p1,p2,p3,p4){
            console.log("监听到了Dead事件")
            console.log("参数1是",p1,"\n参数2是",p2,"\n参数3是",p3,"\n参数4是",p4)
        })
        //发送事件 参数1:事件名 参数2:后续参数是回调函数的参数
        ec.emit("Dead",1,2,3,"参数4");
    }
}
2.取消事件监听
//参数1:事件名
ec.off("Dead");
3.跨脚本监听事件

①创建全局事件监听管理类

//全局自定义事件发送接收管理类
//在scr文件夹下创建Mar文件夹
//在Mar文件夹下创建eventTargetMar.ts
export default class eventTargetMar {
    static ins: cc.EventTarget;
    static getInstance() {
        if (!this.ins) {
            //没有初始化 先进行初始化
            this.ins = new cc.EventTarget();
        }
        return this.ins;
    }
}

②sp2脚本进行监听事件

//引入eventTargetMar类
import eventTargetMar from "./Mar/eventTargetMar";
const { ccclass, property } = cc._decorator;

@ccclass
export default class sp2 extends cc.Component {
    start() {
        //获取全局自定义单实例类赋值成变量ecMar
        let ecMar=eventTargetMar.getInstance();
        //事件监听 参数1:事件名 参数2:事件回调函数
        ecMar.on("Dead",function(p1,p2,p3,p4){
            console.log("跨脚本成功监听到了Dead事件")
            console.log("参数1是",p1,"\n参数2是",p2,"\n参数3是",p3,"\n参数4是",p4)
        })
    }
}

③sp1脚本进行发送事件

import eventTargetMar from "./Mar/eventTargetMar";

const { ccclass, property } = cc._decorator;

@ccclass
export default class sp1 extends cc.Component {
    start() {
        let evMar = eventTargetMar.getInstance();
        //事件发送
        evMar.emit("Dead", 1, 2, 3, "参数4");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值