富山県で高品質・低価格なホームページ制作はアウェイクコンピューター

MAP

androidゲームプログラミング シューティングゲームその1

SurfaceViewでシューティングゲームを作っていく。
Activity側は前回と同じ。
ゲーム処理部分を全てrun()の中に書くと分かりにくいので別にクラスを作っていく。
まずは自分の機体のクラス。

[java]
public class MyPlane{
private Bitmap my_image;
private int X;
private int Y;

public MyPlane(MainGame main) {
my_image=main.my_image;
}
public void move(float touchX, float touchY) {
X=(int)touchX;
Y=(int)touchY;
}
public void draw(Canvas canvas){
canvas.drawBitmap(my_image, X,Y, null);
}
}
[/java]

続いてSurfaceView側。

[java]public class MainGame extends SurfaceView implements SurfaceHolder.Callback,Runnable {
private Canvas canvas;
private Thread mainLoop;
private SurfaceHolder holder;
private MyPlane myplane;
Bitmap my_image;
public MainGame(Context context) {
super(context);
Resources res = this.getContext().getResources();
my_image=BitmapFactory.decodeResource(res, R.drawable.a_random17_e);
myplane=new MyPlane(this);
holder=getHolder();
holder.addCallback(this);
}
@Override
public void run() {
while (mainLoop!=null) {
canvas=getHolder().lockCanvas();
canvas.drawColor(Color.BLACK);
myplane.draw();
getHolder().unlockCanvasAndPost(canvas);
}
}

@Override
public void surfaceChanged(SurfaceHolder holder, int arg1, int arg2, int arg3) {
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
canvas = holder.lockCanvas();
canvas.drawColor(Color.BLACK);
holder.unlockCanvasAndPost(canvas);
mainLoop = new Thread(this);
mainLoop.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mainLoop = null;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float touchX = event.getX();
float touchY=event.getY();
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
myplane.move(touchX,touchY);
break;
case MotionEvent.ACTION_MOVE:
myplane.move(touchX,touchY);
break;
}
return true;
}
}
[/java]

SurfaceView側で大事なのはonTouchEventの部分。
ここでは画面をタッチして、動かした時の座標を得てそれを引数にして自機のmoveメソッドを呼び出している。
コンストラクタでの前回との違いはdecodeResource()で自機の画像を取得しているところ。
本来はMyPlane側でやるべきだがdecodeResource()の1番目の引数のResourcesを得るためにはActivityクラスでインスタンス化されたこのクラスでやる必要があった。
MyPlaneクラスをインスタンス化するときに引数として自分自身のクラスを渡している。
MyPlaneのコンストラクタでMainGameクラスの中で必要なものを取得する。今回は自機の画像だけ。
drawメソッドでSurfaceView側で取得したcanvasを引数として受け取り、その画像を描画する。

お見積もりのご依頼、制作のご相談など、小さな事でもお気軽にご相談ください。

地元富山のホームページ制作会社ならではの親近感とフットワークの良さにより、高品質かつ安心価格のホームページを心をこめてご提案します。富山県で新規ホームページ制作、ホームページリニューアル、CMS構築はどうぞお気軽にご相談下さい。電話:076-483-9951 (受付時間:平日9時~16時)

お問い合わせフォームはこちら