2012-12-26 71 views
0

我的cocos2d遊戲有問題。我試圖刪除一個敵人每5秒射出一個彈丸(每個彈丸應該有5秒的壽命),但我無法弄清楚如何去做。我得到的每5秒鐘一次刪除一個對象Cocos2d

Assertion failure in -[CCTimer initWithTarget:selector:interval:] 

錯誤這裏是我的代碼:

-(void)projectileShooting:(ccTime)dt 
{ 
    [self schedule:@selector(projectileShooting:) interval:2.5]; 
    projcount++; 
    if([proj count] <= 15){ 
     if(enemy1.position.y < 320){ 
      v = ccp(player.position.x,player.position.y); 
      for(CCSprite *enemies in enemy){ 
      CCSprite * projectilebullet = [CCSprite spriteWithFile:@"Projectile.png"]; 
      [proj addObject:projectilebullet]; 
      [self addChild:projectilebullet]; 
      CGPoint MyVector = ccpSub(enemies.position,player.position); 
      MyVector = ccpNormalize(MyVector); 
      MyVector = ccpMult(MyVector, enemies.contentSize.width/2); 
      MyVector = ccpMult(MyVector,-1); 
      projectilebullet.position = ccpAdd(enemies.position, MyVector); 
      for(CCSprite *projectile in proj){ 
       [self schedule:@selector (deleteprojectile:projectile:) interval:5]; 
      } 
     } 
    } 
} 

for(CCSprite *enem2 in enemytwo) 
{ 
    if( [proj count] <= 15){ 
     CCSprite * projectilebull = [CCSprite spriteWithFile:@"Projectile.png"]; 
     CGPoint MyVector = ccpSub(enem2.position,player.position); 
     MyVector = ccpNormalize(MyVector); 
     MyVector = ccpMult(MyVector, enem2.contentSize.width/2+10); 
     MyVector = ccpMult(MyVector,-1); 
     projectilebull.position = ccpAdd(enem2.position, MyVector); 
     [self addChild:projectilebull]; 
     [proj addObject:projectilebull]; 
     for(CCSprite *projectile in proj){ 
     } 
    } 
} 



} 

-(void)deleteprojectile:(CCSprite *)protime:(ccTime)dt{ 
    NSMutableArray *timepro = [[NSMutableArray alloc]init]; 
    [timepro addObject:protime]; 
    for(CCSprite *objecttime in timepro){ 
     [proj removeObject:objecttime]; 
     [self removeChild:objecttime cleanup:YES]; 
    } 
} 
+0

您正在嘗試刪除預定方法中的子節點,哪些操作不起作用?你得到的行爲是什麼? –

+0

我在 - [CCTimer initWithTarget:selector:interval:]中得到斷言失敗的斷言錯誤 – Alexyuiop

+0

也許它的事實是您在選擇器中使用了錯誤的參數名稱? (即射彈而不是protime) – giorashc

回答

1

這有點破解,但這是我在我的程序中使用,直到我找到一個更優雅的解決方案。我在我的遊戲層的方法,我稱之爲從其父中刪除一個節點,就像這樣:

-(void)removeNode:(CCNode*)node { 
    [node removeFromParentAndCleanup:YES]; 
} 

而當我想的延遲之後調度要刪除的節點,我這樣稱呼它:

[self performSelector:@selector(removeNode:) withObject:node afterDelay:delay]; 

簡單,它的工作原理。

+0

謝謝,它現在可行! – Alexyuiop

0

更改參數名,您選擇到凝血酶原,而不是。選擇器必須與您對象的類定義中定義的簽名匹配。 您的選擇器沒有正確定義,可能Timer正在檢查對象是否實現了給定的選擇器。

我沒時間去測試它,所以感謝@RamyAlZuhouri的確認。

+0

這是行不通的,因爲在射彈襲擊方法中沒有protime sprite。我在做delete(deleteprojectile:projectile :)來傳遞方法deleteprojectile中的子彈精靈。子彈然後被傳遞給刪除彈丸方法中的原型,所以這不是我想的問題。 – Alexyuiop

+0

@Alexyuiop,如果你有一個名爲彈丸的精靈,它沒有任何關係。只要看看你試圖調用的方法的簽名,並看看你傳遞給調度方法的選擇器。 – giorashc