 |
08. タイマー処理 |
 |
今回はタイマー処理です。
ほとんどのゲームは常に画面のどこかが動いています。
ということは常にループしておけば良いのではないか?と思う方もいるでしょうが
処理にかかる時間がばらつきがある場合
前回の1ループ処理が時間がかかったが次の1ループは早く処理が終わったと言う
場合もあると思います。
何も考えずにループして何回かに一回に描画と言う方法でループを作ると
早くなったり遅くなったりする妙なゲームが出来てしまいます。
これを回避する為に何ミリ秒ごとに処理を行なう言う方法を説明したいと思います。
Thread.sleepよりもタイマーの方が安定がいい気がします
タイマーではクラスが呼ばれますのでタイマークラスからキャンバスクラスのrepaintを
呼び出して処理をおこないます。
/*-------------------------------------------------------------------------
Timer
-------------------------------------------------------------------------*/
import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/*===================================================================
メインクラス
===================================================================*/
public class TimerSample extends MIDlet
{
public TimerSample(){
C canvas=new C();
Display.getDisplay(this).setCurrent(canvas);
GameTimer gametimer=new GameTimer(canvas);
//タイマーの生成
Timer timer =new Timer();
timer.schedule(gametimer,0,80);
}
public void startApp() {}//アプリの開始
public void pauseApp() {}//アプリの一時停止
public void destroyApp(boolean unconditional) {}//アプリの終了
}
/*===================================================================
キャンバスクラス
===================================================================*/
final class C extends Canvas
{
C() {}
/*========== paintメソッド ==========*/
public synchronized void paint(Graphics g)
{
//ここにタイマーで処理する内容を書いてください。
}
}
/*===================================================================
タイマーで呼ばれるクラス
===================================================================*/
class GameTimer extends TimerTask{
private Canvas _C;//キャンバスクラス受け取り用
GameTimer(Canvas C){
this._C=C;
}
public void run(){
_C.repaint();//repaintを呼び出して処理をする
}
}