2011-05-09 139 views
-1

很抱歉,這個問題標題很糟糕,只是這對於一個標題來說似乎很重要。因此,這裏的污物:如何在Cocos2d中做到這一點?

我做一個遊戲(顯然),我想的敵人射擊(不一定在播放器)。我想將拍攝方法放在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文件中的斷點。我沒有碰它,是事情。我完全困惑。任何幫助是極大的讚賞。對於長期的問題抱歉。謝謝!!

+1

可能是gamedev.stackexchange.com一個更好的問題? – 2011-05-09 19:11:28

回答

0

它看起來像你的CCCallFuncO調用[self shoot:enemy2]其中self是HelloWorldLayer對象,但shoot是在Enemies類中定義的。

編輯:

buffDude應分配給它之前被釋放,之後保留它,就像這樣:

更改此:

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

這樣:

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

這是假設這一點是buffDude分配的唯一地方。如果它也被分配到其他地方,請確保您在那裏妥善保留並釋放它。

雖然我對它的看法越多,我也不明白爲什麼每次調用shoot時都會創建一個新的buffDude。我不確定你在做什麼,所以我不會說這是錯誤的,但它對我來說不正確。

+0

@Ed馬蒂耶的C++端口,這是當我試圖一切才能正常工作,我忘了切換回來。之前,這是對buffDude的重新宣言,然後不是自己,而是buffDude。 – ipodfreak0313 2011-05-09 22:21:57

+0

我想知道,buffDude在哪裏存儲?看起來你只要調用了-shoot,就會重新分配buffDude,但是不要對它做任何事情,只要自動釋放池被耗盡,這會導致它自動釋放。然後當你下一次嘗試調用一個方法時,它將不起作用,因爲你正在調用一個自動釋放對象的方法。 – 2011-05-10 01:47:39

+0

@Ed馬蒂我有一個Enemies類作爲CCSprite的子類。我目前在HelloWorldLayer中聲明瞭buffDude,如下所示:BigAndStrongEnemy * buffDude – ipodfreak0313 2011-05-10 02:02:34

0

從我所看到的(以及我只和cocos2d-x一起工作的事實)我只能告訴你測試它是否在你的拍攝功能內步進,但我想你是somhow使用CCCallFuncO不好,也許你必須把它傳遞enemy2也爲actionWithTarget參數(我可以告訴大家,becouse這是cocos2d的-X是如何工作的),還檢查大大小小的敵人類型可自由轉換到一起。

+0

什麼是cocos2d-x?我只知道cocos2d的 – ipodfreak0313 2011-05-12 23:44:42

+0

的是cocos2d的 – Ali1S232 2011-05-13 16:35:14