如何在Cocos2d中执行此操作?

时间:2011-05-09 19:00:57

标签: iphone xcode xcode4 cocos2d-iphone

对于糟糕的问题标题感到抱歉,这只是一个标题似乎很大的问题。所以这是污垢:

我正在制作一个游戏(显然),我希望敌人能够射击(不一定是玩家)。我希望将shoot方法放在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 :(得分:0)

从我所看到的(以及我只使用cocos2d-x的事实)我只能告诉你测试它是否在你的射击功能内部进行测试,但我想你是在使用CCCallFuncO坏的somhow ,也许你必须称它为enemy2参数传递actionWithTarget(我可以说这就是cocos2d-x的工作方式),还要检查大小敌人类型是否可以自由转换。

答案 1 :(得分:0)

看起来您的CCCallFuncO正在调用[self shoot:enemy2],其中self是HelloWorldLayer对象,但是{Enears类中定义了shoot

修改

buffDude应该在分配之前释放并在之后保留它,如下所示:

改变这个:

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

到此:

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

这假设这是唯一分配buffDude的地方。如果它也被分配到其他地方,请确保正确保留并在那里释放它。

虽然,我想的越多,我就不明白为什么每次调用buffDude时都会创建一个新的shoot。我不确定你在做什么,所以我不会说这是错的,但无论如何它对我来说都不合适。