cocos creator 多選節點,高亮顯示
阿新 • • 發佈:2019-02-17
可用於鬥地主選牌
程式碼塊
cc.Class({
extends: cc.Component,
properties: {
poker:{
default:null,
type:cc.Node
},
cardMask:{
default:null,
type: cc.Prefab
}
},
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));
},
});