いよいよゲーム本体の作成です。今回のゲームはスマートフォンを横向きに使いたいので、
まず、AndroidManifest.xmlファイルに
android:screenOrientation="landscape"をゲームActivityに追記します。
ゲームActivity名をNationalDefenceActivityとしxmlファイル名をnational.xmlとします。
AndroidManifest.xmlファイルは次のような追記になります。
これによりスマートフォン。の画像が横向きに固定されます。
ゲームソフトの作成に際しては処理の早さが要求されますのでSurfaceViewというオブジェクトを使います。
それからスマートフォンの寸法もいろいろありますのでその点も考慮する必要があります。
ゆえにActivityとxmlファイルの書き方が今まで作成してきたものと少し異なります。
まず、NationalDefenceActivityを下記の通り作成します。
WindowManagerにより使用されているスマートフォンの寸法を取得します。
public float disp_w,disp_h;にそのデータがインプットされます。
このActivityではスマートフォンの横と縦の寸法を取得してすぐにxmlファイルnational.xml
に処理を移行します。
package kureishi.example.nationaldefence;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.Window;
import android.view.WindowManager;
import android.graphics.Point;
import android.view.Display;
public class NationalDefenceActivity extends Activity {
public float disp_w,disp_h;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
//スマートフォンのディスプレイの寸法を取る
Window window=getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
WindowManager manager=window.getWindowManager();
Display disp=manager.getDefaultDisplay();
Point size=new Point();
disp.getSize(size);
disp_w=size.x;
disp_h=size.y;
//ここまで
setContentView(R.layout.national);//national.xmlファイルに移動
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.defence, menu);
return true;
}
}
national.xmlファイルは次の通りです。ポイントはtools:context=".AirFight"と
kureishi.example.nationaldefence.AirFightのコードです。一旦受け取った処理をすぐに
AirFigt.javaに先送りします。つまりゲームそのものはAirFigt.javaにおいて作成します。
ここまではスマートフォンの縦横の寸法を取得しただけです。(他に方法があるのかもしれませんが)
ゲーム本体の処理はAirFight.javaにコーディングしていきます。
とりあえず画像が出るようにします。画像はfight_view_2.pngとし、resフォルダーにdrawableフォルダーを作成し
この中に貼り付けました。
勿論メインアクティビティーのDefenceActivityのメソッドが有効になっていることを確認しておいて下さい。
public void onClickGameStart(View v){
Intent intent=new Intent(DefenceActivity.this,NationalDefenceActivity.class);
startActivity(intent);
}
「//」をとる。
AirFight.javaは次の通りです。SurfaceViewクラスを継承しインターフェイスを搭載します。
SurfaceViewは高速処理に対応するため、
インターフェースSensorEventListener,SurfaceHolder.Callbackはタイマー処理と考えてよいのでは。
「//」の部分が画像の貼り付けに関係するコードです。
package kureishi.example.nationaldefence;
import java.util.List;
import java.util.concurrent.*;
import kureishi.example.nationaldefence.NationalDefenceActivity;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.hardware.*;
import android.util.AttributeSet;
import android.view.*;
import android.graphics.drawable.Drawable;
import android.content.res.Resources;
import android.os.SystemClock;
public class AirFight extends SurfaceView implements SensorEventListener,SurfaceHolder.Callback{
private Activity context;
private NationalDefenceActivity nationaldefence;
private Drawable[] back;
public SurfaceHolder holder;
public float w,h;
public AirFight(Context context){
super(context);
init(context);
}
public AirFight(Context context,AttributeSet attrs){
super(context,attrs);
init(context);
}
public void init(Context context){
this.context=(Activity)context;
holder =getHolder();
holder.addCallback(this);
setFocusable(true);
requestFocus();
nationaldefence=(NationalDefenceActivity) context;
setBoardSize();
}
public void setBoardSize(){
//画像を認識させる処理
Resources resources=context.getResources();
back=new Drawable[8];
back[0]=resources.getDrawable(R.drawable.fight_view_2);
//ここまで
//スマートフォンのディスプレイの寸法
w=nationaldefence.disp_w;
h=nationaldefence.disp_h;
}
public void draw(){
Canvas canvas=holder.lockCanvas();
//画像の貼り付け
back[0].setBounds(new Rect(0,0,(int)w,(int) h));
back[0].draw(canvas);
holder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){
//executor.shutdown();
}
@Override
public void surfaceCreated(SurfaceHolder holder){
draw();
//start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder){
try{
//executor.shutdown();
}catch(Exception e){}
}
@Override
public void onAccuracyChanged(Sensor sensor,int accuracy){}
@Override
public void onSensorChanged(SensorEvent event){
}
}
コンストラクタからinit()->setBoardSize()->draw()メソッドの順に処理が移動していきます。
その他はすべて親クラスとインターフェースのメソッドをオーバーライドしたものです。
ここまでで。ゲーム開始をタップするとfight_view_2.pngの画像がスマートフォンに表示されます。