ステージを表示します。
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); } } }
今回はここまで。