私はopenglを使ってアンドロイドで簡単なゲームを書こうと思っていましたが、すぐにメインゲームのループに悩まされました。私がここで読んでいる通り:http://developer.android.com/resources/tutorials/opengl/opengl-es10.htmlアプリは表面を再描画する必要があるたびにpublic void onDrawFrame(GL10 gl)
を呼び出します。それともそういうものか。私の問題は、描画呼び出しに依存しない更新ループを作成する方法でした。つまり、そのようには動作しません。デバイス(アプリケーション?)がサーフェスを再描画したいとき(または間違っていますか?)に限り、ゲームロジックを更新できません。android openglで適切に更新/描画ループを作成するには?
私はいくつかのグーグルで私は結論に私は更新ループのための別のスレッドを作成する必要が来た。しかし、私は別の問題を抱えていました。一つのスレッドが描画を担当し、もう一つがゲームロジックを更新する世話をしていました。私はそれらを協力させる方法を知らなかったのです。まず、2つのクラス(少なくとも私の実装では)だったので、同じゲーム変数とオブジェクト(スプライト、タイマー、さまざまな変数、カウンターなど)を使うことができませんでした。彼らの仕事)。今私は何とかそれらを両方とも一つのクラスに詰めることができると思う。しかし、2番目に、私は何とか2つのスレッドを同期させる必要がありました。 run()
とupdate()
方法で
public class UpdateThread implements Runnable
を描くの世話をしonSurfaceCreated()
方法で
public class MyRenderer implements GLSurfaceView.Renderer
:- 3クラス:
は最後に、私はこの一般的な考えで出てきました。
run()
は、1秒間に正確に60回、update()
メソッドを呼び出していました(私は固定ステップループが必要でした) public class SpritesHolder
すべてのゲームオブジェクト/変数/もの(スプライト、タイマー、状態変数など)すべてのフィールドが公開されています。
- 3クラス:
SpritesHolder
クラスが一つの場所に、必要なすべての変数を保持する箱だったので、
MyRenderer
と
UpdateThread
クラスがそれにアクセスし、それを使用することができます。同期用として
- 私はちょうどこのようになめらかでした:両方のスレッドが同時にspritesHolderを使用しないように
public void onDrawFrame(GL10 gl)
{
synchronized (spritesHolder)
{
// whole method code...
}
}
:
public void update(float delta)
{
synchronized (spritesHolder)
{
// whole method code...
}
}
と。更新は毎秒60回行われ、app(device?)が必要なときはいつでも描画が行われました。
話がたくさんあり、申し訳ありませんが、私はこの投稿をほとんど書き終えました。 ;)とにかく - とにかく - これは(上記の)作品と私はこの「テンプレート」に基づいていくつかのゲームを書いていましたが、私のアイデアは狂っているかもしれないと思います。私はすべてのコメントとアドバイスにとても感謝しています。
ただ1語:http://obviam.net/ :) – akonsu