0

このゲームの iPhone 版を開発しています。http://www.students.uni-mainz.de/rathb000/Fillit/Game.html

NSTimer を使用して船の位置を 1 ピクセルずつ変更しています。タイマーの時間間隔は 0.002 です。

しかし、時間間隔をさらに短くすると、船が速く動かないことに気付きました。実際、0.05 と 0.002 の間に違いはありません。NSTimeInterval として与えなければならない最小時間に制限はありますか?

現在、船の動きが遅すぎて、ゲームがエキサイティングではありません。

また、船を動かすためのボタンを押すと、鳥の動き(これもNSTimerによって実現されます)が遅くなります。

これをどのように解決できるかについて何か考えはありますか?

4

6 に答える 6

3

NSTimerはリアルタイムメカニズムではありません。実行ループの一部として起動するため、スムーズで滑らかなアニメーションを作成するのには理想的ではありません。ただし、CoreAnimationと呼ばれるiPhoneOSの一部であるSDKがあります。これは、レイヤーとビューのスムーズなアニメーションを実行するための関数のライブラリを提供します。これは、役立つと思われる適度に優れた一連のビデオチュートリアルです。MacOSXおよびiPhone用のCoreAnimationと呼ばれる優れた本もあります。

CABasicAnimationクラスを使用して任意のレイヤーまたはビューのプロパティをアニメーション化する方法を説明するAppleのコアアニメーションドキュメントもあります。ドキュメントからの明示的なレイヤーアニメーションの例を次に示します。

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"];
于 2009-06-18T13:44:07.120 に答える
0

NSTimerドキュメントから:

タイマーはリアルタイムのメカニズムではありません。タイマーが追加された実行ループモードの1つが実行中であり、タイマーの起動時間が経過したかどうかを確認できる場合にのみ起動します。一般的な実行ループが管理するさまざまな入力ソースのため、タイマーの時間間隔の有効な解決は50〜100ミリ秒のオーダーに制限されます。実行ループがタイマーを監視していないモードにあるとき、または長いコールアウト中にタイマーの起動時間が発生した場合、実行ループが次にタイマーをチェックするまで、タイマーは起動しません。したがって、タイマーが実際に起動する時間は、スケジュールされた起動時間の後、かなりの期間になる可能性があります。

タイマーの代わりにアニメーションをUIView使って動かしてみるのもいいかもしれません。UIView

于 2009-06-18T13:38:10.050 に答える
0

私の意見では、プレイヤーの船専用のタイムステップではなく、ゲーム内のすべてのエンティティでグローバルに同じタイムステップを使用する必要があります。船の移動がタイムステップで遅すぎる場合は、フレームごとに移動する距離を増やしてください。

本当に、あなたはピクセル/秒の観点からあなたのプレーヤーの船を動かすことを考えるべきです。NSTimerイベントが発生したら、最後の更新からの経過時間を取得します。この経過時間を使用して、ゲームエンティティを移動します。たとえば、更新のタイムステップが0.05秒で、プレーヤーの船を1秒あたり100ピクセル移動する場合、この更新では100 * 0.05=5ピクセル移動する必要があります。この方法では、さまざまなサイズのタイムステップが考慮され、タイマーメカニズムがそれほど一貫していない場合でも、ゲームエンティティは常に一定の速度で移動しているように見えます。

于 2009-06-18T13:40:18.407 に答える
0

NSTimer がこの種のアニメーションに適したツールではないだけでなく、設計が間違っています。

間隔が 0002 のタイマーは、1 秒あたり 500 回起動します。これは、このゲームをアニメーション化するクレイジーな方法です。

2D ゲーム デザインを読んで、衝突検出を行うためのより良い方法を見つけることをお勧めします。匿名のように、実際のピクセルに依存するのではなく、船の周りに衝突長方形を配置する必要があることを示唆しています。

Cocos-2D for iPhoneもチェックしてください。

于 2009-06-18T15:04:31.200 に答える
0

距離のサイズを大きくすることを検討できます。船を .002 秒ごとに 1 ピクセルではなく、.05 秒ごとに 3 または 4 ピクセル移動します。

于 2009-06-18T13:38:55.290 に答える
-1

これを理解しました。

Core Animation を使用して船を動かし、鳥を NSTimer で動かしました。この方法で問題なく動作しますが、特定の制限までしか機能しません。船の速度が一定の制限を超えると、鳥は再び減速します。

于 2009-08-07T07:15:33.030 に答える