cocos creator Touch 이벤트 응용(터치 제어 가 여러 개의 하위 노드 를 선택 한 실례)
의 원리
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) {
// },
});
효과.이상 의 이 cocos creator Touch 이벤트 응용(터치 제어 가 여러 개의 하위 노드 를 선택 한 실례)은 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 저희 도 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
cocos 애니메이션 첫 번째 프레임으로 중지텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.