首页 > 其他分享 >Cocos Creator开发中的事件响应

Cocos Creator开发中的事件响应

时间:2023-11-16 16:13:45浏览次数:39  
标签:node Cocos Creator cc EventType 响应 事件 KEY 节点

在Cocos Creator游戏开发中,我们经常需要处理事件响应。所以,我们有必要对其中的事件响应内容熟记于心,因此,将其中重要内容归纳如下:

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

  1. 触摸事件

1: 触摸事件类型: START, MOVED, ENDED(物体内), CANCEL(物体外);

2: 监听触摸事件: node.on(类型, callback, target(回掉函数的this), [useCapture]);

3: 关闭触摸事件: node.off(类型, callback, target(回掉函数的this), [useCapture]);

4: 移除所有的注册事件:targetOff (target) ;

5: 回调函数的参数设置 function(e(cc.Touch))

6: cc.Touch: 触摸对象,

常用方法getLocation返回触摸的位置;getDelta返回距离上次的偏移;

7: cc.Event: stopPropagationImmediate/stopPropagation 停止事件的传递;

8: 事件冒泡: 触摸事件支持节点树的事件冒泡,会从当前节点往上一层一层的向父节点传送;

如下案例,物体跟随手指触摸移动实现:

 

 

GameMgr.ts代码如下:

 

const {ccclass, property} = cc._decorator;

 

@ccclass

export default class GameMgr extends cc.Component {

@property({type:cc.Node, tooltip:"要控制的主角节点",})

player : cc.Node = null;

 

onLoad () {

// 触摸到哪红色块就到哪

this.node.on(cc.Node.EventType.TOUCH_START, function(e : cc.Touch){

let worldPos : cc.Vec2 = e.getLocation();

let localPos : cc.Vec2 = this.node.convertToNodeSpaceAR(worldPos);

this.player.setPosition(localPos);

}, this);

 

// 红色块随着触摸移动

this.node.on(cc.Node.EventType.TOUCH_MOVE, (e : cc.Touch)=>{

let pos : cc.Vec2 = this.player.getPosition();

this.player.setPosition(pos.add(e.getDelta()));

}, this);

 

this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);

this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onTouchEnd, this);

}

 

private onTouchCancel() : void{

console.log("在节点之外释放鼠标!");

}

private onTouchEnd(e : cc.Touch) : void{

console.log("在节点之内释放鼠标");

}

 

onDestroy(){

this.node.off(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);

this.node.off(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);

}

 

}

  1. 键盘事件

1:cc.SystemEvent.on(type, function, target, useCapture);

type: cc.SystemEvent.EventType.KEY_DOWN 按键按下;

cc.SystemEvent.EventType.KEY_UP 按键弹起;

2: cc.SystemEvent.on(type, function, target, useCapture);

3: 监听的时候,我们需要一个cc.SystemEvent类的实例,我们有一个全局的实例cc.systemEvent,小写开头

3: 键盘回调函数: function(event) {

event.keyCode [cc.KEY.left, ...cc.KEY.xxxx]

案例:按上下左右键,控制红色块的运动。

新建PlayerCtrl.ts,挂载到Red节点上。代码如下:

const {ccclass, property} = cc._decorator;

 

@ccclass

export default class PlayerCtrl extends cc.Component {

start () {

// 按键按下时调用

cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);

// 按键释放时才调用

cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this);

}

 

private onKeyDown(e : any){

switch(e.keyCode){

case cc.macro.KEY.up : this.node.y += 100; break;

case cc.macro.KEY.down : this.node.y -= 100; break;

}

}

 

private onKeyUp(e : any){

switch(e.keyCode){

case cc.macro.KEY.left : this.node.x -= 100; break;

case cc.macro.KEY.right : this.node.x += 100; break;

}

}

}

  1. 自定义事件

1: 监听: this.node.on(“自定义事件名称”, function, target, useCapture);

2: 自派送: emit(“事件名称”, [detail]); 只有自己能够收到;

3: 冒泡派送: dispatchEvent(new cc.Event.EventCustom(“name”, 是否冒泡传递));

 

 

  1. 自派送emit

新建单色节点Blue,创建CustomEventTest.ts挂载到此节点上。

const {ccclass, property} = cc._decorator;

 

@ccclass

export default class CustomEventTest extends cc.Component {

onLoad () {

// 事件接收处理

this.node.on("SEND_EVENT", (e)=>{

console.log("emit方法派发事件SEND_EVENT", e, e.role);

}, this);

this.node.emit("SEND_EVENT", {role: this.node.name});

}

}

运行结果如下:

 

 

注意:此时,如果我们要在其父节点Canvas节点下也能接收到此SEND_EVENT事件,我们会设想,在GameMgr.ts中增加如下代码,但是事实上,运行后,GameMgr.ts的如下代码没有接收到派发事件。

 

 

运行结果如下(说明依然只有Blue自己这个节点接收到了emit派发的事件SEND_EVENT):

 

 

说明:如果派送的事件不只是发给自己,需要向上传递,则需要使用dispatchEvent。

  1. 冒泡派送dispatchEvent

在CustomEventTest.ts中增加start方法如下:

 

 

同时将GameMgr.ts中的方法略作修改如下:

 

 

然后,运行结果如下:

 

 

注意:若将CustomEventTest.ts中的事件冒泡属性改为false,如下,表示不冒泡传递,则其父节点Canvas将收不到派发的事件。

 

 

 

 

若将CustomEventTest.ts中的将start方法注释掉,则运行结果如下:

 

标签:node,Cocos,Creator,cc,EventType,响应,事件,KEY,节点
From: https://www.cnblogs.com/bycw/p/17836529.html

相关文章

  • CocosCreator脚本属性在属性面板的显示
    声明属性要声明属性,需要在cc.Class定义的properties字段中,填写属性名字和属性参数。cc.Class({extends:cc.Component,properties:{score:{default:0,type:cc.Integer,displayName:"分数",tooltip:"玩家的分数"}}}); 下拉列表要在属性检查器上显示为下拉......
  • Cocos Creator中骨骼动画组件的使用
    在CocosCreator游戏开发中,骨骼动画对于优化系统资源占用有很大帮助,很多时候我们都会使用。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀~spine骨骼动画工具1:骨骼动画:把动画打散,通过工具,调骨骼的运动等来形成动画2:spine是一个非常流......
  • Cocos Creator常用基础操作总结
    场景操作cc.director.loadScene('场景名称');//场景跳转cc.director.preloadScene('场景名称');//预加载场景cc.director.getScene();//获取当前场景节点操作获取节点常用方法cc.find(“节点路径”)、this.node.getChildByName(“子节点名”)等。varnode=cc.find......
  • Cocos Creator之MAC平台protobufjs
    一,环境MAC二,安装brew1,命令(不必要)/bin/zsh-c"$(curl-fsSLhttps://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"2,安装2.1,命令[email protected],安装位置/usr/local/lib/node_modules/protobufjs/dist三,准备一个proto测试文件(test.proto)packag......
  • token以及axios响应拦截器请求拦截器
    一、token的介绍1.概念访问权限的令牌,本质上是一串字符串2.创建正确登录后,由后端签发并返回3.作用判断是否有登录状态等,控制访问权限注意:前端只能判断有无token,而后端才能判断token的有效性4.使用目标:只有登录状态,才能访问内容页面1.在utils/auth.js中判断有无token令牌字符串,则强......
  • 第5章 QtCreator 开发工具必知必会技巧
    第5章QtCreator开发工具必知必会技巧本章导学Creator代码编辑界面功能介绍项目视图展示是pro文件里面的编译文件列表上面加号可以添加各类文件的视图分栏看见打开的文档还可以打开新的窗口Creator常用快捷键--程序开发的提效利器Creator片段......
  • Cocos Creator 3.0基于PBR的物理渲染详解
    CocosCreator3.0出来以后,终于CocosCreator升级成为全新的2D/3D游戏引擎,适合2D和3D游戏开发,而3D游戏对画面效果和渲染管线的定制会有很高的需求,PBR美术工作流作为次世代主流的解决方案,今天我们来详细的分析一下基于CocosCreator的PBR物理渲染。1:计算机是如何显示颜色的讨......
  • Cocos creator屏幕适配怎么做?
    前言cocoscreator屏幕适配是面试中必问的一个题目,今天给大家说说怎么样做屏幕适配。1:屏幕适配的2个核心的配置a:设计分辨率:美术设计资源时候的分辨率,也是我们所有资源的参考分辨率,我们就是基于这个分辨率来适配到其它不同的手机分辨率上的;b:适配策略:固定高度/固定......
  • ajax响应200但一直走error
    做登录功能时发现ajax请求响应正常200也能在预览中国看到响应数据,但是执行的是error$.ajax({type:"post",data:{username:$("#username").val(),password:$("#password").val()},dataType:"json",url:"user/login"......
  • 数字滤波器分析---相位响应
    数字滤波器分析---相位响应MATLAB®函数可用于提取滤波器的相位响应。在给定频率响应的情况下,函数 abs 返回幅值,angle 返回以弧度为单位的相位角。要使用 fvtool 查看巴特沃斯滤波器的幅值和相位,请使用:d=designfilt('lowpassiir','FilterOrder',9,...'HalfPowerFrequ......