忍者ブログ


[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



[ 2018/12/20 00:58 | ]
Android課題開発1
新しい液晶ディスプレイを買うに当たって、結構無駄遣いしちゃいました。。。
合計8万円くらいorz

まぁその半分は接続用ケーブルとか切替器なんですけどねw
Androidを知る
前回書いたように、課題のマインスイーパーを作る作業に取り掛かります。

まずはAndroidの動き方を復習しなければ!
実現できる範囲でゲームを設計しないと、後で詰まります。
※自分用のメモのため、文章が汚いです。。。

Androidはアクティビティという、アプリケーションの基盤とも言える物の上で動いているようで、その上で処理を行わせることによって、描画したり操作を検出することができるようです。
その画面は、予めXMLで設定しておいた画面構成の他にも、Viewクラスを使って自分の好きなように描けるようで、今回のような特殊な描画をする場合は、Viewクラスを使った方が良いようです。
しかし、OpenGLを使うとなれば、描画速度も視野に入れなければならず、そのViewクラスだけでは不足してしまうらしい。その時に使うのが、Viewクラスを継承したSurfaceViewクラス。Viewと比べて遥かに描画速度が速いようです。

このSurfaceViewクラスは、Viewを継承しているため、呼び出し側(Activity)はViewと同じようにsetContentView()で描画を開始させられるみたい。
つまり、

View view = new SurfaceViewを継承したやつ();
setContentView(view);

とすりゃ、あとは継承したやつの処理が終わるまで(finish()するまで)待つらしい。
逆に言えば、finish()しない限り終了しないんか、うん。

ちなみにActivity間のデータやりとりは、Intentクラスを使うらしい。

Intent intent = new Intent(〜);
intent.putExtra(入れたいデータ);
startActivity(intent);

てな感じです。

画面設定編
以上でAndroidの動作と描画の基礎は掴めたわけで、いよいよOpenGLについて学んでいきます。
Androidアプリにも、やはり通常のアプリと同じように「イベント駆動型」と「フロー駆動型」の2種類が存在し、前者はXMLで画面構成を定めておき、「ボタンが押されたー」とか「入力されたー」なんてときに、指定されたメソッドを呼び出させ処理を行う方式、後者は常に処理を行う方式。

さて、今回作るようなゲームなんかだと・・・一般的に「フロー駆動型」ですね。
(もしかしたらイベント駆動型の方がいいかもしれないけど。)
今回は1秒間に30回画面描画を行わせたい(30FPS)と思っているので、フローの方が都合がいいです。
そうなると、1/30秒ごとに描画処理を呼び出さなければならないので、1つスレッドを作って、時間経過毎に処理を呼び出してあげるようにします。

忘れてた。OpenGLで描画するためには、もう一つ手順が必要でした。
描画先(サーフェス)の設定を行わなければならない。
SurfaceHolderという、描画対象の取りまとめ役を作らなければなりません。

SurfaceHolder sh = getHolder();
sh.addCallback(this);
sh.setType(SurfaceHolder.SURFACE_TYPE_GPU);

addCallback()の引数は、描画サーフェスの変更や、生成、破棄されたときに呼び出されるメソッド(SurfaceView.Callbackより)が存在するクラスインスタンスを指定します。
要するに、SurfaceView.Callbackインタフェースを引き継いでいるクラスのインスタンスです。

OpenGL初期化編
描画サーフェスが作られた後、OpenGLの初期化をする。つまり、サーフェスが生成されたときのコールバックメソッドにて、スレッドを作成して起動させます。

public void surfaceCreated(SurfaceHolder h) {
thread = new Thread(this);
thread.start();
}


さて、いよいよOpenGLを使えるようにしていきます。
まず、OpenGLのデバイスコンテキスト(OpenGLを扱うために必要なキー)を取得し、その中から描画先の画面情報を取得します。

EGL10 egl = (EGL10)EGLContext.getEGL();
EGLDisplay disp = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
egl.eglInitialize(disp, null);

(なんかDirectXでも同じようなことしていた記憶が・・・)

次に、画面描画のためのバッファの構成を設定します。

int[] drawConfig = {
色やら深度やらのビット数をここで設定
};
EGLConfig[] configs = new EGLConfig[1];
int[] numConfig = new int[1];
egl.eglChooseConfig(disp, drawConfig, configs, 1, numConfig);
EGLConfig config = configs[0];

どうでもいいけど、JavaでC++における参照みたいな事をするには、配列にすればいいんね。

次に描画用コンテキストと、ウィンドウのサーフェスを作成し、関連付けます。

EGLContext render = egl.eglCreateContext(省略);
EGLSurface win = gel.eglCreateWindowSurface(省略);
egl.eglMakeCurrent(省略);


で、最後に

GL10 gl = (GL10)render.getGL();

このglを使って描画ができるようになります。

ちなみに後処理のほうは・・・
さっき作ったrenderとwinの割り当てを、eglMakeCurrent()の引数にEGL_NO_SURFACEを設定することで解除し、winとrenderをeglDestroySurface()とeglDestroyContext()で解放、最後にeglTerminate()でOpenGLとさよならすればいいらしいです。

というわけで、これで一通りOpenGLの描画に対する準備と後処理について学習できました!
次はいよいよ3Dの描画を行ってみたいと思います。
(アルバイトがあって全然進まない・・・)

参考文献
ttp://code.google.com/p/android-gl/downloads/list
ここのAndroidGL-4.0.zip内のソース

拍手[3回]

PR



[ 2009/12/27 07:10 | Comments(0) | TrackBack(0) | プログラム ]

トラックバック

トラックバックURL:

コメントを投稿する






<< Android課題開発2  |  ホーム  |  冬休み!!!!。。。宿題出された...orz >>