1 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 18:13:16 ] NTT DoCoMoのiモード携帯電話用Javaに関する話題を扱うスレッドです。 ※DoCoMo以外は下記スレへ。 CLDC+MIDP+携帯電話用Javaスレッド part 6 pc11.2ch.net/test/read.cgi/tech/1155174514/ ■ iアプリ特有ではなくJava一般に関する質問はこちらへ 【初心者】Java質問・相談スレッド99【大歓迎】 pc11.2ch.net/test/read.cgi/tech/1173026128/ ■ iモード携帯電話用Java(iアプリ)まとめサイト ton.my-sv.net/ ■関連スレ 【日本携帯】Mascot Capsule/Micro3D【標準】 pc8.2ch.net/test/read.cgi/tech/1117773530/ 過去スレ Part13 ttp://pc11.2ch.net/test/read.cgi/tech/1164168601/
976 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 10:44:27 ] umeるか
977 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 11:25:33 ] うめ
978 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 11:35:38 ] うめ
979 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 11:40:02 ] public class ume extends Canvas{
980 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 11:57:04 ] ただうめるのもつまらんな。 なんか情報残して埋めるか。 Doja5.0のエミュレータを起動する際に -u オプションを使用して ADFへのURLを設定する際、そのURLが有効でないと起動時に落ちる
981 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 11:58:16 ] Doja5.0のVer3.0.0のエミュレータはコマンドプロンプトから 起動した場合、DOS画面にSystem.out.printlnの出力を吐き出さないため デバッグ情報が見れない。 なおVer2.0.0以前なら見れる。
982 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 12:40:48 ] んじゃ俺も。 processEventのトラブル多いので、Canvas継承クラス貼り付け。 見た目の都合、全角スペースを沢山含んでいるので要削除。 多少問題もあるけどそこそこ動くと思う。 有識者の方適当に修正よろ。
983 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 14:52:44 ] >>985 動かしてないけど・・・10KBまでしか読めない?
989 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 14:54:01 ] ごめん、気のせいだった。 10KB単位で読み込むのね、りょーかい。
990 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 15:35:14 ] FPSを保つコード需要ある?
991 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 15:41:04 ] 張っておけば喜ぶ人もいるんじゃない?
992 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 15:44:47 ] ある つか急激に良スレ化
993 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:00:34 ] あ、コンパイル通らねぇw >>984 × if(keyUp & (1<<Display.KEY_UP) != 0 ) { ○ if((keyUp & (1<<Display.KEY_UP)) != 0 ) { 他にもありそうだなぁ(=´∇`=) で、残り7レス。
995 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:04:54 ] 余り時間計測する前に Thread.yield(); を呼んで、他のスレッドの処理を入れてやるのが吉
998 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:09:24 ] さぁうめるざますよ!
999 名前:345 mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:18:51 ] 345って・・・orz 983でした。ってことで1000
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。