07/08/24 11:58:16
Doja5.0のVer3.0.0のエミュレータはコマンドプロンプトから
起動した場合、DOS画面にSystem.out.printlnの出力を吐き出さないため
デバッグ情報が見れない。
なおVer2.0.0以前なら見れる。
982:デフォルトの名無しさん
07/08/24 12:40:48
んじゃ俺も。
processEventのトラブル多いので、Canvas継承クラス貼り付け。
見た目の都合、全角スペースを沢山含んでいるので要削除。
多少問題もあるけどそこそこ動くと思う。
有識者の方適当に修正よろ。
983:デフォルトの名無しさん
07/08/24 12:44:04
class appMain extends Canvas {
private int keyDown; // キーが押された瞬間にビットが立つ
private int keyArea; // キーが押されっぱなしならビットが立つ
private int keyUp; // キーが上がった瞬間にビットが立つ
public appMain() { // コンストラクタ。お好きにどーぞ
}
// TODO IApplication#start()で以下を呼ぶ
public void appStart() {
try {
while(true) {
keyUp = keyArea;
keyArea = keyDown | getKeypadState();
keyUp = keyUp & (~keyArea);
mainLoop();
keyDown = 0;
paint(getGraphics());
Thread.slepp(100); // 好きな時間で調節
}
}catch(Exception e){
// TODO 強制終了前に何か一言
}
}
984:デフォルトの名無しさん
07/08/24 12:46:15
public void paint(Graphics g){
// TODO 描画処理
}
public synchronized void processEvent(int type, int param) {
if (type == Display.KEY_PRESSED_EVENT ){
keyDown |= 1 << param;
}
}
public void mainLoop() {
// TODO キーイベント処理など。以下例
if(keyUp & (1<<Display.KEY_UP) != 0 ) {
// 上キーが上がった
}
}
}
今使ってるものからかなりいじってたんで、
コンパイル通らなかったらゴメンナサイ。
985:デフォルトの名無しさん
07/08/24 13:19:27
ファイル名を指定してリソースを読み込むメソッド
byte[] loadResFile(String file) {
byte[] b = null;
DataInputStream dis = null;
ByteArrayOutputStream out = null;
try {
dis = Connector.openDataInputStream("resource:///" + file);
byte[] buf = new byte[10 * 1024];
out = new ByteArrayOutputStream(buf.length);
int ret;
while ((ret = dis.read(buf)) != -1) {
out.write(buf, 0, ret);
}
b = out.toByteArray();
} catch (Exception e) {
} finally {
try {
out.close();
} catch (Exception e) {
}
try {
dis.close();
} catch (Exception e) {
}
}
return b;
}
986:デフォルトの名無しさん
07/08/24 13:38:54
スクラッチパッドの番号を指定してそのデータを全て読み込むメソッド
byte[] loadScratchpad(int num) {
byte[] b = null;
int size = 0;
try {
DataInputStream dis = Connector.openDataInputStream("scratchpad:///" + num);
int ret;
while ((ret = (int)dis.skip(100 * 1024)) > 0) {
size += ret;
}
dis.close();
b = new byte[size];
dis = Connector.openDataInputStream("scratchpad:///" + num);
dis.read(b, 0, size);
dis.close();
} catch (Exception e) {
try {
dis.close();
} catch (Exception e2) {
}
return null;
}
return b;
}
987:デフォルトの名無しさん
07/08/24 14:27:35
/**
Jarファイルからの画像のロード
@param fname ファイル名
@return Image 失敗の場合はnull
*/
private Image LoadImage( String fname )
{
Image img = null;
//バイナリデータのロード
try{
//Jarサイズの取得
DataInputStream din = Connector.openDataInputStream( "scratchpad:///0;pos=" + OFFSET_JAR_SIZE );
int size = din.readInt();
din.close();
//JarInflaterの取得
din = Connector.openDataInputStream( "scratchpad:///0;pos=" + OFFSET_JAR_DATA + ",length=" + size );
JarInflater ji = new JarInflater( din );
//画像の読み込み
MediaImage mi = MediaManager.getImage( ji.getInputStream( fname ) );
mi.use();
img = mi.getImage();
ji.close();
din.close();
}
catch( IOException e ){ DBGPRINTF( "Load " + e ); }
catch( Exception e ){ DBGPRINTF( "Load " + e ); }
return img;
}
988:デフォルトの名無しさん
07/08/24 14:52:44
>>985
動かしてないけど・・・10KBまでしか読めない?
989:デフォルトの名無しさん
07/08/24 14:54:01
ごめん、気のせいだった。
10KB単位で読み込むのね、りょーかい。
990:デフォルトの名無しさん
07/08/24 15:35:14
FPSを保つコード需要ある?
991:デフォルトの名無しさん
07/08/24 15:41:04
張っておけば喜ぶ人もいるんじゃない?
992:デフォルトの名無しさん
07/08/24 15:44:47
ある
つか急激に良スレ化
993:デフォルトの名無しさん
07/08/24 16:00:01
えらそうなこといってあれなんだが、実機ではいまいち正確に保ってくれないんだ
まぁ一応置いておく、誰か改変きぼう
public class FPS {
private static final int FLAMERATE = 30; //フレームレート。
private static final int FLAMETIME = 1000 / FLAMERATE; //1周期あたりの㍉秒
private boolean isFix; // FPSを固定するか
private long oldTime; // 一つ前の時間(Control)
private long beforeTime; // 一つ前の時間(Draw)
private long fpsCount; // 計測用FPS
private long fps; // 表示用FPS(1秒に一度更新)
FPS()
{
isFix = true;
beforeTime = 0;
oldTime = 0;
}
994:デフォルトの名無しさん
07/08/24 16:00:34
あ、コンパイル通らねぇw
>>984
× if(keyUp & (1<<Display.KEY_UP) != 0 ) {
○ if((keyUp & (1<<Display.KEY_UP)) != 0 ) {
他にもありそうだなぁ(=´∇`=)
で、残り7レス。
995:デフォルトの名無しさん
07/08/24 16:01:09
続き
/**
* スレッドのループ内に置くとFLAMERATEを調整してくれる
*
*/
public void control()
{
if(!isFix) return;
long nowTime = System.currentTimeMillis(); //経過時間。
long difTime = nowTime - oldTime;
if( difTime >= FLAMETIME ) //時間が余っている場合。
{
oldTime = nowTime;
return;
}
difTime = FLAMETIME - difTime;
//余り時間分待つ。
try
{
Thread.sleep( difTime );
}
catch( Exception e ){};
oldTime = oldTime + FLAMETIME;
}
996:デフォルトの名無しさん
07/08/24 16:01:43
ラスト
/**
* FPSを計測して描画する
*
*/
public void draw(Graphics g)
{
long time = System.currentTimeMillis();
// FPS の計測
if(time - beforeTime >= 1000)
{
// 1秒経ったところで表示用のFPSに代入
fps = fpsCount;
// 初期化
beforeTime = time;
fpsCount = 0;
}
fpsCount++;
g.drawString("FPS:" + fps, 5, 15);
}
}
997:デフォルトの名無しさん
07/08/24 16:04:54
余り時間計測する前に
Thread.yield();
を呼んで、他のスレッドの処理を入れてやるのが吉
998:デフォルトの名無しさん
07/08/24 16:09:24
さぁうめるざますよ!
999:345
07/08/24 16:17:39
>>993
こんな感じでメインループを空回ししてフレーム固定させてる。
ダイアログ出したりサスペンドの処理は長くなるので割愛。
public void appStart(){
long bt = System.currentTimeMillis(); // 処理基準時間
long nt = 0; // 次に処理する時間
long t, ct = 1;
while( true ){
t = System.currentTimeMillis() - bt;
if( nt > t){
try{
Thread.sleep( 1 );
} catch( Exception e){}
continue;
}
// スキップしたフレーム数分メインループを回す
for(int i = (int)(( t - nt ) * FLAMERATE / 1000); i >= 0; i--)
{
keyUp = keyArea;
keyArea = keyDown | this.getKeypadState();
keyUp = keyUp & (~keyArea);
mainLoop();
ct++;
keyDown = 0;
}
nt = ct * 1000L / FLAMERATE;
paint( getGraphics() );
}
}
1000:デフォルトの名無しさん
07/08/24 16:18:51
345って・・・orz
983でした。ってことで1000
1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。