2011-10-08 40 views
0

我知道cocos2d有調度回調來做很好的事情,但是當你需要使用一個CCAction(如CCMoveTo)來將一個精靈從位置a移動到b時,你沒有能力只要動作有效,就對小精靈位置進行小的位置安排。cocos2d子分類

我發現的唯一可能的方法是通過製作一個CCMoveTo的子類來檢查障礙物,並因此提供某種向左或向右的移動,以便從頂部移動到底部的精靈iPhone屏幕。問題是子類沒有訪問父類的實例變量(如startPosition_之一),因爲它們沒有被聲明爲屬性。

所以我用下面的代碼片段來克服這種情況,但我不知道我做錯了什麼......

- (void)myUpdate:(ccTime)time { 
if(delegate && method_) { 
    NSNumber *num = (NSNumber *)[delegate performSelector:method_ withObject:ownTarget]; 

    if(num) { 
    double xpos = [num doubleValue]; 
    [num release]; 

    CCMoveTo *parent = [super retain]; 

    parent->startPosition_.x += xpos; 

    [parent release]; 
} 

[super update:time]; 
} 

它是正確的保留/釋放超一流的? 「[超級更新:時間];」在代碼的底部將做出最終定位。

回答

0
CCMoveTo *parent = [super retain]; 

哎唷!這一說法絕對沒有意義。這是一樣的文字:

[self retain]; 

至於訪問超類的實例變量:除非他們宣佈@private你可以訪問它們。我剛剛檢查:他們不是@私人。你應該能夠在你的子類來寫:

startPosition_.x += xpos; 

如果不行請確保您的類是真正CCMoveTo的一個子類,而不是其它類。

最後,我想說的是,在實現遊戲性時,動作非常有限。根據速度矢量,通過每幀修改其位置屬性來簡單地設置動畫效果可能會更好。您在位置和位置更新方面擁有更多的自由度,而且每次運行新操作時都不會有諸如一幀延遲等行爲的副作用。

-(void) update:(ccTime)delta 
{ 
    // modify velocity based on whatever you need, ie gravity, or just heading in one direction 
    // then update the node's position by adding the current velocity to move it: 
    self.position = CGPointMake(self.position.x + velocity.x, self.position.y + velocity.y); 
}