0

我需要在 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
    //... 
} 

我收到此错误:

回调方法上的 EXC_BAD_ACCESS_(targetCallback_,selector_,target_, data_);

在 CCActionInstant.m 文件中。

另外,是不是因为 CCSpeed 环绕了没有延迟的 CCCallFuncND,所以抛出了这个错误?如果是这样,您有任何替代建议吗?

感谢您的帮助!

4

2 回答 2

1

它崩溃了,因为:

multiplierSpeed = [NSNumber numberWithFloat:1.0f];

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

于 2012-04-21T04:12:53.213 回答
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 分配内存)

于 2012-04-21T06:03:19.137 回答