2011-01-16 3 views
3

Ich folgte Ray`s Tutorial, um ein einfaches iPhone-Spiel zu erstellen (hier: http://goo.gl/fwPi) und entschied, dass ich die Feinde eliminieren wollte, wenn sie berührt wurden.Erkennen, ob ein bestimmtes Sprite berührt wurde Cocos2d-iphone

Mein erster Ansatz bestand darin, ein kleines CCSprite-Sprite auf der Touch-Position zu erzeugen, und dann mit CGRectMake eine Bounding-Box des Sprites zu erstellen, um zu erkennen, ob das Feind-Sprite berührt wurde. Ähnlich wie Ray mit dem Projektil/Feind. Aber natürlich funktioniert meine Art zu arbeiten nicht und ich kann mich nicht aus diesem Loch herausgraben.

Hier ist das entsprechende Code-Snippet. Jede Hilfe wird geschätzt:

 
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    // Choose one of the touches to work with 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [self convertTouchToNodeSpace: touch]; 
    location = [[CCDirector sharedDirector] convertToGL:location]; 
    CCSprite *touchedarea = [CCSprite spriteWithFile:@"Icon-72.png" rect:CGRectMake(location.x, location.y, 2, 2)]; 
    touchedarea.tag = 2; 
    [self addChild:touchedarea]; 
    [_touchedareas addObject:touchedarea]; 

} 



- (void)update:(ccTime)dt { 

    NSMutableArray *touchedareasToDelete = [[NSMutableArray alloc] init]; 
    for (CCSprite *touchedarea in _touchedareas) { 
     CGRect touchedareaRect = CGRectMake(
              touchedarea.position.x, 
              touchedarea.position.y, 
              touchedarea.contentSize.width, 
              touchedarea.contentSize.height); 

     NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init]; 
     for (CCSprite *target in _targets) { 
      CGRect targetRect = CGRectMake(
              target.position.x - (target.contentSize.width/2), 
              target.position.y - (target.contentSize.height/2), 
              target.contentSize.width, 
              target.contentSize.height); 

      if (CGRectIntersectsRect(touchedareaRect, targetRect)) { 
       [targetsToDelete addObject:target];    
      }      
     } 

     for (CCSprite *target in targetsToDelete) { 
      [_targets removeObject:target]; 
      [self removeChild:target cleanup:YES];         
     } 

     if (targetsToDelete.count > 0) { 
      [touchedareasToDelete addObject:touchedarea]; 
     } 
     [targetsToDelete release]; 
    } 

    for (CCSprite *touchedarea in touchedareasToDelete) { 
     [_touchedareas removeObject:touchedarea]; 
     [self removeChild:touchedarea cleanup:YES]; 
    } 
    [touchedareasToDelete release]; 
} 
+0

fragte ich eine Frage zu best Practices für diese: http://stackoverflow.com/questions/2900691/ Best-Practices-zur-Handhabung-berührt-zu-ccsprite-mit-c ocos2d Hoffe das hilft! – donkim

Antwort

7

Das sieht wie ein sehr schwieriger Weg aus, es zu tun. Ich habe selbst lange nicht programmiert, aber vielleicht könnte das folgende helfen. lassen Sie uns sagen, Sie haben ein nsmutablearray namens Feinde und Sie fügen das neue Feindobjekt zu diesem Array, wenn Sie ein neues erstellen. Feindobjekt wäre ein ccnode sein und eine ccsprite haben in ihm _enemySprite genannt Sie dann die Note

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    { 

    NSSet *allTouches = [event allTouches]; 
    UITouch * touch = [[allTouches allObjects] objectAtIndex:0]; 
    //UITouch* touch = [touches anyObject]; 
    CGPoint location = [touch locationInView: [touch view]]; 
    location = [[CCDirector sharedDirector] convertToGL:location]; 

    int arraysize = [enemies count]; 
    for (int i = 0; i < arraysize; i++) { 


     if (CGRectContainsPoint([[[enemies objectAtIndex:i] _enemySprite] boundingBox], location)) { 

      //some code to destroy ur enemy here 


     } 
    } 
    // NSLog(@"TOUCH DOWN"); 

} 

hoffe, das hilft

+0

es funktioniert oft nicht. Zum Beispiel, wenn CCSprite zu CCLayer gehört, was nicht den gesamten Bildschirm erfüllt und seine Position nicht ist (0, 0) – Gargo

+0

Aber wenn es convertToGL: hat mir geholfen – richy

2

Eine andere Möglichkeit, es zu tun ist, dass zwischen Berührungsposition und Sprites Berechnung Distanz .. wenn Kontakt zu einem Ihrer Sprites nahe genug ist, kann man es töten .. So etwas ..

for (CCSprite *sprite in anArrayThatCOntainsAllYourSprites) { 

    float distance = pow(sprite.position.x - location.x, 2) + pow(sprite.position.y - location.y, 2); 

    distance = sqrt(distance); 

     if (distance <= 10) { 
       sprite.dead = YES; 
     } 

}