日記を埋めるためだけのネタつぶし(2)

どこかのサイトに、ゲームメインのスレッドはRunnableを継承せずに
最初に呼ばれるメインスレッドを使用したほうがよいと、書かれていたので、使用してみることにした。


import com.nttdocomo.io.*;
import com.nttdocomo.ui.*;
import com.nttdocomo.util.*;

// メインクラス
public final class sample extends IApplication
{
Main c = new Main();
public sample() {
Display.setCurrent(c);
c.run(); // ここでゲームループを呼び出すように書かれていた。
}
public void start() { }
public void resume() { }

}
// キャンバス継承クラス
final class Main extends Canvas implements MediaListener
{
/*!
* @brief サウンドのコ−ルバック処理を行います。
*/
synchronized final public void mediaAction(MediaPresenter source , int type , int param) {
// サウンドの各所処理
・・・
}
/*!
* @brief イベント処理を実行します。
*/
final public void processEvent(int type , int param) {
// キーなどの各所処理
・・・
}
/*!
* @brief メインループを実行します。
*/
public void run() {
while (true) {
// 各ゲーム処理
}
}
}

エミュで実行してみたら、何も問題なかったのでRunnableを継承する分の容量だけ得したと思いきや
F505iで問題が発生してしまった。
キー処理を受け付けなかったり、サウンドのループ再生が行われなかったりするのだ。
調べてみると、processEventやmediaActionに処理が来ていないことがわかった。
F505iは、メインのスレッドでprocessEventやmediaActionを呼び出しているみたい。
したがってこの方法は却下となり、今までの形式を使いざる得なくなってしまった。
以下が今までの形式である。

import com.nttdocomo.io.*;
import com.nttdocomo.ui.*;
import com.nttdocomo.util.*;

// メインクラス
public final class sample extends IApplication
{
public sample() {
Display.setCurrent(new Main(this));
}
public void start() { }
public void resume() { }

}
// キャンバス継承クラス
final class Main extends Canvas implements Runnable, MediaListener
{
private static sample a;

/*!
* @brief コンストラク
*/
Main(sample a) {
this.a = a;
(new Thread(this)).start();
}
/*!
* @brief サウンドのコ−ルバック処理を行います。
*/
synchronized final public void mediaAction(MediaPresenter source , int type , int param) {
// サウンドの各所処理
・・・
}
/*!
* @brief イベント処理を実行します。
*/
final public void processEvent(int type , int param) {
// キーなどの各所処理
・・・
}
/*!
* @brief メインループを実行します。
*/
public void run() {
while (true) {
// 各ゲーム処理
}
}
}