ステージを表示します。
private SurfaceHolder surfaceHolder; private Thread thread;
と
thread = new Thread(this); thread.start();
と
public void run() {
if(thread.isAlive()){
Canvas canvas = getHolder().lockCanvas();
//ここに描画処理を記載
getHolder().unlockCanvasAndPost(canvas);
}
}
が今回のポイントです。
描画用のスレッドを作り、描画の前後で処理をロック、アンロックします。
今回は菱形の路面や壁を段違いに並べるのでちょっと複雑なコーディングに見えますが縦横を順番に表示しているだけです。

Bとあるのはチェックポイントです。
これだけでもゲームの画面ぽいですね。
GameStage.java
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.SurfaceView;
import android.view.SurfaceHolder;
import java.lang.Runnable;
public class GameStage extends SurfaceView implements SurfaceHolder.Callback , Runnable {
private SurfaceHolder surfaceHolder;
private Thread thread;
private Bitmap[] imageStage = new Bitmap[10]; //
private int[][] stageData1 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,0,0,0,0},
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,0,0},
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,0},
{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,0},
{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0},
{0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0},
{0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0},
{0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0},
{0,0,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
{0,0,0,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0},
{0,0,0,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0},
{0,0,0,0,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0},
{0,0,0,0,0,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0},
{0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0},
{0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
static double drawingCenterX,drawingCenterY; //描画の仮想中心
GameStage(Context context) {
super(context);
//surfaceHolder = new SurfaceHolder():
//SurfaceHolderの取得
surfaceHolder = getHolder();
//SurfaceViewイベントの通知先の指定
surfaceHolder.addCallback(this);
drawingCenterX = 8500.0; //描画の中心X
drawingCenterY = -200.0; //描画の中心Y
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
Resources rsc = getResources();
imageStage[0]= BitmapFactory.decodeResource(rsc,R.drawable.wall);
imageStage[1]= BitmapFactory.decodeResource(rsc,R.drawable.road);
imageStage[2]= BitmapFactory.decodeResource(rsc,R.drawable.goal);
imageStage[3]= BitmapFactory.decodeResource(rsc,R.drawable.road_a);
imageStage[4]= BitmapFactory.decodeResource(rsc,R.drawable.road_b);
imageStage[5]= BitmapFactory.decodeResource(rsc,R.drawable.road_c);
imageStage[6]= BitmapFactory.decodeResource(rsc,R.drawable.road_d);
imageStage[7]= BitmapFactory.decodeResource(rsc,R.drawable.road_e);
imageStage[8]= BitmapFactory.decodeResource(rsc,R.drawable.road_f);
imageStage[9]= BitmapFactory.decodeResource(rsc,R.drawable.road_g);
thread = new Thread(this);
thread.start();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
thread = null;
}
@Override
public void run() {
if(thread.isAlive()){
Canvas canvas = getHolder().lockCanvas();
for(int j = 0; j <32 ; j+=2){
for (int i = 0; i < 32 ; i++){
//偶数行
canvas.drawBitmap(imageStage[stageData1[j][i]],i * imageStage[1].getWidth()-imageStage[1].getWidth()/2-(int)drawingCenterX,
j * imageStage[1].getHeight()/2 - imageStage[1].getHeight()/2-imageStage[stageData1[j][i]].getHeight()-(int)drawingCenterY,null);
}
for (int i = 0; i < 32 ; i++){
//奇数行
canvas.drawBitmap(imageStage[stageData1[j+1][i]],(i) * imageStage[1].getWidth()-(int)drawingCenterX,
(j) * imageStage[1].getHeight()/2-imageStage[stageData1[j+1][i]].getHeight()-(int)drawingCenterY,null);
}
}
getHolder().unlockCanvasAndPost(canvas);
}
}
}
今回はここまで。

