package com.example.test01;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
//タスククラスの継承
public class FpsController extends Task
{
private long _startTime = 0; //測定開始時刻
private int _cnt = 0; //カウンタ
private Paint _paint = new Paint(); //paint情報
private float _fps; //fps
private final static int N = 60; //平均を取るサンプル数
private final static int FONT_SIZE = 20;//フォントサイズ
//
public FpsController()
{
_paint.setColor(Color.BLUE); //フォントの色を青
_paint.setTextSize(FONT_SIZE); //フォントサイズ設定
}
//
@Override
public boolean onUpdate()
{
if(_cnt == 0)//1フレーム目なら
{
//時刻を記憶
_startTime = System.currentTimeMillis();
}
if(_cnt == N)//60フレーム目なら
{
long t = System.currentTimeMillis();
_fps = 1000.f/((t-_startTime)/(float)N);//平均を計算
_cnt = 0;
_startTime = t;
}
_cnt++;
return true;
}
//
@Override
public void onDraw(Canvas c)
{
c.drawText(String.format("%.1f",_fps ) , 0 , FONT_SIZE-2 , _paint);
}
}
package com.example.test01;
import java.util.LinkedList;
import android.graphics.Canvas;
import android.graphics.Color;
public class GameMgr
{
private LinkedList<Task> _taskList = new LinkedList<Task>();//タスクのリスト
//
GameMgr()
{
//
_taskList.add(new FpsController());
}
//
public boolean onUpdate()
{
for(int i = 0 ; i < _taskList.size() ; i++)
{
if(_taskList.get(i).onUpdate() == false)//更新失敗なら
{
//そのタスクを消そう
_taskList.remove();
i--;
}
}
return true;
}
//
public void onDraw(Canvas c)
{
c.drawColor(Color.WHITE); //白く塗りつぶす
for(int i = 0 ; i< _taskList.size() ; i++)
{
_taskList.get(i).onDraw(c); //描画
}
}
}
package com.example.test01;
import android.content.Context;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable
{
private GameMgr _gameMgr = new GameMgr();
private Thread _thread;
//
public GameSurfaceView(Context context)
{
super(context);
getHolder().addCallback(this);
}
//
@Override
public void surfaceChanged(SurfaceHolder holder,int format,int width,int height)
{
//解像度情報変更通知
}
//
@Override
public void surfaceCreated(SurfaceHolder holder)
{
_thread = new Thread(this); //別スレでメインループ
_thread.start();
}
//
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
_thread = null;
}
//
@Override
public void run()
{
//メインループ
while(_thread != null)
{
_gameMgr.onUpdate();
onDraw(getHolder());//ここのonDrawでエラー
}
}
//
private void onDraw(SurfaceHolder holder)
{
Canvas c = holder.lockCanvas();
if(c == null)
{
return;
}
//ここに描画処理
_gameMgr.onDraw(c);//ここのonDrawでエラー
holder.unlockCanvasAndPost(c);
}
}
package com.example.test01;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
//メインアクティビティ
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new GameSurfaceView(this));
}
}
import android.graphics.Canvas;
public abstract class Task
{
public boolean onUpdate()
{
return true;
}
public void onDraw(Canvas c)
{
}
}ご教授お願いします。