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 ...
quindi come si fa ad esempio questa nuova classe con un file png, ad esempio? –
Hai ancora bisogno di sapere? Questa era solo una sottoclasse di CCSprite, quindi: CCSprite * aSprite = [CCSprite spriteWIthTexture: [Aggiungi il png qui con CCTexture]]; –
È inoltre possibile utilizzare la proprietà boundingBox anziché il metodo rect personalizzato. –