HatenaPocket本稿はJavaでゲームループの実装をやってみたいと思います。マルチスレッドを利用するので、わからない方はこちらの記事でスレッドの増やし方までは知っておいてください。ゲームループの実装ゲームループを作成するには定期的にpaintComponentメソッドが呼び出されるようにしなければなりません。そのためにThreadクラスを利用し、定期的にrepaintメソッドを実行します。repaintメソッドを呼び出すと、再描画イベントの実行要求を出すことができます。それではゲームループを実装したGameWindowのアニメーションサンプルです。50);}}実行結果runメソッドでスレッドが存在している間はゲームループが実行されます。そのままループを回すとかなりの速度で処理されてしまいますので、Thread.sleep(スレッド停止間隔のミリ秒)を利用し、スレッドの実行を止めています。今回は25ミリ秒なので40fpsのゲームループということになります。これでpaintCompnentが定期的に呼び出されるので、中に処理や描画を実装したらOKです。計算処理と描画処理でスレッドを分ける構成にしても良かったのですが、面倒な実装が増えるうえに内容によっては同期をとらなければならなくなるので、ゲーム処理と描画は全てシングルスレッドのみで実装する構成としました。描画間隔の指定(FPS設定)どのくらいの間隔で再描画を呼び出すかですが、通常ゲームでは60fps(1秒間に60回描画)が多いと思います。私は処理に負荷のかかるゲームはfpsを下げたり上げたりしたいので任意で決められるようなsetFpsメソッドを作成しておくことにしました。sleepメソッドはミリ秒指定なので、秒をミリ秒に直す必要があります。1秒をミリ秒に直すと1000ミリ秒となります。60fpsの時の1描画あたりのミリ秒を出したい場合は1000/60を計算すれば算出できます。40fpsなら1000/40になります。この結果をThread.sleepメソッドに指定すれば基本は大丈夫なのですが、60fpsにしたい場合は16.66666・・・ミリ秒のスレッド停止が必要なのです。このスレッド停止はマイクロ秒単位で指定する方法も一応用意されているのですが、環境依存なのか、ちゃんと処理されないので正確に60fpsにできません。なっては、実装は無理なので、60fpsになるように16ミリと17ミリの停止を適度に調整する処理を入れてしまいましょう。1000/fpsを計算し、その値を現在時刻に加算し、次の再描画時間を求めます。そのあとsleep前に次の時間と現在時間の差分を算出してsleepメソッドに指定しましょう。これで、60fpsのパターンにも対応できます。現在時刻の取得は、System.currentTimeMillisメソッドで取得できます。わかりやすくするためにFrameRateクラスを作成し、fpsをリアルタイムで表示できるようにしました。それでは実装したサンプルをご覧ください。GameWindow("テストウィンドウ",400,300);gw.setFps(60);//60fpsを指定します。IllegalArgumentException("fpsの設定は10~60の間で指定してください。50);}}実行結果ソースが長くなってしまいましたが、60fpsにするためのスレッド停止時間計算処理はここでやってます。本稿は、ラムダ式とメソッド参照について説明します。本稿からJavaプログラムの記述を実際にやっていきます。コメントをキャンセルメールアドレスが公開されることはありません。当サイトのプライバシーポリシーについてはこちらからご参照いただけます。