2013-03-18 4 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]; 

Но я не понимаю мгновенно я один раз «Current = 0,0000», которая является начальным значением, когда я использую nslog для печати, но не остальные после. Я не знаю, как получить мгновенную позицию моего i mage, currentX, все время.

Ожидаю, что я был поддающимся. Спасибо за вашу помощь :)

ответ

3

Я думаю, у вас есть 3 варианта здесь (пожалуйста комментарии, если больше есть):

option1: разделить вашу первую анимацию на два и, когда первая половина заканчивается начать вторую половину анимации плюс другой анимации

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

OPTION3: настроить CADisplayLink (можно теперь называть как «gameloop») и управлять анимации самостоятельно путем расчета и установления соответствующих параметров объекта оживляющий. Не зная, какую игру вы хотели бы создать, я бы сказал, что игровой цикл может быть полезен по другим причинам игры. Также здесь я упоминаю Cocos2d, который является отличной основой для разработки игр.

+0

Как я могу использовать C ADisplayLink? Как это работает ? Поскольку мне удается делать то, что я хочу делать, но с таймером, но когда ваше устройство отстает или получает sms, таймер задерживается, но работает другая анимация, поэтому это не так. – user2057209

+1

CADisplayLink - это таймер, подобный NSTimer, но с Основное различие: он перегружен до частоты обновления экрана iPhone. Именно поэтому он используется в такой графической среде, как Cocos2d. – nzs

+0

Я попробую с этим. Спасибо =) – user2057209

2

Вы можете попытаться получить значение от уровня представления вашего слоя, который должен быть близок к тому, что представлено на экране:

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

Вы не можете получить точную позицию, но что вы пытаетесь сделать? – nielsbot

+0

Когда я помещаю этот код в функцию - (void) сразу после кода анимации, на моем экране появляются ники:/Как я могу напечатать его, как NSLog (@ "...")? : s Я пытаюсь получить позицию своей первой анимации, чтобы начать другую в середине первого. – user2057209

+0

Разве это не возможно? :( – user2057209

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» вид), то параметр слой который передан там, даст вам именно то, что вам нужно. Он содержит точные значения, используемые для рисования.

Э.Г.В этом методе вы можете обновить правильную мгновенную переменную (для работы с более поздними), а затем вызвать супер, если вы не делаете рисунок с вами руки:

- (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 после того, как код выше будет содержать требуемое мгновенное значение.

Просто имейте в виду, что это метод , и его можно назвать очень часто, поэтому нет ненужных вычислений или каких-либо тяжелых операций.

Источником этой идеи является проект Apple Custom Animatable Property.

Смежные вопросы