Простое обнаружение столкновений в cocos2d box2d .. при столкновении ничего не происходит - PullRequest
1 голос
/ 11 февраля 2012

Я пытаюсь понять, как это сделать, у меня есть спрайт под названием «игрок» и спрайты под названием «камень» Я пытаюсь обнаружить столкновение между обоими спрайтами ..... но ничего не происходит при столкновении!

вот что я сделал:

-(void)addRock {

rock = [CCSprite spriteWithFile:@"rock.png" 
                                     rect:CGRectMake(0, 0, 27, 40)]; 

// Determine where to spawn the target along the X axis
CGSize winSize = [[CCDirector sharedDirector] winSize];
int minX = rock.contentSize.width/2;
int maxX = winSize.width - rock.contentSize.width/2;
int rangeX = maxX - minX;
int actualX = (arc4random() % rangeX) + minX;
// Create the target slightly off-screen along the right edge,
// and along a random position along the X axis as calculated above
rock.position = ccp(actualX, 500);
rock.tag = 1;
[rockArray addObject:rock];
[self addChild:rock];

код игрока ниже:

-(id) init{
if( (self=[super initWithColor:ccc4(255, 255, 255, 255)] )) {
    CGSize winSize = [[CCDirector sharedDirector] winSize];
    player = [CCSprite spriteWithFile:@"Player.png" 
                                           rect:CGRectMake(0, 0, 27, 40)];
    player.position = ccp(winSize.width/2, winSize.height/4+15); //position of where the player is placed
    player.tag = 2;
    [playerArray addObject:player];
    [self addChild:player];

движение спрайта завершено:

-(void)spriteMoveFinished:(id)sender {


CCSprite *sprite = (CCSprite *)sender;
[self removeChild:sprite cleanup:YES];

if (sprite.tag == 1) { // rock
    [rockArray removeObject:sprite];
} else if (sprite.tag == 2) { // players
    [playerArray removeObject:sprite];

init (инициализация массива):

rockArray = [[NSMutableArray alloc]init];
    playerArray = [[NSMutableArray alloc]init];
    [self schedule:@selector(update:)];

метод обновления

- (void)update:(ccTime)dt {


    NSMutableArray *rocksToDelete = [[NSMutableArray alloc] init];
    for (rock in rockArray) {
        CGRect rockRect = CGRectMake(
                                       rock.position.x - (rock.contentSize.width/2), 
                                       rock.position.y - (rock.contentSize.height/2), 
                                       rock.contentSize.width, 
                                       rock.contentSize.height);


    NSMutableArray *playersToDelete = [[NSMutableArray alloc] init];
    for (player in playerArray) {
        CGRect pRect = CGRectMake(

                                        player.position.x - (player.contentSize.width/2), 
                                        player.position.y -(player.contentSize.height/2), 
                                        player.contentSize.width,
                                        player.contentSize.height);

        if (CGRectIntersectsRect(rockRect, pRect)) {
            [rocksToDelete addObject:rock];
        }

        for (rock in rocksToDelete) {
            [rockArray removeObject:rock];
            [self removeChild:rock cleanup:YES];                                    
        }

        if (rocksToDelete.count > 0) {
            [playersToDelete addObject:player];
        }
        [rocksToDelete release];

        for (player in playersToDelete) {
            [playerArray removeObject:player];
            [self removeChild:player cleanup:YES];
        }
        [playersToDelete release];

Я пытался разобраться со своей проблемой всю ночь. Может показаться, что работает обнаружение столкновений. Если так, может кто-нибудь показать мне краткий код?

1 Ответ

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

Для проверки коллизии между двумя спрайтами вам придется вызывать метод каждый кадр (или как часто вы выбираете), чтобы проверить, не произошло ли коллизия. Добавьте следующий код в метод init:

[self scheduleUpdate];

... это вызовет следующий метод (вы должны добавить к реализации вашего класса) в каждом кадре:

-(void)update:(ccTime)delta {
   if (CGRectIntersectsRect(player.boundingBox, rock.boundingBox)) {
       //Do Stuff
   }
}

Чтобы предыдущий код работал, вам нужно объявить спрайт Player и Rock в качестве переменных-членов, чтобы их можно было использовать в классе.

Если у вас есть более одного каменного спрайта в сцене, с которым вы хотите проверить столкновения, вам придется использовать массив. Быстрый пример:

1 Объявите массив в интерфейсе вашего класса:

NSMutableArray *rockArray;

2 Выделите для него память в методе init

rockArray = [NSMutableArray array];

3 В методе addRock добавьте созданный рок-спрайт в массив, а затем в качестве дочернего элемента к сцене

-(void) addRock {
   CCSprite *rock = [CCSprite spriteWithFile:@"rock.png" 
                                     rect:CGRectMake(0, 0, 27, 40)];
   //...

   [rockArray addObject:rock];
   [self addChild:[rockArray lastObject]];
}

4 В методе «update» вы теперь просматриваете массив и проверяете столкновение между rock и player

for (CCSprite *_rock in rockArray) {
   if (CGRectIntersectsRect(player.boundingBox, rock.boundingBox)) {
           //Do Stuff e.g remove that rock from the scene
           [self removeChild:_rock cleanup:YES];
       }
}

Надеюсь, это поможет ;-) Не стесняйтесь задавать любые вопросы

...