Androidに対応している機種はたくさんあり、画面サイズも異なります。
画面サイズからの比率で色々と描画するようなプログラムも作れるかもしれませんが、ゲームではかなり大変です。
前回の記事で「Bitmapに描画して最後にSurfaceViewに」と書きましたが、実際にどんな感じに実装したのかを紹介します。
public final class CFrameworkGraphic { public SurfaceView mView; private SurfaceHolder mHolder; private Bitmap mBitmap; private Canvas mCanvas; private Rect mTemporaryRect; public CFrameworkGraphic(Activity iActivity, int iSurfaceViewID, int iWidth, int iHeight) { mView = (SurfaceView)iActivity.findViewById(iSurfaceViewID); mHolder = mView.getHolder(); mBitmap = Bitmap.createBitmap(iWidth, iHeight, Config.RGB_565); mCanvas = new Canvas(mBitmap); mTemporaryRect = new Rect(); } public final boolean isValid() { return mHolder.getSurface().isValid(); } public final Canvas beginRender() { return mCanvas; } public final void endRender() { Canvas aCanvas = mHolder.lockCanvas(); aCanvas.getClipBounds(mTemporaryRect); aCanvas.drawBitmap(mBitmap, null, mTemporaryRect, null); mHolder.unlockCanvasAndPost(aCanvas); } }
とくに特別な処理はしていません。
コンストラクタで指定されたサイズのBitmapを作成し、beginRender()でそのCanvasが返されます。
endRender()ではBitmapの内容をSurfaceViewに描画しています。
このクラスを使った描画は以下のようになります。(mGraphicはCFrameworkGraphicのインスタンス)
if(mGraphic.isValid()) { Canvas aCanvas = mGraphic.beginRender(); // aCanvasを使った描画処理 mGraphic.endRender(); }
このクラスを使うことで、実際のゲームプログラム側では決まった一つのサイズだけを考えればよくなります。
ただこのクラスでは画面の縦横比が違う機種を使った際に、画面が伸びてしまいます。
ゲームによっては問題ない場合もありますが、必要であれば縦横比は変わらないようにして、余った部分を黒で塗りつぶすなどの処理が必要です。
余談ですが、世の中のサンプルコードをみるとSurfaceViewは継承して使う場合がほとんどですが、上記コードを見てわかるとおり、このフレームワークではSurfaceViewはレイアウトに入れています。(継承していません)
アプリ内広告を入れる際に、レイアウトが必要だったためこのようになっています。
とりあえずは別段問題は起こりませんでした。