iPhoneでは、画面上のコントロールでUIImageViewを移動する最良の方法は何ですか?
-
06-07-2019 - |
質問
このゲームのiPhoneバージョンを開発しています。 http://www.students.uni-mainz.de/rathb000/ Fillit / Game.html
NSTimerを使用して船の位置を1ピクセル変更し、タイマーの時間間隔は0.002です。
しかし、時間間隔を短くすると船が速く動かないことに気付きました。実際、0.05と0.002の間に違いはありません。 NSTimeIntervalとして指定する必要がある最小時間に制限はありますか?
現在、船の動きは遅すぎてゲームを盛り上げることができません。
また、NSTimerによっても達成される鳥の動きは、船を動かすためにボタンを押すと遅くなります。
これを解決する方法についてのアイデアはありますか?
解決 6
これを理解しました。
コアアニメーションを使用して船を動かし、NSTimerで鳥を動かさなければならなかった。この方法で正常に動作しますが、特定の制限までです。船の速度が一定の制限を超えて増加すると、鳥は再び減速します。
他のヒント
NSTimerはリアルタイムのメカニズムではありません。実行ループの一部として起動し、滑らかで滑らかなアニメーションを作成するのには理想的ではありません。ただし、Core Animationと呼ばれるiPhone OSの一部であるSDKがあります。これは、レイヤーとビューのスムーズなアニメーションを実行するための関数のライブラリを提供します。 こちらがかなり良いシリーズです役立つビデオチュートリアルまた、 Mac OS XおよびiPhoneのコアアニメーションという優れた本もあります。役に立つかもしれません。
Appleのコアアニメーションドキュメント。CABasicAnimationクラスを使用してレイヤーまたはビューのプロパティをアニメーション化する方法を説明しています。ドキュメントの明示的なレイヤーアニメーションの例を次に示します。
CABasicAnimation *theAnimation;
theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
theAnimation.duration=3.0;
theAnimation.repeatCount=1;
theAnimation.autoreverses=NO;
theAnimation.fromValue=CATransform3DTranslate(0,0,0);
theAnimation.toValue=CATransform3DTranslate(20,20,0);
[theLayer addAnimation:theAnimation forKey:@"animateTransform"];
NSTimer
ドキュメントから:
タイマーはリアルタイムのメカニズムではありません。タイマーが追加された実行ループモードの1つが実行中で、タイマーの起動時間が経過したかどうかを確認できる場合にのみ起動します。一般的な実行ループが管理するさまざまな入力ソースのため、タイマーの時間間隔の有効な解像度は50〜100ミリ秒のオーダーに制限されています。実行ループがタイマーを監視していないモードにあるとき、または長いコールアウト中にタイマーの起動時間が発生した場合、タイマーは次に実行ループがタイマーをチェックするまで起動しません。したがって、タイマーが発火する実際の時間は、発火予定時刻からかなりの時間が経過する可能性があります。
タイマーの代わりに UIView
アニメーションを使用して UIView
を移動してみてください。
距離のサイズを増やすことを検討できます。船を.002秒ごとに1ピクセルではなく、0.05秒ごとに3または4ピクセル移動します。
私の意見では、プレイヤーの船専用のタイムステップではなく、ゲームのすべてのエンティティでグローバルに同じタイムステップを使用する必要があります。タイムステップで船の動きが遅すぎる場合は、フレームごとに移動する距離を増やします。
本当に、ピクセル/秒の観点からプレイヤーの船を動かすことを考えるべきです。 NSTimerイベントが発生すると、最後の更新からの経過時間を取得します。この経過時間を使用して、ゲームエンティティを移動します。たとえば、更新タイムステップが0.05秒で、プレイヤーの船を1秒あたり100ピクセル移動する場合、この更新では100 * 0.05 = 5ピクセル移動する必要があります。この方法は、さまざまなサイズのタイムステップを考慮し、タイマーメカニズムがそれほど一貫していない場合でも、ゲームエンティティは常に一定の速度で移動しているように見えます。
NSTimerは、このタイプのアニメーションに適したツールではないだけでなく、設計が間違っています。
間隔が0002のタイマーは、1秒間に500回起動します。これはこのゲームをアニメーション化するクレイジーな方法です。
2Dゲームデザインを読んで、衝突検出を行うためのより良い方法を見つけることをお勧めします。匿名のように、実際のピクセルに依存するのではなく、船の周りに衝突長方形を置く必要があります。