2012-12-10 56 views
0

我需要執行以下操作:將精靈移動到某個位置,當精靈進入此位置時,需要執行反向操作。
對於本例中的測試,我只是在達到該位置時打印「ok」,避免過度釋放該操作並冒一些異常。無法檢測運行動作的精靈的確切位置

-(id) init 
{ 
    if((self=[super init])) 
    { 
     soldier=[CCSprite spriteWithFile: @"soldier.gif"]; 
     soldier.position= CGPointMake(250, 250); 
     [self addChild: soldier]; 
     CGPoint position=[soldier convertToNodeSpace: CGPointZero]; 
     CCMoveTo* move=[CCMoveBy actionWithDuration: 2 position: position]; 
     [move retain]; 
     [soldier addObserver: self forKeyPath: @"position" options: NSKeyValueObservingOptionNew context: (void*)move]; 
     [soldier runAction: move]; 
    } 
    return self; 
} 

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    CGPoint position= [self convertToNodeSpace: soldier.position]; 
    if(CGPointEqualToPoint(position, CGPointZero)); 
    { 
     NSLog(@"ok"); 
    } 
} 

問題是,它打印「好」很多次,它應該只打印一次,爲什麼?

編輯

我刪除多餘的 ';' :

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    CGPoint position= [self convertToNodeSpace: soldier.position]; // breakpoint here 
    if(CGPointEqualToPoint(position, CGPointZero)) 
    { 
     NSLog(@"ok"); 
    } 
} 

現在,它永遠不會打印「確定」。在我打印位置和最後一個值是(47,47)斷點,它從來沒有達到(0,0)。

回答

1

我不會在cocos2d中使用KVO/KVC,原因很簡單,因爲cocos2d不符合KVC/KVO標準。一個Cocos2D類的屬性可能會改變,而你沒有收到通知。

我不知道這裏是否存在問題,但如果您繼續使用KVC/KVO,最終會遇到問題,這很有可能。

+0

那麼你會建議什麼?我需要知道行動停止。 –

2

刪除-observeValueForKeyPath:ofObject:change:context:方法中if語句第一行後面的分號。正因爲如此,NSLog函數被無條件地調用。

+0

謝謝。所以現在它不打印很多好的,但它從不打印好。我編輯了答案。 –

+0

@RamyAlZuhouri由於您正在執行'CGPoint'的轉換,爲什麼不嘗試在裏面放置'NSLog'語句來直觀地確定轉換的點是否到達'CGPointZero'? – trudyscousin

+0

它到達的最後一點是(47,47)。 –