CGRectContainsPoint проблемы - PullRequest
       18

CGRectContainsPoint проблемы

0 голосов
/ 20 февраля 2012

В моей тестовой игре у меня есть несколько спрайтов ( Bubbles = NSMutableArray), которые появляются в произвольном месте в нижней части экрана.

У меня есть addBubble и spawBubble методы:

- (void) addBubble {

CGSize winSize = [[CCDirector sharedDirector] winSize]; 
bubbles = [[NSMutableArray alloc] init];

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"bubbleSpriteList.plist"];
CCSpriteBatchNode *bubbleSpriteList = [CCSpriteBatchNode batchNodeWithFile:@"bubbleSpriteList.png"];
[self addChild:bubbleSpriteList];



bigBubble = [CCSprite spriteWithSpriteFrameName:@"bubble"];
[self addChild:bigBubble];
[bubbles addObject:bigBubble];


for (CCSprite *bubble in bubbles) {


    int minX = bubble.contentSize.width/2;
    int maxX = winSize.width-bubble.contentSize.width/2;
    int rangeX = maxX - minX;
    int actualX = (arc4random() % rangeX) + minX;
    bubble.position = ccp(actualX, 0);


    int minSpeed = 15.0;
    int maxSpeed = 20.0;
    int rangeSpeed = maxSpeed - minSpeed;
    int actualSpeed = (arc4random() % rangeSpeed) + minSpeed;


    ccBezierConfig bubblePath;
    bubblePath.controlPoint_1 = ccp(200, winSize.height/3);
    bubblePath.controlPoint_2 = ccp(-200, winSize.height/1.5);
    bubblePath.endPosition = ccp(0, winSize.height+bubble.contentSize.height/2);
    id bezierMove = [CCBezierBy actionWithDuration:actualSpeed bezier:bubblePath];

    [bubble runAction:bezierMove]; 
}}
-(void)spawBubble:(ccTime)dt {
[self addBubble];}

Затем в моем методе init я добавил фон и метод spawBubble со случайным интервалом времени

[self schedule:@selector(spawBubble:) interval:actualTime];

Я пытаюсь сделать так, чтобы каждый пузырь из Пузыри дул, когда его коснулись, с этим кодом

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [touch locationInView:[touch view]];
touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation];
touchLocation = [self convertToNodeSpace:touchLocation];

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [touch locationInView:[touch view]];
touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation];
touchLocation = [self convertToNodeSpace:touchLocation];

for (CCSprite *bubble in bubbles) {
CGRect bubbleRect = CGRectMake(bubble.position.x - (bubble.contentSize.width/2), 
                                   bubble.position.y - (bubble.contentSize.height/2), 
                                   bubble.contentSize.width, 
                                   bubble.contentSize.height);
    if (CGRectContainsPoint(bubbleRect, touchLocation)) {            
        NSLog(@"%i", [bubbles count]);
        [bubble setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"bubbleBlow"]];
        id disappear = [CCFadeTo actionWithDuration:0.1 opacity:0];
        [bubble runAction:disappear];            
    }
}

return TRUE;}

Все пузыри дуют идеально, если только один пузырьна экране, но если на экране появился один пузырь, а другой - только последний, он обнаруживает прикосновения.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2012

Я изменил addBubble методы, удалив bubbles = [[NSMutableArray alloc] init]; и добавив его в init метод ... Теперь все работает отлично! )

0 голосов
/ 20 февраля 2012

Трудно сказать, не видя больше кода - но вот с чего бы я начал:

Над этой строкой:

for (CCSprite *bubble in bubbles) {

добавить:

NSLog(@"%i", [bubbles count]);

РЕДАКТИРОВАТЬ:

На основе кода, который вы добавили:

Ваша проблема с этой строкой:

bubbles = [[NSMutableArray alloc] init];

, который эффективно стирает ваш массив bubbles каждый раз, когда вы добавляете новый пузырь.

Итак, в массиве будет только один пузырь - последний.

Отсюда проблема, с которой вы столкнулись.

...