2012-04-18 3 views
0

동적으로 속도를 변경할 수 있도록 CCSpeed ​​지연 후에 함수를 호출해야합니다. 내가 아는 한, CCSequence 내부에서 CCSpeed를 사용할 수 없기 때문에 CCSpeed ​​내부에서 CCSequence (CCDelayTime, CCCallFuncND, nil)를 사용해 보았습니다. CCSpeed도 작동하지 않습니다. 누구든지 어떤 제안이 있습니까?CCSpeed ​​지연 후의 Cocos2D 호출 기능

내 BackgroundLayer 클래스에는 NSNumber * multiplierSpeed가 있습니다. :

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

나는이 오류가 무엇입니까 :

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

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

그리고 내 구현

callbackMethod_ (targetCallback_, selector_, 타겟팅 대상, data_)에 EXC_BAD_ACCESS;

CCActionInstant.m 파일에 있습니다.

또한 CCSpeed가 지연이없는 CCCallFuncND를 감싸기 때문에이 오류가 발생합니까? 그렇다면 다른 대안이 있으십니까?

도와 주셔서 감사합니다.

multiplierSpeed = [NSNumber numberWithFloat:1.0f]; 

... 당신의 초기화에 유지되지 않습니다 :이 때문에

답변

1

multiplierSpeed ​​대신 self.multiplierSpeed를 사용해야합니다.

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

다음 CCLOG에서

,

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

당신이 self.varName를 사용하지 않는 한, 오브젝티브 C는 getter/setter 메서드를 사용하지 않습니다, 오히려 직접 인스턴스 변수에 액세스하려고 할 것이다 잘못된 메모리 액세스가 발생했습니다 (메모리가 var에 할당되지 않았 음)

+0

감사합니다. 그런 멍청한 실수, 네 도움에 감사드립니다! – Cody

1

이 충돌합니다. 액션 콜백에 도달하면 해당 객체가 해제되어 유효하지 않습니다. 어쨌든 NSNumber에 그 값을 저장할 이유가 없습니다. iVar를 CGFloat로 설정하면 보유에 대한 걱정없이 승수를 저장하고 액세스 할 수 있습니다. 이를 NSNumber로서 정말로 필요로한다면 init (또는 속성)을 통해 그것을 유지 한 다음 적어도 dealloc에서 적절할 때 해제해야합니다.