CCSpeed延迟后的Cocos2D调用功能

时间:2012-04-18 04:16:20

标签: iphone objective-c ios cocos2d-iphone

我需要在CCSpeed延迟后调用一个函数,以便我可以动态更改速度。据我所知,我不能在CCSequence中使用CCSpeed,所以我尝试在CCSpeed中使用CCSequence(CCDelayTime,CCCallFuncND,nil),这似乎也不起作用。有人有什么建议吗?

在我的BackgroundLayer类中,我有一个NSNumber * multiplierSpeed; :

@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_上的EXC_BAD_ACCESS(targetCallback_,selector_,target_,data _);

在CCActionInstant.m文件中。

另外,是因为CCSpeed包裹了没有延迟的CCCallFuncND,这会引发这个错误吗?如果是的话,你有其他建议吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

因为这个而崩溃:

multiplierSpeed = [NSNumber numberWithFloat:1.0f];

...不会保留在您的init中。当您进入动作回调时,该对象已被释放且无效。无论如何,将该值存储在NSNumber中可能没有充分的理由。将您的iVar设置为CGFloat,然后您可以存储和访问乘数而无需担心保留。如果你真的需要它作为NSNumber,你需要在init(或通过属性)中保留它,然后在适当时释放它,至少在你的dealloc中。

答案 1 :(得分: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方法,而是会尝试直接访问实例变量,导致内存访问不良(因为没有为该var分配内存)