さっそくですが、今自分が公開しているアプリで、1件のエラー報告がありました。
public class MyGLSurfaceView extends GLSurfaceView implements
GLSurfaceView.Renderer {
...
// 内部ゲーム画面サイズ(デバイスによらず一定)
private static final int GAME_SCREEN_WIDTH =240;
private static final int GAME_SCREEN_HEIGHT = 320;
// 実際の画面サイズ(デバイスにより異なる)
private int mGLWidth = 0;
private int mGLHeight = 0;
...
@override
public void onSurfaceChanged(GL10 gl, int width, int height) {
...
// 画面のサイズを更新
mGLWidth = width;
mGLHeight = height;
...
// アスペクト比を保ち、かつ画面に収まる最大のサイズになるようにViewPortを設定
mGLViewPortRect = ....;
}
@Override
public boolean onTouchEvent(final MotionEvent e) {
...
// GLSurfaceView上での座標を、内部のゲーム画面への座標に変換する
int xPos = GAME_SCREEN_WIDTH * (e.getX() - mGLViewPortRect.left) / mGLWidth;
int yPos = GAME_SCREEN_HEIGHT * (e.getY() - mGLViewPortRect.top) / mGLHeight;
...
}
}
という定義のクラスで、onTouchEvent 内でゼロによる除算エラーが発生していました。
となると mGLWidth もしくは mGLHeight がゼロになっている、ということになります。
mGLWidth, mGLHeight に代入しているのは宣言時、および onSurfaceChanged 内だけです。
そこで質問なのですが、
1) onSurafeChanged で width や height 引数の値が 0 になることがありうるのでしょうか?
2) onSurafeChanged よりも先に onTouchEvent が呼ばれることがありうるのでしょうか?
ご存知の方がいましたら教えていただけるとうれしいです。単にエラーをふさぐだけなら
private int mGLWidth = 0;
private int mGLHegiht = 0;
ではなくて
private int mGLWidth = GAME_SCREEN_WIDTH;
private int mGLHeight = GAME_SCREEN_HEIGHT;
と、適当なデフォルト初期値を入れておけばいいのですが、ちょっと気になったもので。
--
かじき
dovei...@gmail.com
なるほど、この場合はイベントの発生順序に依存するコードを書かない方がよさそうですね。
適当な値で初期化しておくことにします。
ありがとうございました!