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/
947 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 10:57:07 ] SoundPlayerって自分で作ったクラス?
948 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 11:38:53 ] >>947 そうですね、サウンドの管理は別のクラスでしています
949 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 11:49:12 ] >>943 収支管理かぁ昔つくったなぁ・・・練習作品としては悪くないけどな。 他の人も言ってるが「一覧」ってのが一体何を指すのか判らんからアドバイスはできないぞ。 画面に並べて表示する仕方がわからない!って意味なら表現方法なんて無限なんだから誰にもわからん。 ソース晒した方がよっぽどアドバイスもらえるかと。 ついでにいえばスロはもう終わりだから辞めとけw依存症になるまえに! >>946 まず誰もSoundPlayer.playTrackSound()ってのが何なのか判らないとおもうが。 自作メソッドなら中身見ないことにはどうにもならんが・・・どこかから拾ったものか? 頭から再生されるのはそのメソッドが内部でplayメソッドを使っているからだと思うが。 音量の設定はAudioPresenterクラスの setAttributeメソッドで音量を指定してセットする。
950 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 12:26:16 ] >>949 ありがとうございます。 setAttributeだけをいじったら音量だけ変わりました。 別のファイルで作っていたので見落としていたみたいです。 私の為にお時間いただいてありがとうございました。
951 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 19:17:35 ] >>944 よってらっしゃる・・ ありがとございます。 すみません。一覧っていうのは縦のグリッド表示の意味だったんですが、 iアプリじゃ無理のようですね。 わかりにくくてすみません。 パチスロは確かに2ch的には完全になかったかもです・・ でも、他に作れそうなものが、思いつかなくて・・;; >>949 ありがとうございます。 ソースはとてもじゃないですが、晒せるほどのものじゃ・・ 実際DOJAで動かしてみたら、 ラベル1 □□□□ ←テキストボックス ラベル2 □□□□ ラベル3 □□□□ となるはずが ラベル1 □□□□ラベル2 □□□□ラベル3 □□□□ みたいな画面になって散々でした;; HTMLLayout を使ってるんですが、何故か改行されませんね・・ DOJAじゃ反映されないのかな・・ この業界も長いので、ついサンプルに頼りがちで申し訳ない 勉強になるとおもってもう少しがんばってみます。 パチスロは実は5号機になってからほとんどいってません
952 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 00:21:54 ] サウンドの話を蒸し返して申し訳ないですが… 結局waveから変換したmldを再生させるゲームを作るには @各端末用のmldデータをネット上に置く Aアプリ内で端末情報を取得して、それに応じたmldをダウンロードして再生する っていう感じになるのかな? そもそも端末情報(機種)って取得出来るの?
953 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 00:29:43 ] できるよ。
954 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 19:50:01 ] System.get…なんだっけ? 開発資料PDFの後ろの方にまとめてある
955 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 21:43:16 ] System.getProperty("microedition.platform") ただしdoja2.0以降だったと思った まぁADPCMなMLDな時点でdoja3.0以降ぐらいになるとは思うけど
956 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:33:32 ] アプリゲットのダウンロード数ってどうやって調べてるんですか?
957 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:43:20 ] >>952 あらかじめjam/jarごと機種別データを用意しておいて ダウンロード時にUserAgent見て判別したほうがいいよ 場合によっては、アプリ本体も機種別処理を書かないと いけない場合があるから。NとかFとかDとかな…orz
958 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 02:40:14 ] リソースを変えるだけなら、アプリ側だけで済ます方が簡単だろ
959 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 22:03:12 ] ちょっと皆に質問! ボタンの連打対策ってどうしてます? 例えば無限ループで回してるシューティングゲーム等の場合なんだけど 一時的なアニメーション処理をforループで表示させてるんですよ。 その場合、forループでの処理中にボタンが押された場合、ループを抜けた直後に ボタンのイベントが開始されてしまいますよね? ループ前とループ後にフラグを立てて、ボタンイベントの入り口でフラグ判別を してみたんだけど、ループ中のフラグじゃなくループ後に拾うはずのフラグの方に 分岐してしまう。。 これはforループ中は「ボタンが押された」っていう情報を待機させておいて、実際に ボタンのイベントに飛ぶのはループを抜けた直後からって事だからだと思うんだけど。 要するにforループでの処理中はボタン押下の処理を行わせたくないって事なんだけど 皆はどういう感じで組んでるのか教えて下さい。。
960 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 00:51:29 ] getKeypadState
961 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 02:02:52 ] ループの中にスリープを入れてますかぁ?
962 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 06:27:36 ] >>960 早速getKeypadStateについて調べてみます! ありがとうございます。 >>961 それが入れてるけど駄目なのですよ(T-T) ループ中にガンガン連打してみると、ループ明けに3回分くらいのボタン押下処理が行われた形になってしまう…
963 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 12:19:21 ] イベント処理の中でループしてんじゃないでしょうね?
964 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 17:40:19 ] 質問させてください。 「Illegal protocol」と出てしまいサーバに接続できません。 どのように対処したらよいのか全くわかりません。 どこかにプロトコルを設定する箇所があるのでしょうか。 ご存知のかたおりましたら、アドバイスをお願いします。 以下、設定内容 ・UseNetWorkのhttpチェック済 ・PackageURLにサーバからのパスを設定済 ・トラステッド動作設定で通信許可URLに「*」設定済 ・通信部分ソース HttpConnection conn = null; conn = (HttpConnection)Connector.open(サーバURL, Connector.READ, true); conn.setRequestMethod(HttpConnection.GET); conn.connect();
965 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:26:03 ] URLが「http://」とか「https://」で始まっていないとか
966 名前:964 mailto:sage [2007/08/20(月) 18:35:02 ] 早速のご回答ありがとうございます。 >始まっていないとか packageURLを""で括っていたので、もしやと思い外したらうまくいきました。 非常に助かりました。ありがとうございました。
967 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 21:17:00 ] >>963 えっと、こんな感じです。 void paint{ メイン描画処理 } processEvent{ ショートタイマー{ repaint(); } 決定キー{ 分岐にて各種処理 ※ここで場合によってfadeout()へ飛ばしています } } void fadeout(){ forループで描画処理 } かなり簡略化して書いてみました。 自分は元々Cから入ったのでついつい関数と呼んでしまうんですが fedeout()関数の入り口と出口にフラグを立てて決定キーイベント中で判別しても ループ中に溜まってたボタン連打分がループ抜けしてから一気に押し寄せる感じです。 もちろんループ中にスリープは入れているのですが…
968 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 21:51:34 ] スリープ入れるとか関係ないし あるイベントを処理してるあいだ次のイベントが飛んでこないのはあたりまえ イベント処理の中でループしないというのが正しい方法
969 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 05:58:47 ] SDカードへの保存について質問です。 MediaManager.getImage("www. 〜〜"); で取得したMediaImageをSDカードに保存したいのですが、 StorageDevice sd = StorageDevice.getInstance("/ext0"); Folder folder = sd.getFolder((AccessToken)DoJaStorageService.getAccessToken(0, DoJaStorageService.SHARE_APPLICATION)); File file = folder.createFile("test.jpg"); FileEntity fe = file.open(File.MODE_WRITE_ONLY); OutputStream os = fe.openOutputStream(); とし、OutputStreamを取得できるのは分かったのですが、ここへMediaImageを書き込む方法が分かりません。 writeメソッドでは、byte配列を書き込むようなのですがMediaImageをbyte配列へ変換する方法があるのでしょうか?
970 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 11:20:23 ] >>968 まぁまぁ、知らないものはしょーがない。 >>967 processEventは大半が単一スレッドで実装されているものなので、 スリープすると他のイベント処理も一緒に停止する。 Win32の実装も同じだったと思うけど、そういうもの。 なので、根本的に作り変えないとダメ。 メインループ作るなら、IApplication#start() が別スレッドなので、 ここで無限ループ作る方法が楽だよ。 タイマーなんて不安定なもの使うより確実。 >>969 httpでダウンロードできるファイルなら、 素直にhttpConnectionでダウンロードすりゃいいんでない? MediaImageから変換する方法が無いでも無いけど。
971 名前:970 mailto:sage [2007/08/21(火) 15:24:54 ] 970踏んだのでテンプレ更新してるんだが・・・ >>1 のまとめサイトが全く更新されてないので消しても良いだろうか。 wikiさえも役に立ってねぇ
972 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 15:38:27 ] とりあえず残しておいた(´・ω・`) 次スレ iモード携帯電話用Java(iアプリ) Part15 ttp://pc11.2ch.net/test/read.cgi/tech/1187677946/
973 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:32:06 ] >>969 970さんが言っているように、HttpConnectionでjpgファイルをダウンロードするのが吉。 もし、どうしてもMediaImageからbyte配列にしたいんだったら、 MediaImageからgetImageでImage取り出して、それをImageEncoderにぶちこむ。 結果として得られるEncodedImageからはInputStreamが取れる。
974 名前:967 mailto:sage [2007/08/22(水) 00:48:14 ] >>968 >>970 ありがとうございました! 根本的な作り方がよろしくないようですね。。 とは言え、なんとか自己解決しました! 解決方法はこの間のソースを例にとると… void paint{ メイン描画処理 } processEvent{ getKeypadState();で決定キー押下の場合{ keywaitフラグが0ならばkeywaitフラグに"1"を立て、メイン処理を実行 ←追加 分岐にて各種処理 ※ここでfadeout()へ飛んだりする ←移動してきた } } ショートタイマー{ repaint(); keywaitフラグが"2"の場合に"0"に戻す ←追加 } 決定キーRELEASE keywaitフラグに"2"を立てる ←追加 } void fadeout(){ forループで描画処理 } このような感じで問題ありませんでした。多分、相当な回り道だと思いますが(笑) これなら、ループ中にいくら連打しても"一度タイマーイベントを通らないと"次の決定キー が有効にならないためうまくいきました。
975 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 02:57:29 ] >>970 >>973 ご教授ありがとうございます。 MediaImageで取るほうが楽に見えて、HttpConnection使おうとすらしていませんでしたorz 何でもやってみないとダメですね。 お手数おかけしました。 HttpConnectionで取得しようとした際に、 setRequestMethodでHttpConnection.GETを指定し、 setRequestPropertyでContent-Typeにimage/jpegを指定してconnectすると、 Illegal headerと言われてしまいうまく取得出来なかったのですが、 setRequestPropertyを消すとちゃんと取得できました。 >>973 MediaImageで取得した際の方法も教えて頂いてありがとうございます。
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を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。