Cocos---监听、触摸事件、坐标系转换
监听、触摸事件、坐标系转换#
Creator的系统事件#
分为“节点系统事件”和“全局系统事件”。
节点系统事件:触发在节点上,包括鼠标事件和触摸事件。
全局系统事件:包括键盘和重力传感事件。
需要通过监听的方法来实现。
监听的注册#
-
节点.on(节点系统事件的枚举类型或事件名, function(event){},target);
-
节点.on(节点系统事件的枚举类型或事件名, this.函数名,target);函数名(event){}
(1)使用枚举类型来注册
node.on(cc.Node.EventType.MOUSE_DOWN, function (event) {
console.log('Mouse down');
}, this);
(2)使用事件名来注册
node.on('mousedown', function (event) {
console.log('Mouse down');
}, this);
Target:绑定响应函数的调用者。#
This---谁点击,函数中this指的是谁。等价于函数上加bind(this)。
某节点---在函数中的this指的是某节点,而不是发生点击的节点。
例子#
red和white在属性列表中定义,脚本节点
this.red.on('mousedown',function(){
console.log("red");
console.log(this);
},this);//this----指向当前这个类,如果脚本挂在某个节点上,this.node相当于指向这个节点
// 等价于下面的写法
this.red.on('mousedown',function(){
console.log("redred");
console.log(this);
}.bind(this));
this.white.on('mousedown',function(){
console.log("white");
console.log(this.name);//this相当于this.red,所以不能写this.node.name
},this.red);
监听的关闭#
当监听不需要的时候,一定要关闭,消耗资源比较大。
必须把回调函数单独写。
关闭监听的格式
This.node.on(‘’,this.函数名,this);
This.node.off(‘’,this.函数名,this);
函数名(){ }----写在生命周期接口外
例子#
start () {
//关闭监听
this.red.on('mousedown',this.redclick,this);
this.white.on('mousedown',function(){
this.red.off('mousedown',this.redclick,this);
},this)
}
redclick(){
console.log("red");
}
移除目标上的所有注册事件。#
This.node.targetOff(this)
【例】#
this.red.on('mousedown',function(){console.log('down')},this);
this.red.on('mouseup',function(){console.log('up')},this);
this.white.on('mousedown',function(){
console.log('white');
this.red.targetOff(this);
},this)
触摸事件#
例子#
@property(cc.Node)
white: cc.Node = null;//注意定义为Node和Sprite类型,注册监听的区别
onLoad () {
this.white.on("touchstart",function(t){
console.log('touchstart');
},this);
this.white.on('touchmove',function(t){
console.log('touchmove');
},this);
this.white.on('touchend',function(t){
console.log('touchend');
},this);
this.white.on('touchcancel',function(t){
console.log('touchcancel');
},this);
}
cc.node其他的事件#
触摸事件常用API应用案例#
获取触摸位置#
可以通过回调函数的参数t获取触摸位置,此坐标是一个世界坐标系下的vec3对象。
坐标空间
Creator的坐标系分为世界坐标系和相对坐标系。
世界坐标系以左下角为原点
获取触摸位置,实现拖动一个对象。#
this.red.on('touchmove',function(t){
let p = this.node.convertToNodeSpaceAR(t.getLocation());
this.red.x = p.x;
this.red.y = p.y;
},this)
【例】#
@property(cc.Node)
white: cc.Node = null;//注意定义为Node和Sprite类型,注册监听的区别
@property(cc.Node)
blue:cc.Node = null;
@property(cc.Node)
red:cc.Node = null;
onLoad () {
//把blue相对白色节点的坐标转换为世界坐标
let v1 = this.blue.convertToWorldSpaceAR(this.blue.position);
console.log(v1.x,v1.y);
//white的触摸事件监听
this.white.on("touchstart",function(t){
console.log('touchstart');
},this);
this.white.on('touchmove',function(t){
console.log('touchmove');
},this);
this.white.on('touchend',function(t){
console.log('touchend');
},this);
this.white.on('touchcancel',function(t){
console.log('touchcancel');
},this);
//转换触点的坐标空间
this.node.on('touchmove',function(t){
let touch_position = t.getLocation();
// console.log(touch_position.x,touch_position.y);
//转换为相对于canvas节点空间的坐标,以锚点为参考点。
let position = this.node.convertToNodeSpaceAR(touch_position);
console.log(position.x,position.y);
},this);
//通过获取触摸位置,实现拖动一个对象
this.red.on('touchmove',function(t){
let p = this.node.convertToNodeSpaceAR(t.getLocation());
this.red.x = p.x;
this.red.y = p.y;
},this)
}
Vec3的相关API#
https://docs.cocos.com/creator/api/zh/classes/Vec3.html?h=向量长度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了