3

この質問と他の質問では、SKCameraNode を使用して SpriteKit でノードを追跡する方法について説明しています。

しかし、私たちのニーズはさまざまです。

SKSceneでカメラの位置を更新するなどの他のソリューションはupdate(_ currentTime: CFTimeInterval)機能しません。これは、ノードが画面上で Y ピクセル下に移動した後にのみカメラの位置を調整する必要があるためです。

つまり、ノードが 10 ピクセル上に移動しても、カメラは静止したままになります。ノードが左右に移動しても、カメラは静止したままでなければなりません。

カメラの位置を瞬時にアニメーション化するのではなく、時間をかけてアニメーション化しようとしましたが、 の内部でカメラに対して SKAction を実行しても何も起こりupdate(_ currentTime: CFTimeInterval)ません。

4

2 に答える 2

5

早速作ってみました。私はこれがあなたが探しているものだと思いますか?(実際のアニメーションはスムーズですが、GIF を圧縮する必要がありました)

ここに画像の説明を入力

これは更新コードです:

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */

    SKShapeNode *ball = (SKShapeNode*)[self childNodeWithName:@"ball"];
    if (ball.position.y>100) camera.position = ball.position;

    if (fabs(ball.position.x-newLoc.x)>10) {
        // move x
        ball.position = CGPointMake(ball.position.x+stepX, ball.position.y);
    }

    if (fabs(ball.position.y-newLoc.y)>10) {
        // move y
        ball.position = CGPointMake(ball.position.x, ball.position.y+stepY);
    }
}
于 2016-12-05T09:23:03.133 に答える
3

私はこれを更新コードに入れません。更新セクションが乱雑にならないようにしてください。作業できるのは 16 ミリ秒だけであることを忘れないでください。

代わりに、キャラクター ノードのサブクラスを作成し、position プロパティをオーバーライドします。基本的に言っていることは、カメラがキャラクターから 10 ピクセル離れている場合は、キャラクターに向かって移動するということです。アクションにキーを使用して、複数のアクションが重ならないようにし、タイミング モードを使用して、カメラが瞬時ではなくポイントにスムーズに移動できるようにします。

class MyCharacter : SKSpriteNode
{
    override var position : CGPoint
    {
        didSet
        {

            if let scene = self.scene, let camera = scene.camera,(abs(position.y - camera.position.y) > 10)
            {
                let move = SKAction.move(to: position, duration:0.1)
                move.timingMode = .easeInEaseOut
                camera.run(move,withKey:"moving")
            }
        }
    }
}

編集: @Epsilon は、SKActions と SKPhysics が格納されたプロパティを経由する代わりに変数に直接アクセスすることを思い出させたので、これは機能しません。この場合、 didFinishUpdate メソッドで実行します。

override func didFinishUpdate()
{
    //character should be a known property to the class,  calling find everytime is too slow
    if let character = self.character, let camera = self.camera,(abs(character.position.y - camera.position.y) > 10)
    {
        let move = SKAction.move(to: character.position, duration:0.1)
        move.timingMode = .easeInEaseOut
        camera.run(move,withKey:"moving")
    }
}
于 2016-12-05T12:52:19.913 に答える