Come far sì che gli oggetti reagiscano ai tocchi in Cocos2D?

Bene, quindi sto iniziando a imparare di più su Coco2D, ma sono un po 'frastornato. Molte delle esercitazioni che ho trovato riguardano versioni obsolete del codice, quindi quando guardo e vedo come fanno certe cose, non posso tradurle nel mio programma, perché molto è cambiato. Detto ciò, sto lavorando all'ultima versione di Coco2d, versione 0.99.

Quello che voglio fare è creare uno sprite sullo schermo (Fatto) e poi quando touch lo sprite, posso fare in modo che "qualcosa" accada. Per ora, facciamo solo un avviso. Ora, ho ottenuto questo codice lavorando con l'aiuto di un amico. Ecco il file di intestazione:

// When you import this file, you import all the cocos2d classs #import "cocos2d.h" // HelloWorld Layer @interface HelloWorld : CCLayer { CGRect spRect; } // returns a Scene that contains the HelloWorld as the only child +(id) scene; @end 

Ed ecco il file di implementazione:

 // // cocos2d Hello World example // http://www.cocos2d-iphone.org // // Import the interfaces #import "HelloWorldScene.h" #import "CustomCCNode.h" // HelloWorld implementation @implementation HelloWorld +(id) scene { // 'scene' is an autorelease object. CCScene *scene = [CCScene node]; // 'layer' is an autorelease object. HelloWorld *layer = [HelloWorld node]; // add layer as a child to scene [scene addChild: layer]; // return the scene return scene; } // on "init" you need to initialize your instance -(id) init { // always call "super" init // Apple recommends to re-assign "self" with the "super" return value if( (self=[super init] )) { // create and initialize a Label CCLabel* label = [CCLabel labelWithString:@"Hello World" fontName:@"Times New Roman" fontSize:64]; // ask director the the window size CGSize size = [[CCDirector sharedDirector] winSize]; // position the label on the center of the screen label.position = ccp( size.width /2 , size.height/2 ); // add the label as a child to this Layer [self addChild: label]; CCSprite *sp = [CCSprite spriteWithFile:@"test2.png"]; sp.position = ccp(300,200); [self addChild:sp]; float w = [sp contentSize].width; float h = [sp contentSize].height; CGPoint aPoint = CGPointMake([sp position].x - (w/2), [sp position].y - (h/2)); spRect = CGRectMake(aPoint.x, aPoint.y, w, h); CCSprite *sprite2 = [CCSprite spriteWithFile:@"test3.png"]; sprite2.position = ccp(100,100); [self addChild:sprite2]; //[self registerWithTouchDispatcher]; self.isTouchEnabled = YES; } return self; } // on "dealloc" you need to release all your retained objects - (void) dealloc { // in case you have something to dealloc, do it in this method // in this particular example nothing needs to be released. // cocos2d will automatically release all the children (Label) // don't forget to call "super dealloc" [super dealloc]; } - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; //CGPoint location = [[CCDirector sharedDirector] convertCoordinate:[touch locationInView:touch.view]]; CGPoint location = [touch locationInView:[touch view]]; location = [[CCDirector sharedDirector] convertToGL:location]; if (CGRectContainsPoint(spRect, location)) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Win" message:@"testing" delegate:nil cancelButtonTitle:@"okay" otherButtonTitles:nil]; [alert show]; [alert release]; NSLog(@"TOUCHES"); } NSLog(@"Touch got"); } 

Tuttavia, questo funziona solo per 1 object, lo sprite per cui creo il CGRect. Non posso farlo per 2 folletti, cosa che stavo testando. Quindi la mia domanda è questa: come posso avere tutti gli sprite sullo schermo reactjs allo stesso evento quando viene toccato?

Per il mio programma, lo stesso evento deve essere eseguito per tutti gli oggetti dello stesso tipo, quindi dovrebbe renderlo un po 'più semplice. Ho provato a creare una sottoclass di CCNode e a scrivere il metodo, ma non funzionava affatto … quindi sto facendo qualcosa di sbagliato. L'aiuto sarebbe apprezzato!

Passando attraverso il progetto "Tocchi" in cocos2D e vedendo se vedo come l'hanno fatto. Sembra che abbiano creato una sottoclass e sovrascritto i methods:

 - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event - (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event - (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event 

Quindi ora capisco perché il mio non funziona … hmm …

Solutions Collecting From Web of "Come far sì che gli oggetti reagiscano ai tocchi in Cocos2D?"

Capito. Ho dovuto aggiungere un po 'di codice alla class personalizzata:

File di intestazione:

 // // CustomCCNode.h // Coco2dTest2 // // Created by Ethan Mick on 3/11/10. // Copyright 2010 Wayfarer. All rights reserved. // #import "cocos2d.h" @interface CustomCCNode : CCSprite <CCTargetedTouchDelegate> { } @property (nonatomic, readonly) CGRect rect; @end 

Implementazione:

 // // CustomCCNode.m // Coco2dTest2 // // Created by Ethan Mick on 3/11/10. // Copyright 2010 Wayfarer. All rights reserved. // #import "CustomCCNode.h" #import "cocos2d.h" @implementation CustomCCNode - (CGRect)rect { CGSize s = [self.texture contentSize]; return CGRectMake(-s.width / 2, -s.height / 2, s.width, s.height); } - (BOOL)containsTouchLocation:(UITouch *)touch { return CGRectContainsPoint(self.rect, [self convertTouchToNodeSpaceAR:touch]); } - (void)onEnter { [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; [super onEnter]; } - (void)onExit { [[CCTouchDispatcher sharedDispatcher] removeDelegate:self]; [super onExit]; } - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { NSLog(@"ccTouchBegan Called"); if ( ![self containsTouchLocation:touch] ) return NO; NSLog(@"ccTouchBegan returns YES"); return YES; } - (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touchPoint = [touch locationInView:[touch view]]; touchPoint = [[CCDirector sharedDirector] convertToGL:touchPoint]; NSLog(@"ccTouch Moved is called"); } - (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { NSLog(@"ccTouchEnded is called"); } @end 

Sono un mendicante a questo, ma questo file mi ha salvato un sacco di problemi, ora capisco molte più cose, e il modo per creare un'istanza appropriata è questo: (alless come ho fatto)

 +(id)scene{ CustomCCNode *myNode = [CustomCCNode spriteWithFile:@"myPng.png"]; myNode.position = ccp(150,150); [scene addChild:myNode]; return scene; } 

Apri la console e guarda i messaggi inviati quando vengono triggersti ​​gli events touch.