Как это сделать в Cocos2d? - PullRequest
0 голосов
/ 09 мая 2011

Извините за плохое название вопроса, просто это кажется большим для названия.Итак, вот грязь:

Я делаю игру (очевидно) и хочу, чтобы враги стреляли (не обязательно в игрока).Я хочу, чтобы метод съемки был в файле Enemies, чтобы не загромождать мой файл HelloWorldLayer.m еще больше.Вот что я использую прямо сейчас:

HelloWorldLayer.m

-(void)addEnemy:(BigAndStrongEnemy *)enemy {
enemy = nil;
if((arc4random() % 4) == 3) {
    enemy = [BigAndStrongEnemy enemy];
} else {
    enemy = [SmallAndFastEnemy enemy];
}

if(buffDude.position.y > character.position.y || buffDude.position.y < (character.position.y + 10)) {

}

int rand = arc4random() % 320;

if((arc4random() % 2 == 1)) {
    [enemy setPosition:ccp(0,rand)];
}else{
    [enemy setPosition:ccp(480,rand)];
}
[self animateEnemy:enemy];
[self addChild:enemy];
}

-(void)animateEnemy:(BigAndStrongEnemy *)enemy2 {
    float randX = arc4random() % 480;
    float randY = arc4random() % 320;
    int rand = arc4random() % 320;

CGPoint moveToPoint = CGPointMake(randX, (randY - rand));

[enemies addObject:enemy2];

action = [CCSequence actions:
          [CCMoveBy actionWithDuration:1 position:ccpMult(ccpNormalize(ccpSub(moveToPoint, enemy2.position)), 75)],
          [CCMoveBy actionWithDuration:3 position:ccp(buffDude.position.x,buffDude.position.y)],
          nil];

CCCallFuncO *a = [CCCallFuncO actionWithTarget:self selector:(@selector(shoot:)) object:enemy2];
CCSequence *s = [CCSequence actions:action,a, nil];

CCRepeatForever *repeat = [CCRepeatForever actionWithAction:s];

[enemy2 runAction:repeat];
}

А вот информация о стрельбе из класса врагов:

Enemies.m:

    -(void)shoot:(id)sender {
    BigAndStrongEnemy *enemy = (BigAndStrongEnemy *)sender;
    [enemy shoot];
}

-(void)spriteMoveFinished:(id)sender {
    CCSprite *b = (CCSprite *)sender;
    [self removeChild:b cleanup:YES];
}

-(void)shoot {
    buffDude = [CCSprite spriteWithFile:@"bigAndStrongEnemy.gif"];
    CCSprite *b = [CCSprite spriteWithFile:@"bullet.gif"];
    b.position = ccp(self.position.x,self.position.y);
    b.tag = 2;
    [self addChild:b];
    [bullets addObject:b];


CGSize winSize = [[CCDirector sharedDirector] winSize];

CGPoint point = CGPointMake((winSize.width - (winSize.width - self.position.x)),0);

[b runAction:[CCSequence actions:
              [CCMoveBy actionWithDuration:0.5 position:point],
              [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)],
              nil]];
}

Каждый раз, когда проходят 3 секунды, приложение вылетает и переходит к точке останова в файле CCCallFuncO.Я этого не трогал, вот в чем дело.Я полностью сбит с толку.Любая помощь очень ценится.Извините за длинный вопрос.Спасибо !!

Ответы [ 2 ]

0 голосов
/ 10 мая 2011

Похоже, ваш CCCallFuncO вызывает [self shoot:enemy2], где self - это объект HelloWorldLayer, но shoot определено в классе врагов.

Edit:

buffDude должен быть освобожден перед назначением, а затем сохранен, как это:

Изменить это:

buffDude = [CCSprite spriteWithFile:@"bigAndStrongEnemy.gif"];

к этому:

[buffDude release];
buffDude = [CCSprite spriteWithFile:@"bigAndStrongEnemy.gif"];
[buffDude retain];

Предполагается, что это единственное место, где назначено buffDude. Если он также назначен в другом месте, убедитесь, что вы правильно сохранили и отпустите его там.

Хотя, чем больше я об этом думаю, я не понимаю, почему вы создаете новый buffDude каждый раз, когда вызывается shoot. Я не уверен, что ты делаешь, поэтому не скажу, что это неправильно, но в любом случае мне это не кажется правильным.

0 голосов
/ 10 мая 2011

из того, что я вижу (и тот факт, что я работал только с cocos2d-x), я могу только сказать вам, чтобы проверить, входит ли он в вашу функцию съемки или нет, но я предполагаю, что вы все равно используете CCCallFuncO плохо, возможно Вы должны вызывать его, передавая enemy2 также для параметра actionWithTarget (я могу сказать, что именно так работает cocos2d-x), также проверьте, можно ли свободно конвертировать большие и маленькие типы врагов вместе.

...