События CCTouch для CCNode в cocos2d-X

Я пытался найти, но не смог найти нужный ответ, кто-нибудь может сказать мне, что такое CCTouch события для CCNode? Так как у нас есть CCTouchBegan, CCTouchMoved и CCTouchEnded для CCLayer

4 ответа

Решение

CCNode не может обнаружить сенсорные события. События касания обнаруживаются только CCLayer, CCLayer наследуется от CCNode, поэтому он имеет все свойства CCNode и дополнительные функции для обнаружения события касания.

Вы можете проверить мой блог http://www.touchscreenstudio.com/, это недавно запущенный блог, и я буду освещать все вещи cocos2d-x пост за почтой.

CCLayer является подклассом CCNode, поэтому вы можете использовать все те же функции;

что-то вроде этого

HelloWorldScene.h

virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);

HelloWorldScene.cpp

bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent){ 
printf("ccTouchBegan");

return true;
}

void HelloWorld::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent){
printf("ccTouchMoved");
}
void HelloWorld::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent){
printf("ccTouchEnded");
}
void HelloWorld::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent){
printf("ccTouchCancelled"); 
}

Дочерний класс CCNode также может получать сенсорные события.

Скажите, что ваш дочерний класс называется MyNode. Это должно реализовать--

  1. CCTouchOneByOneDelegate методы для получения событий одним касанием.

  2. CCTouchAllAtOnceDelegate для получения событий мультитач

Примечание. Слой, к которому вы добавите этот подкласс CCNode с поддержкой сенсорного управления, не должен поглощать касание при регистрации этого слоя с помощью диспетчера касаний.

Интерфейс класса:

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "CCProtocols.h"

@interface MyNode : CCNode <CCTouchOneByOneDelegate,CCTouchDelegate>//Implementing only for single touch events
{
   @private  CGSize  winSize;
}
+(MyNode*) addMyNodeToParentClass:(CCNode*)parent;

Реализация класса:

#import "SettingsMenu.h"
@implementation SettingsMenu

+(MyNode*) addMyNodeToParentClass:(CCNode*)parent;
{
    return [[self alloc]initWithParentNode:parent];
}

-(id)initWithParentNode:(CCNode*)parent
{
    if(self=[super  init])
    {
         winSize=[CCDirector sharedDirector].winSize;

        //Registering MyNode with the TouchDispatcher
        [self registerWithTouchDispatcher];


        //adding a single sprite to check touch events
        CCSprite *sprite=[CCSprite spriteWithFile:@"information.png"];
        infoButton.position=ccp(winSize.width/2,winSize.height/2);
        [self addChild:infoButton];

        //adding this node to the parent node
        [parent addChild:self];
     }
      return self;
}

#pragma function registering with Touch Dispatcher
-(void)registerWithTouchDispatcher
{
    [[CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:INT_MIN+1 swallowsTouches:YES];//if any other node needs this touch do not swallow this touch

}

#pragma -CCTouchOneByOne delegate methods

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{

    CGPoint touchPoint=[[CCDirector sharedDirector] convertTouchToGL:touch];

    if(CGRectContainsPoint(infoButton.boundingBox, touchPoint))
    {

        printf("\nTouch received on information button");
    }

    return  YES;
}

-(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
    CGPoint movedTouchPoint=[[CCDirector sharedDirector] convertTouchToGL:touch];
    //your code to handle touch-movement

}
-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
    CGPoint touchEndPoint=[[CCDirector sharedDirector] convertTouchToGL:touch];
     //your code to handle touch-end
}

-(void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event
{
    //handle event for incoming SMS,Call ect.
}

#pragma -method to remove Touch Dispatcher
-(void)removeTouchDispatcher
{
    [[CCDirector sharedDirector].touchDispatcher removeDelegate:self];
}

Если MyNode необходимо реализовать мультисенсорные события, реализуйте методы делегата CCTouchAllAtOnceDelegate ---

////////////////////////////////////////////////////////////////
-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

}
-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

}
-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{

}
-(void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{

}

Вы должны наследовать класс CCTouchDeligate вместе с CCNode. Посмотрите на функцию CCLayer::registerWithTouchDispatcher() в CCLayer.cpp. Вы можете добавить свой CCNode в CCTouchDispatcher.

CCTouchDispatcher* pDispatcher = CCDirector::sharedDirector()->getTouchDispatcher();
pDispatcher->addStandardDelegate(this, 0);

Как только вы это сделаете, вы получите обратные вызовы

void ccTouchesBegan(...), ccTouchesMoved(...), ccTouchesEnded(...)
Другие вопросы по тегам