2010-03-13 2 views
8

OK, quindi sto iniziando a saperne 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.Come far sì che gli oggetti reagiscano ai tocchi in Cocos2D?

Quello che voglio fare è creare uno sprite sullo schermo (Fatto) e poi quando tocco 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 classes 
#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 oggetto, lo sprite, che creo il CGRect per. Non posso farlo per 2 folletti, cosa che stavo testando. Quindi la mia domanda è questa: come posso avere tutti gli sprite sullo schermo reagire allo stesso evento quando viene toccato?

Per il mio programma, è necessario eseguire lo stesso evento per tutti gli oggetti dello stesso tipo, in modo da renderlo un po 'più semplice. Ho provato a creare una sottoclasse 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 hanno fatto una sottoclasse e sovrascritto la metodi:

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

Così ora riesco a capire perché il mio non funziona ... hmm ...

risposta

11

ho capito. Ho dovuto aggiungere un po 'di codice alla classe personalizzata:

intestazione del file:

// 
// 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 
+1

quindi come si fa ad esempio questa nuova classe con un file png, ad esempio? –

+0

Hai ancora bisogno di sapere? Questa era solo una sottoclasse di CCSprite, quindi: CCSprite * aSprite = [CCSprite spriteWIthTexture: [Aggiungi il png qui con CCTexture]]; –

+2

È inoltre possibile utilizzare la proprietà boundingBox anziché il metodo rect personalizzato. –

-2

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

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

Aprire la console e osservare i messaggi inviati quando vengono attivati ​​gli eventi tocco.