美文网首页
CocosCreator中,实现事件监听

CocosCreator中,实现事件监听

作者: 全新的饭 | 来源:发表于2022-09-26 16:48 被阅读0次

类似于c#中的event功能。

假设:血量条需要关注血量的变化

组件HpCtr中持有一个字段hp,通过该组件提供的方法setHp可以修改hp值。

public static readonly MinHp: number = 0;
public static readonly MaxHp: number = 100;
private _hp: number;
public get hp(): number { return this._hp; }

private setHp(v: number): void
{
  ...
}

期望当hp值被修改时,发出事件告知外界。

发出事件

  1. 在组件HpCtr中声明一个字段eventTarget:EventTarget,提供getter供外界访问。
private _eventTarget: EventTarget;
public get eventTarget(): EventTarget { return this._eventTarget };
  1. 创建一个常量作为血量变化事件的标识名。
public static readonly ChangeHpEvent: string = 'HpCtrChangeHpEvent';
  1. 在setHp方法中,触发该事件。
this.eventTarget.emit(HpCtr.ChangeHpEvent, this._hp);

接收事件

组件HpBar需关注血量变化。

  1. 在该组件初始化时,关注血量变化事件;在该组件销毁时,取消关注。
    private init(hpCtr:HpCtr): void
    {
        this._hpCtr = hpCtr;
        this._hpCtr.eventTarget.on(HpCtr.ChangeHpEvent, this.onHpChanged, this);
    }
    
    private myDestroy(): void
    { 
        if (this._hpCtr != null)
        { 
            this._hpCtr.eventTarget.off(HpCtr.ChangeHpEvent, this.onHpChanged, this);
            this._hpCtr = null;
        }
    }

    private onHpChanged(hp: number)
    { 
        ...
    }

额外知识

1. 获取本场景中的“单例”组件时,可通过如下方式。(如获取LevelSys)

levelSys:LevelSys = director.getScene().getComponentInChildren(LevelSys);

2 创建自己的代码模板

在Assets窗口点鼠标右键


image.png

在打开的目录下创建名称无后缀的模板文件,如“FanCustomComponent”


image.png
我创建的代码模板文件内容如下:增加了初始化和销毁的方法。
import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('<%UnderscoreCaseClassName%>')
export class <%UnderscoreCaseClassName%> extends Component 
{
    start()
    {
        this.init();
    }

    onDestroy()
    { 
        this.myDestroy();
    }

    update(deltaTime: number)
    {
        
    }
    
    private init(): void
    {
    
    }
    
    private myDestroy(): void
    { 

    }
}

/**
 * COMMENTS_GENERATE_IGNORE
 * Use "COMMENTS_GENERATE_IGNORE" tag if you do not want later created scripts to contain these comments.
 * 
 * Predefined Variables
 * You can use predefined variables below to setup your scripting preference. For example, whether to use camel case style.
 * 
 * <%UnderscoreCaseClassName%>, class name in underscore format, like 'new_component'
 * <%CamelCaseClassName%>, class name in camel format, like 'NewComponent'
 * <%Author%>, Who create this file
 * <%DateTime%>, when create this file
 * <%FileBasename%>, creating file name with extension
 * <%FileBasenameNoExtension%>, creating file name without extension
 * <%URL%>, url of this file in COCOS ASSET URL format
 * <%ManualUrl%>, url of office help document, like 'https://docs.cocos.com/creator/manual/en/'
 *
 * 
 * Example:
 * 
  @ccclass('<%UnderscoreCaseClassName%>')
  export class <%UnderscoreCaseClassName%> extends Component {

    // class member could be defined like this.
    dummy = '';

    // Use 'property' decorator if your want the member to be serializable.
    @property
    serializableDummy = 0;

    start () {
        // Your initialization goes here.
    }

    update (deltaTime: number) {
        // Your update function goes here.
    }

  }
 *
 * Learn more about scripting: <%ManualUrl%>scripting/
 * Learn more about CCClass: <%ManualUrl%>scripting/decorator.html
 * Learn more about life-cycle callbacks: <%ManualUrl%>scripting/life-cycle-callbacks.html
 */

相关文章

网友评论

      本文标题:CocosCreator中,实现事件监听

      本文链接:https://www.haomeiwen.com/subject/tuhxartx.html