記録

記録

Android SurfaceView でカウントダウンタイマー実装

最近Androidでゲームアプリを作成してて、カウントダウンタイマーを実装する時にちょっと詰まったのでメモ。

/**
 * 制限時間を計算
 */
public class CalcTime {
    private final int GAME_TIME = 30;
    private long mNowTime;
    private long mStartTime;

    public CalcTime() {
        this.mNowTime = GAME_TIME;
    }

    // 現在の時間を返す
    public long getNowTime(){
        return mNowTime;
    }
    // カウントダウン開始
    public void startCountDown(){
        mStartTime = System.currentTimeMillis();
    }

    // 現在の時間を計算
    // カウント終了でtrueを返す
    public boolean calc(){
        long current = System.currentTimeMillis();
        long time_gone = (current - mStartTime) / 1000;
        if(time_gone >= 30){
            mNowTime = 0;
        }else {
            mNowTime = GAME_TIME - time_gone;
        }
        if(mNowTime == 0) {
            return true;
        }
        return false;
    }
}

startCountDown()で開始時間をセットして毎フレームcalc()で計算、getNowTime()で値を取得して表示すればOK。
↓表示例(SurfaceViewを継承したクラスで実装)

private CalcTime mCalcTime = new CalcTime();
private Boolean mClicked = false;
 @Override
    public void run() {
        while (thread != null){
           if(mClicked){
             mCalcTime.calc();
           }
           this.onDraw(getHolder());
        }
    }
    private void onDraw(SurfaceHolder holder){
        Canvas c = holder.lockCanvas();
        if(c == null){
            return;
        }
         // 1の位
        int ones_time = (int)mCalcTime.getNowTime() % 10;
        // 10の位
        int tens_time = (int)mCalcTime.getNowTime() / 10;
        c.drawText(tens_time,0,0,paint);
        c.drawText(ones_time,0,FONT_SIZE,paint);

        holder.unlockCanvasAndPost(c);
    }
 @Override
   public boolean onTouchEvent(MotionEvent event) {
       if(event.getAction() == ACTION_DOWN){
          mClicked = true;
          mCalcTime.startCountDown();
       }
       return super.onTouchEvent(event);
   }