1

私がゲームを実装している間、私は問題の前にいます。これは本当に簡単だと思いますが、修正方法がわかりません。私の評判からわかるように、私はobjective-cに少し慣れていません:(

問題は、正しく動作するアニメーションがあることです。コードは次のとおりです。

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];

でも、すぐにはわかりません。nslogを使用して印刷すると、開始値である「Current = 0.0000」が1回表示されますが、その後は表示されません。画像 currentX の瞬時の位置を常に取得する方法がわかりません。

私は理解していたと思います。ご協力いただきありがとうございます :)

4

4 に答える 4

4

レイヤーのプレゼンテーション レイヤーから値を取得できます。

CGPoint currentPos = [ImageSuivante.layer.presentationLayer position];
NSLog(@"%f %f",currentPos.x,currentPos.y);
于 2013-06-20T16:52:18.753 に答える
3

ここには3つのオプションがあると思います(さらに存在する場合はコメントしてください):

オプション 1:最初のアニメーションを 2 つに分割し、前半が終了したら、アニメーションの後半と他のアニメーションを開始します。

...
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"]==@"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 (こちらの方が優れています) コールバックをセットアップし、アニメーション レイヤーのパラメーターを継続的にチェックします。2 番目のアニメーションをトリガーするために必要な値のパラメーターをテストします。

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 についても言及します。

于 2013-03-18T21:18:11.887 に答える
2

レイヤーのプレゼンテーション レイヤーから値を取得してみることができます。これは、画面に表示されているものに近いはずです。

[ [ ImageSuivante.layer presentationLayer ] valueForKeyPath:@"transform.translation.x" ] ;
于 2013-03-18T20:39:49.977 に答える