2011-07-29 16 views
1

Je développe mon premier jeu avec cocos2d et j'ai rencontré un problème dont je n'arrive pas à trouver la bonne solution. J'ajoute et j'anime un CCSprite chaque seconde du haut de l'écran vers le bas et j'ai besoin de cacher ces sprites lorsque le joueur touche l'un d'eux. J'ai donc pensé à donner des balises à tous les sprites que j'ajoute et plus tard à l'accès à ce sprite avec ce tag particulier. Ai-je besoin de mettre le numéro d'étiquette dans un tableau comme ils sont incrémentés chaque seconde avant même que je les accède à la méthode tactile?La mise en œuvre de touches sur plusieurs CCSprites dans Cocos2d dans le bon sens ??

- (void)addStraightBugs 
{ 
currentAntTag++; 

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"smallAunt.plist"];   

spriteSheetmedAnt = [CCSpriteBatchNode batchNodeWithFile:@"smallAunt.png"]; 
[self addChild:spriteSheetmedAnt z:0 tag:kSpriteManager]; 

CCSprite *ant= [CCSprite spriteWithSpriteFrameName:@"small-aunt1.png"]; 
[spriteSheetmedAnt addChild:ant z:1 tag:currentAntTag]; 

NSMutableArray *walkAnimFrames = [NSMutableArray array]; 
for(int i = 1; i <= 2; ++i) { 
    [walkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"small-ant%d.png", i]]]; 
} 

CCAnimation *walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:0.15f]; 
CCAction *action=[CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]]; 


ant.position = ccp(100,500); 
[ant runAction:action]; 

CGPoint realDest = ccp(60,140); 

int minDuration = 2.0; 
int maxDuration = 5.0; 
int rangeDuration = maxDuration - minDuration; 
int actualDuration = (arc4random() % rangeDuration) + minDuration; 

[ant runAction:[CCSequence actions: 
         [CCMoveTo actionWithDuration:actualDuration position:realDest], 
         [CCCallFuncN actionWithTarget:self selector:@selector(moveFinished:)], 
         nil]]; 

} 

-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
CGPoint touchLocation = [self convertTouchToNodeSpace:touch]; 

CCSpriteBatchNode *spriteManager; 
spriteManager = (CCSpriteBatchNode*)[self getChildByTag:kSpriteManager]; 
CCSprite *ant = (CCSprite*)[spriteManager getChildByTag:currentAntTag]; 

CGRect abc= CGRectInset([ant boundingBox],30, 85); 

if(CGRectContainsPoint(abc,touchLocation)) 
{ 

    ant.visible=NO; 
} 
} 

aussi j'ai 3 méthodes que l'on appelle toutes les quelques secondes où je crée ces CCSpriteFrameCache et l'objet CCSpriteBatchNode pour faire ma course de caractère alors qu'il anime. Sera-t-il trop facile de créer des caches chaque seconde comme ceci ou devrais-je les créer dans la méthode init et juste lancer l'action sur CCSprite ici ??

Répondre

2

Sous-classe CCSprite. Puis, il est INIT:

[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:NO]; 

Mettre en oeuvre les méthodes de ccTouch:

- (BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event; 
- (void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event; 
- (void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event; 
- (void) ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; 

Maintenant, vous avez deux options. Vous pouvez avoir une variable de délégué à rappeler ou utiliser NSNotifications. Aller avec le rappel ici, c'est plus rapide.

// in your @interface 
id touchDelegate; // between the {}'s 

@property (nonatomic, assign) id touchDelegate; 

l'intérieur de votre classe de jeu, lorsque vous créez vos méchants:

NewCCSprite = newSprite = [NewCCSprite init]; 
newSprite.touchDelegate = self; 

Et lorsque vous touchez un:

- (void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { 
    if (self.touchDelegate == nil) return; 
    [self.touchDelegate performSelector:@selector(touched:) withDelay:0.0f]; 
} 

Enfin, votre contact: méthode:

- (void) touch:(id)sender { 
    NewCCSprite* sprite = (NewCCSprite*)sender; 
    // hide/kill off/etc 
} 
Questions connexes