


public class GameMgr {
private enum eStatus{//状態
NORMAL,//普通
GAMEOVER,//ゲームオーバー
GAMECLEAR//ゲームクリア
};
private static final float PI = (float) Math.PI;
private ArrayList<Barricade> _barrList = new ArrayList<Barricade>();//障害物リスト
private LinkedList<Task> _taskList = new LinkedList<Task>();// タスクリスト
private eStatus _status = eStatus.NORMAL;//状態
private Player _player;
GameMgr() {
_barrList.add(new BarricadeSquare( 0, 0,480, 20, null));// 画面4隅に四角形を配置
_barrList.add(new BarricadeSquare( 0, 0, 20,800, null));
_barrList.add(new BarricadeSquare(460, 0, 20,800, null));
_barrList.add(new BarricadeSquare( 0,780,480, 20, null));
// _barrList.add(new BarricadeSquare(0, 390, 480, 20, new BConf(+PI / 180)));// 中央に回転するバー(時計回り)
// _barrList.add(new BarricadeSquare(0, 390, 480, 20, new BConf(-PI / 180)));// 中央に回転するバー(反時計回り)
// _barrList.add(new BarricadeTriangle(240, 400, 200, new BConf(+PI / 180)));// 中央に回転する三角形(時計回り)
// _barrList.add(new BarricadeStar(240, 400, 80, 220, new BConf(+PI / 180)));// 中央に回転する星(時計回り)
for (Barricade bar : _barrList) {
_taskList.add(bar); //タスクリストに障害物を追加
}
_player = new Player();
_taskList.add(_player);
_taskList.add(new FpsController());
}
private boolean Collision(){//衝突判定
Vec vec = new Vec();
final Circle cir = _player.getPt();//プレイヤーの中心円を取得
for(Barricade barr : _barrList){//障害物の数だけループ
Def.eHitCode code = barr.isHit(cir, vec);//接触判定
switch(code){
case OUT://接触したものが「アウト」なら
_status = eStatus.GAMEOVER;//アウト状態に
return true;
}
}
return false;
}
public boolean onUpdate() {
if( _status != eStatus.NORMAL ){//ゲームの状態が通常でないなら計算しない
return true;
}
if( Collision() ){//衝突判定 衝突したならメソッドを抜ける
return true;
}
for (int i = 0; i < _taskList.size(); i++) {
if (_taskList.get(i).onUpdate() == false) { // 更新失敗なら
_taskList.remove(i); // そのタスクを消す
i--;
}
}
return true;
}
private void drawStatus(Canvas c){//状態を表示する
switch( _status ){
case GAMEOVER:
Paint paint = new Paint();
paint.setTextSize(80);
paint.setColor(Color.BLACK);
c.drawText("GameOver", 40, 100, paint);
break;
}
}
public void onDraw(Canvas c) {
c.drawColor(Color.WHITE); // 白で塗りつぶす
for (Task task : _taskList) {
task.onDraw(c);// 描画
}
drawStatus(c);//状態を表示する
}
}
public class Player extends Task {
private final static float MAX_SPEED = 20; //移動する最大スピード
private final static float SIZE = 20; //自機の大きさ
private Circle _cir = null; //自機の円
private Paint _paint = new Paint(); //描画設定
private Vec _vec = new Vec(); //自機の移動ベクトル
private Vec _sensorVec = new Vec(); //センサーのベクトル
public Player(){
_cir = new Circle( 240, 400, SIZE ); //(240,0)の位置にSIZEの大きさの円を作る
_paint.setColor(Color.BLUE); //色を青に設定
_paint.setAntiAlias(true); //エイリアスをオン
}
//自機中心円を取得する
public final Circle getPt(){
return _cir;
}
// ベクトルをセットする
private void setVec(){
float x = -AcSensor.Inst().getX()*2; //加速度センサーの情報を取得
float y = AcSensor.Inst().getY()*2;
_sensorVec._x = x < 0 ? -x*x : x*x; //2乗して変化を大袈裟にする
_sensorVec._y = y < 0 ? -y*y : y*y; //2乗すると+になるので、負ならマイナスを付ける
_sensorVec.setLengthCap(MAX_SPEED); //ベクトルの大きさが最大スピード以上にならないようにする
_vec.blend( _sensorVec, 0.05f ); //センサーのベクトル方向に実際の移動ベクトルを5%近づける
}
// 移動ベクトルの向いている方に動かす
private void Move(){
_cir._x += _vec._x; //移動ベクトル_vecが指す方向に移動させる
_cir._y += _vec._y;
}
@Override
public boolean onUpdate(){
setVec(); //移動ベクトルをセットする
Move(); //移動ベクトルが向いている方に動かす
return true;
}
@Override
public void onDraw( Canvas c ){
c.drawCircle(_cir._x, _cir._y, _cir._r, _paint);
}
}

Portions of this page are modifications
based on work created and shared by Google and used according to terms
described in the Creative Commons 3.0 Attribution License.
- Remical Soft -