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
    //... 
} 

このエラーが発生しています:

callbackMethod_(targetCallback_,selector_,target_, data_) の EXC_BAD_ACCESS;

CCActionInstant.m ファイルで。

また、CCSpeed が遅延のない CCCallFuncND をラップするため、このエラーがスローされるのでしょうか。もしそうなら、代わりの提案はありますか?

助けてくれてありがとう!

4

2 に答える 2

1

これが原因でクラッシュしています:

multiplierSpeed = [NSNumber numberWithFloat:1.0f];

... init には保持されません。アクション コールバックに到達するまでに、そのオブジェクトは解放され、無効になっています。とにかく、その値を NSNumber に格納する正当な理由はおそらくありません。iVar を CGFloat として設定すると、保持を気にせずに乗数を保存してアクセスできます。それが NSNumber として本当に必要な場合は、init で (またはプロパティを介して) 保持し、必要に応じて解放する必要があります。少なくとも、dealloc で。

于 2012-04-21T04:12:53.213 に答える
1

multiplierSpeed だけでなく、self.multiplierSpeed を使用する必要があります。

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

そしてCCLOGで、

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

self.varName を使用しない限り、Objective-c はゲッター/セッター メソッドを使用せず、インスタンス変数に直接アクセスしようとするため、メモリ アクセスが悪化します (その変数にメモリが割り当てられていないため)。

于 2012-04-21T06:03:19.137 に答える