2013-07-19 1 views
0

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

+0

Может кто-нибудь рекомендовать мне любой блог веб-сайта, где люди знают о cocos2d-x? – Zubair

ответ

-2

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

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

1

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"); 
} 
0

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

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

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

void ccTouchesBegan(...), ccTouchesMoved(...), ccTouchesEnded(...) 
1

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

Скажите, что имя вашего дочернего класса - это MyNode. Он должен implement--

  1. методы CCTouchOneByOneDelegate получить одного события прикосновения.

  2. CCTouchAllAtOnceDelegate к получает мульти-событию касания

Примечание: Слой вы собираетесь добавить Touch-Enabled подкласса 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 
{ 

}