2012-04-18 54 views
0

我需要在CCSpeed延遲後調用函數,以便動態更改速度。據我所知,我不能在CCSequence中使用CCSpeed,所以我嘗試在CCSpeed內部使用CCSequence(CCDelayTime,CCCallFuncND,nil),這似乎也不起作用。任何人有任何建議?在我的BackgroundLayer類,我有一個NSNumber * multiplierSpeed;我有一個NSNumber * multiplierSpeed; :Cocos2D CCSpeed延遲後調用函數

@interface BackgroundLayer : CCLayer { 
    NSNumber *multiplierSpeed; 
} 
@property (nonatomic, retain) NSNumber *multiplierSpeed; 

-(void)rotateWorldAndSwapIn:(id)sender data:(int)frame; 
@end 

而且在我的實現:

@synthesize multiplierSpeed; 
-(id)init { 
    self = [super init]; 
    if (self != nil) { 
     //... 
     multiplierSpeed = [NSNumber numberWithFloat:1.0f]; 
     CCSpeed *delay = [CCSpeed actionWithAction:[CCSequence actions:[CCDelayTime actionWithDuration:20],[CCCallFuncND actionWithTarget:self selector:@selector(rotateWorldAndSwapIn:data:) data:(void*)3], nil] speed:1.0f]; 
     [delay setTag:10]; 
     [self runAction:delay]; 
     //... 
    } 
} 

-(void)rotateWorldAndSwapIn:(id)sender data:(int)frame { 
    CCLOG(@"test"); //This is fine 
    CCLOG(@"multiplierSpeed=%f",[multiplierSpeed floatValue]); //Crashes here 
    //... 
} 

我收到此錯誤:

上callbackMethod_(targetCallback_,selector_,TARGET_,data_中)EXC_BAD_ACCESS;

CCActionInstant.m文件中。

另外,是否因爲CCSpeed環繞CCCallFuncND,它沒有延遲,這是拋出這個錯誤?如果是這樣,你有其他建議嗎?

感謝您的幫助!

回答

1

您需要使用self.multiplierSpeed而不是multiplierSpeed。

self.multiplierSpeed = [NSNumber numberWithFloat:1.0f]; 

,然後在CCLOG,

CCLOG(@"multiplierSpeed=%f",[self.multiplierSpeed floatValue]); //Won't crash anymore 

除非你使用self.varName,Objective-C中不會使用getter/setter方法,而會嘗試直接訪問實例變量導致不良的內存訪問(因爲沒有爲該變量分配內存)

+0

Thanks!這樣的noob錯誤,我感謝你的幫助! – Cody 2012-04-29 18:53:33

1

它崩潰,因爲這一點:

multiplierSpeed = [NSNumber numberWithFloat:1.0f]; 

...是不是在你的初始化保留。到達動作回調時,該對象已被釋放並且無效。無論如何,可能沒有理由將該值存儲在NSNumber中。將您的iVar設置爲CGFloat,然後您可以存儲和訪問乘數而不用擔心保留。如果你真的需要這個NSNumber,你需要在init(或通過屬性)中保留它,然後在適當的時候釋放它,至少在你的dealloc中。