1

私は現在、自分のプロジェクトの 1 つをSpriteKitに変換する過程にあり、 FirstanimateWithDurationへの変換に問題があります。迷惑ですが、ゲームを壊すわけではありません。2 つ目は、がその終了位置をすぐに計算するのに対し、常にその位置を計算するという事実です。画面の下に行が移動するゲームボードがあるため、これは私にとって問題です。この行の真ん中にあるノードが削除された場合、そのノードの下にあるノードを現在空いている位置に移動する必要があります。これは、彼らが動いているターゲットに向かっていることを意味し、SKAction MoveByY: duration:animateWithDurationSKActionanimateWithDurationSKActionspriteNodesSKAction彼らは位置をオーバーシュートします。別の を追加してこの購入を解決することはできSKActionますが、その後、さまざまな速度で落下する破片を考慮する必要があり、すぐに乱雑になり始めます。誰かが当て推量を含まないきれいな解決策を持っているかどうか疑問に思っていましたか? 理想的には で を実行するだけですanimateWithDurationspriteNode、残念ながらそれはうまくいきません。

これは私の最初のアニメーション コードでした。

[UIView animateWithDuration:collapseSpeed animations:^{[[[_activePiecesVerticalOne objectAtIndex:piecesInArrayOne - 1] imageView] setCenter:CGPointMake (30, _positionOfLastObjectArrayOne )]; }];

これは私の新しいコードです:

SKAction *collapseUp = [SKAction moveToY:positionOfLastObjectArrayOne duration:collapseSpeed];
collapseUp.timingMode = SKActionTimingEaseInEaseOut;  //thanks Can!
SKAction *correctPosition = [SKAction moveByX:0 y:correctionVariable duration:.1];
SKAction *theAnimation = [SKAction group:@[collapseUp, correctPosition]];

[[_fallingPiecesRowOne objectAtIndex:piecesInArrayOne - 1] runAction:theAnimation];

私は実際にはすでにmoveByではなくmoveToを使用していたので、Canに謝罪します。変数 correctPosition = fallingPiecesSpeed * 25。fallingPieceSpeed は -.1 です。これは、落下するすべての破片が更新メソッドによって .01 秒ごとに移動される距離です。ピースをアニメーション化するのにかかる 0.25 秒の間に、これらの -.1 の動きの増分のうち 25 が欠けていたので、私の問題を解決するためにこれを実装しました。animateWithDuration を使用すると、これらの動きの増分が保存され、落ちるときにピースに適用されると思います。これは、SKAction に欠けているものです。このソリューションは、PieceSpeed を -.1 で落下させ続ける限り問題ないように見えますが、-.3 まで上げると、破片がどこに到達するかについて大きな矛盾が生じます。

うまくいけば、これは理にかなっています。私が述べたように、私はよりクリーンなアプローチでこれらすべてをバイパスすることを望んでいましたが、解決策を見つけるためにこれをいじり続ける必要があるかもしれません:S

4

1 に答える 1

3

を使用している場合はanimateWithDuration:、最終的な位置を知っていると思いますよね? 次に、代わりにSKAction +moveByY:duration:useを使用しますSKAction +moveToY:duration:

そして、必要な「高速化」は単純なタイミング関数であり、SKAction の場合、インスタンス オブジェクトで変更できます。SKAction -setTimingMode:

したがって、本質的に:

SKAction *action = [SKAction moveToY:someYValue duration:0.15];
action.timingMode = SKActionTimingEaseInEaseOut;

編集

問題を評価するのは難しいです。多くのことが関係しており、SpriteKit についての知識はそれほど多くありませんが、Core Animation については知っています。

私の最大の懸念は、モデル レイヤーに完全にコミットされていない可能性がある SpriteKit から値を取得していることです。この用語には、レイヤーにはモデル レイヤーとプレゼンテーション レイヤーの 2 つの形式があり、モデル レイヤーはレイヤーの実際のプロパティを保持し、プレゼンテーション レイヤーは現在のアニメーション プロパティを持つ中間レイヤーであることに注意してください。実際には、 を介してこのすべてのプロパティにアクセスできますview.layer.presentationLayer

アニメーションを扱う一般的な経験則は、相対値を介してすべてを行うことです。したがって、上に移動する必要がある行は、固定量 (スプライトの高さ) に基づいて移動する必要があるため、moveByY:最初に思われたほど悪くはありませんが、すべてが相対的であることを確認してください。

もう 1 つの方法は、SKPhysics を使用することです。この場合、最後の行が物を押し上げ続け、他のすべての部分が重力/弾むように落下します。

于 2014-01-07T19:01:17.413 に答える