问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

cocos creator怎么获取触摸点坐标

发布网友 发布时间:2022-04-23 15:46

我来回答

2个回答

懂视网 时间:2022-04-23 20:07

下面小编就为大家带来一篇cocos creator Touch事件应用(触控选择多个子节点的实例)。小编觉得挺不错的,现在就想给大家,也给大家做个参考。一起跟随小编过来看看吧

最近参与了cocos creator的研究,开发小游戏,结果被一个事件坑得不行不行的。现在终于解决了,分享给大家。

原理

1.触控事件是针对节点的

2.触控事件的冒泡,是直接关系冒泡,父子可以,孙子不行,就是不能隔代冒泡

3.父节点不响应触控事件,肯定是被孩子节点遮挡了,只要孩子节点也监听一下事件,父节点就可以响应了

4.触控位置是绝对坐标,相对于整个canvas,节点位置相对于父节点,相对位置可以与绝对坐标相互转化

5.节点是否被触控到,touch start事件可以肯定被触摸到,但是一个节点触摸到必须等待其结束,另一个节点才能响应touch事件

6.判断是否框选中,根据坐标计算相互交叉即是选中。就是说我从触控起点->触控终点 构成的矩形区域,与节点的矩形存在重叠,就是被框选。本例中,采用比较粗略的算法实现,根据横坐标的范围是否包含子节点的横坐标判断是否选中。

7.计算某个数值是否在某一范围内,首先计算出范围的最大值、最小值,然后作比较即可。

核心代码


cc.Class({
 extends: cc.Component,

 properties: {
 // foo: {
 // default: null, // The default value will be used only when the component attaching
 // to a node for the first time
 // url: cc.Texture2D, // optional, default is typeof default
 // serializable: true, // optional, default is true
 // visible: true, // optional, default is true
 // displayName: 'Foo', // optional
 // readonly: false, // optional, default is false
 // },
 // ...
 poker:{
 default:null,
 type:cc.Node
 },
 cardMask:{
 default:null,
 type: cc.Prefab
 }
 },

 // use this for initialization
 onLoad: function () {
 
 //牌
 this.cards = this.poker.children;

 //牌初始位置
 this.cardInitY = this.cards[0].y;

 //触摸选择到的牌
 this.touchedCards = [];

 //选中的牌
 this.selectedCards = [];

 console.info(this.cards);
 },
 
 start: function () {
 // this.cards = this.poker.children;
 // console.info(this.cards);
 
 this.addTouchEvent();
 },

 /**
 * 添加事件
 */
 addTouchEvent:function(){

 //父节点监听touch事件(直接子节点必须注册同样的事件方能触发)
 this.poker.on(cc.Node.EventType.TOUCH_START, function (event) {
 console.log('poker TOUCH_START');
 
 //牌
 var card = event.target;
 
 //起始触摸位置(和第一张card一样,相对于poker的位置)
 this.touchStartLocation = this.cards[0].convertTouchToNodeSpace(event);
 console.log('touch start Location:'+ JSON.stringify(this.touchStartLocation));
 
 //计算牌位置
 var index = 0;
 for(var i=0;i<this.cards.length;i++){
 var c = this.cards[i];
 if(c.name == card.name){
 index = i;
 break;
 }
 }

 //暂存第一次触摸到的牌
 var touchedCard = {
 index:index,
 card:card
 };
 this.firstTouchedCard = touchedCard;
 //暂存
 this.pushTouchedCards(touchedCard.index,touchedCard.card);

 }, this);
 
 //父节点监听touch事件(直接子节点必须注册同样的事件方能触发)
 this.poker.on(cc.Node.EventType.TOUCH_MOVE, function (event) {
 console.log('poker TOUCH_MOVE');
 //先清除原先触摸到的牌
 this.clearTouchedCards();
 //保存第一张牌
 this.pushTouchedCards(this.firstTouchedCard.index,this.firstTouchedCard.card);

 //触摸点转换为card节点坐标
 var nodeLocation = this.cards[0].convertTouchToNodeSpace(event);
 console.log('touch nodeLocation:'+ JSON.stringify(nodeLocation));
 var x = nodeLocation.x;
 var y = nodeLocation.y; 

 //找到当前选中的牌
 var currentCard = null;
 for(var i=0;i< this.cards.length;i++){
 var card = this.cards[i];
 var cardX = card.x;
 var cardY = card.y;
 console.log('card x='+cardX+',y='+cardY);


 //某张牌范围包括了鼠标位置,选中此牌与触摸开头的所有牌
 var cardWidth = i==5 ? card.width:19;
 var cardHeight = card.height;
 if(cardX<=x && x <= cardX+cardWidth && cardY<=y && y<= cardY+cardHeight){
 currentCard = card;
 
 //暂存触摸到的牌
 this.pushTouchedCards(i,card);
 
 break;
 }
 }
 
 //添加开头与此牌直接的所有牌
 var startTouchLocation = this.touchStartLocation;
 for(var i=0;i< this.cards.length;i++){
 var card = this.cards[i];
 var cardX = card.x;
 //框选的范围包括了的牌
 var min,max;
 if(startTouchLocation.x < nodeLocation.x){
 min = startTouchLocation.x;
 max = nodeLocation.x;
 }else{
 min = nodeLocation.x;
 max = startTouchLocation.x;
 }
 console.log('min='+min+', max='+max);

 if(min <= cardX && cardX <= max){
 //暂存触摸到的牌
 this.pushTouchedCards(i,card);
 }
 }
 

 }, this);
 
 //父节点监听touch事件(直接子节点必须注册同样的事件方能触发)
 this.poker.on(cc.Node.EventType.TOUCH_END, function (event) {
 console.log('poker TOUCH_END');
 this.doSelectCard();
 }, this);
 
 //父节点监听touch事件(直接子节点必须注册同样的事件方能触发)
 this.poker.on(cc.Node.EventType.TOUCH_CANCEL, function (event) {
 console.log('poker TOUCH_CANCEL');
 this.doSelectCard();
 }, this);
 
 //给所有的牌注册事件,会自动冒泡到poker节点
 for(var i=0;i< this.cards.length;i++){
 var cards = this.cards;
 //闭包传递i值
 (function(i){
 var card = cards[i];
 card.on(cc.Node.EventType.TOUCH_START, function (event) {
 console.log('card TOUCH_START');
 }, card);
 
 card.on(cc.Node.EventType.TOUCH_MOVE, function (event) {
 console.log('card TOUCH_MOVE');
 }, card);

 card.on(cc.Node.EventType.TOUCH_END, function (event) {
 console.log('card TOUCH_END');
 }, card);
 
 card.on(cc.Node.EventType.TOUCH_CANCEL, function (event) {
 console.log('card TOUCH_CANCEL');
 }, card);

 
 })(i)
 
 }
 
 },

 /**
 * 暂存触摸到的牌
 */
 pushTouchedCards:function(index,card){
 //构造牌对象
 var cardObj = {
 index:index,
 name:card.name,
 isSelected:card.y==this.cardInitY?false:true //高度不一样,表示选中
 };
 
 //防止重复添加
 var existCard = this.touchedCards.find(function(obj){
 if(obj.name == card.name){
 return obj;
 }else{
 return null;
 }
 });
 if(!existCard){
 //添加暂存
 this.touchedCards.push(cardObj);

 //包含提示
 this.addCardMask(card);
 }
 },

 /**
 * 清除原先暂存的触摸到的牌
 */
 clearTouchedCards:function(){
 for(var i=0;i<this.touchedCards.length;i++){
 var cardIndex = this.touchedCards[i].index;
 var card = this.cards[cardIndex];
 card.removeChild(card.children[0]);
 }
 this.touchedCards = [];
 },

 /**
 * 选择牌
 */
 doSelectCard:function(){
 this.selectedCards = [];

 console.log(this.touchedCards);

 //改变牌状态
 for(var i = 0; i< this.touchedCards.length;i++){
 var cardObj = this.touchedCards[i];
 var card = this.cards[cardObj.index];
 if(cardObj.isSelected){ //如果是选中改为不选中
 card.y = card.y - 30;
 }else{ //不选中改为选中状态
 card.y = card.y + 30;
 }
 }

 //重置
 this.clearTouchedCards();

 //显示选中的牌
 this.showSelectedCards();
 },

 /**
 * 包含牌遮罩
 */
 addCardMask:function(card){
 var cardMask = cc.instantiate(this.cardMask);
 cardMask.setPosition(cc.p(0, 0));
 card.addChild(cardMask);
 },

 /**
 * 显示选中的牌
 */
 showSelectedCards:function(){
 this.selectedCards = [];
 for(var i=0;i< this.cards.length;i++){
 var card = this.cards[i];
 var isSelected = card.y==this.cardInitY?false:true;
 if(isSelected){
 this.selectedCards.push(card.name);
 }
 }
 //
输出 console.info("selected cards is: "+ JSON.stringify(this.selectedCards)); }, // called every frame, uncomment this function to activate update callback // update: function (dt) { // }, });

效果

热心网友 时间:2022-04-23 17:15

你弄复杂了
this.node.on('touchstart',function(event){
var pos = event.getLocation();
},this);

这样就会得到触点坐标,后续可以再转化为游戏内坐标
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
眼镜镜片配镜时没有注意左眼散光,镜子就没有配左眼散光,但是现在不舒 ... 好听的男主角名字大全554个 考研非得至少考个211吗? 考研是考211类的还是 普一本 招财风水吉祥物 效果最好的十大招财物 米6系统有什么特点 肉眼能看见的星星 都是银河系的么? sql2008怎样获取指定行的数据?谢谢 delphi运行错误——like 附近有语法错误??procedure TForm1.BitBtn6Cli... 求大神找找代码问题,'setXM' 附近有语法错误.我代码里根本没有‘setXM... 海信手机里的讯飞语音怎么用 海信H65E3A如何联接音响 微信转错账了,对方收款后把我拉黑了,现在只知道这个人的,可以查到她的个人信息吗? 微信转错账,对方不还给我,还把我拉黑删除,而且对方的已被永久注销,这种情况还有救吗? 荣耀九青春好还是7x好 由于物业不定期疏通下水道,造成我家年年反水,我该怎样维权? 冰箱调到几才是最低温度? cocoscreator重力感应事件回调用 起诉的规定是什么 诉讼与起诉的区别是什么? 起诉是什么意思啊 起诉是什么意思???起诉后对生活有什么影响吗?? 起诉是什么意思 ? 三星5500电视如何清除播放记录(使用记录) 夏新智能电视怎么清除观看历史 读不出U盘, 七彩虹G31 老台式机 支持USBFDD,USBZIP 不支持HDD? 七彩虹主板怎么不能用u盘装系统 猫影视tv如何去除观看内容 明明已经插入U盘七彩虹智能主板开机启动项却没有显示该怎么办? 七彩虹主板 无法u盘重装系统 设置bios无法读取u盘直接进入老系统 合肥全国最好的美甲美睫学校? cocos creator 的scorllview 的滑动事件和触摸事件会产生冲突么 手机能照出两寸照片么证件照我只是照完之后发别人邮,箱里的 企业级路由器比普通路由器信号会更强更稳定吗 河南定向培养士官学校分数线2022 士官学校录取分数线 牙周炎牙龈萎缩,选择哪款牙膏更好一些? 牙龈萎缩买什么牙膏好 cocos creator 怎样使用converttouchtonodespace 牙龈有点萎缩,想试试完好如初牙膏,看能不能修复? 我母亲有牙龈萎缩,使用完好如初牙膏有效果吗?想听实话 苹果手机怎么安装百度 关于九月抒情的句子 献血以后喝纯牛奶可以补血吗 献血的问题。 Cocos Creator按钮怎么可以设置为disable状态 本人想去北京自助游4天,地点已经定好,但是由于不熟悉北京地形,不知道应该怎样制定计划,请各位帮忙。 准备去北京旅游 去过或者在北京的朋友能帮忙制定一个计划吗 去北京玩,怎么玩,有没有旅游攻略 宽带1M 什么意思