2013-03-18 56 views
1

在我實施遊戲時,我只是一個事情的前端,我認爲這很容易,但不知道如何解決。我在Objective-C的有點新的一樣,你可以用我的名譽:(見獲得CABasicAnimation的即時價值

的問題是,我有一個動畫,它工作正常這裏是代碼:

CABasicAnimation * bordgauche = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"]; 
bordgauche.fromValue = [NSNumber numberWithFloat:0.0f]; 
bordgauche.toValue = [NSNumber numberWithFloat:749.0f]; 
bordgauche.duration = t; 
bordgauche.repeatCount = 1; 
[ImageSuivante.layer addAnimation:bordgauche forKey:@"bordgauche"]; 

而且我。想要得到我的形象的當前位置,所以我用:

CALayer *currentLayer = (CALayer *)[ImageSuivante.layer presentationLayer]; 
currentX = [(NSNumber *)[currentLayer valueForKeyPath:@"transform.translation.x"] floatValue]; 

但我不明白,我立即得到一個時間「當前= 0.0000」,這是初始值,當我使用nslog打印它,但不是其他人。 我不知道如何獲得我的i的即時位置法師,currentX,所有的時間。

我希望我很可愛。 感謝您的幫助:)

回答

3

我覺得你有3個選擇在這裏(請評論,如果更多存在):

選項1:分割你的第一個動畫分成兩當上半場結束開始動畫下半年再加上其他動畫

... 
bordgauche.toValue = [NSNumber numberWithFloat:749.0f/2]; 
bordgauche.duration = t/2; 
bordgauche.delegate = self // necessary to catch end of anim 
[bordgauche setValue:@"bordgauche_1" forKey: @"animname"]; // to identify anim if more exist 

... 

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag { 
    if ([theAnimation valueForKey: @"animname"][email protected]"bordgauche_1") { 
     CABasicAnimation * bordgauche = [CABasicAnimation 
        animationWithKeyPath:@"transform.translation.x"]; 
     bordgauche.fromValue = [NSNumber numberWithFloat:749.0f/2]; 
     bordgauche.toValue = [NSNumber numberWithFloat:749.0f]; 
     bordgauche.duration = t/2; 
     bordgauche.repeatCount = 1; 
     [ImageSuivante.layer addAnimation:bordgauche forKey:@"bordgauche_2"]; 


     // plus start your second anim 
} 

選項2:設置NSTimer或CADisplayLink(這是更好的)回調並連續檢查動畫層的參數。測試所需值的參數以觸發第二個動畫。

displayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:self selector:@selector(check_ca_anim)]; 
[displayLink setFrameInterval:1]; 
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 

... or 
animationTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)(1.0/60.0) target:self selector:@selector(check_ca_anim) userInfo:nil repeats:TRUE]; 
[[NSRunLoop mainRunLoop] addTimer:animationTimer forMode:NSRunLoopCommonModes]; 

- (void) check_ca_anim { 
    ... 
    CGPoint currentPosition = [[ImageSuivante.layer presentationLayer] position]; 
    // test it and conditionally start something 
    ... 
} 

選項3:設置一個CADisplayLink通過計算和設置動畫對象的合適的參數(現在可以稱爲「gameloop」)和管理動畫自己。不知道你想創建什麼樣的遊戲我會說遊戲循環可能對其他遊戲特定的原因有用。在這裏我還提到了Cocos2d,它是遊戲開發的一個很好的框架。

+0

我怎樣才能使用C ADisplayLink?它是如何工作的?因爲我設法做我想做的事情,但有計時器,但是當你的設備滯後或收到短信時,計時器被延遲,但其他動畫的作品,所以這不是很好 – user2057209 2013-03-18 21:26:45

+1

CADisplayLink是一個像NSTimer計時器,但有一個主要區別在於它是iPhone顯示屏的刷新率。這就是爲什麼它被用在像Cocos2d這樣的圖形密集型框架中。 – nzs 2013-03-18 21:48:05

+0

我會試試這個。謝謝=) – user2057209 2013-03-18 21:48:10

2

你可以嘗試讓您層的表示層的價值,這應該是接近被呈現在屏幕上的內容:

[ [ ImageSuivante.layer presentationLayer ] valueForKeyPath:@"transform.translation.x" ] ; 
+0

然而,你無法真正獲得確切的位置 - 你想要做什麼? – nielsbot 2013-03-18 20:40:44

+0

當我把這段代碼放到動畫代碼後面的 - (void)函數中時,屏幕上就會出現nothings:/我如何像NSLog(@「...」)那樣打印它? :s我試圖讓我的第一個動畫的位置在第一個動畫的中間開始另一個 – user2057209 2013-03-18 20:44:54

+0

難道不可能嗎? :( – user2057209 2013-03-18 21:12:10

3

您可以從圖層的表示層獲取值。

CGPoint currentPos = [ImageSuivante.layer.presentationLayer position]; 
NSLog(@"%f %f",currentPos.x,currentPos.y); 
0

我想補充一個選項,以什麼@codedad指出。有趣的是,它可以準確獲得動畫圖層的即時值(可以看到CALayer的list of animatable properties),它非常簡單。

如果重寫方法

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx; 
在UIView類

(是的,你需要實現從衍生的UIView爲貴「ImageSuivante」視圖中的自定義類),則該參數這是通過那裏會給你正是你所需要的。它包含用於繪圖的精確值。

E.g.在這種方法中,你可以更新一個適當的時刻變量(與後來的工作),然後調用超,如果你不與你的手繪圖:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context { 
    self.instantOpacity = layer.opacity; 
    self.instantTransform = layer.transform; 
    [super drawLayer:layer inContext:context]; 
} 

注意這裏一般是的與相同的對象self.layer(其中self是您自定義的UIView),例如self.layer.opacity會給你目標的不透明度,但不是即時的一個,而self.instantOpacity上面的代碼將包含你想要的即時值。

請注意,這是一個方法,它可能會被頻繁調用,所以沒有不必要的計算或任何繁重的操作。

這個想法的來源是蘋果的Custom Animatable Property項目。