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/
899 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 02:08:43 ] 音源がなければMLDに変換してもWAVE再生は不可能ということじゃないの?
900 名前:886 [2007/08/11(土) 02:58:10 ] 898の言っているのが正解。一種類で済むようになったって話。 ただしNは例外。 イロイロ調べてみたけど、一般の資料では、この辺の事書いてあるやつないんだな。 ってなわけで、この件について俺はもう語らん。
901 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 03:08:37 ] >>896 903が発売されたころ公式CPにはサウンドの互換性一覧 みたいなのが公開されて滝がする。俺は部署違うので、中身 見てないし、知ってても言えないんだけどそれじゃないのかなあ。 # 知ってはいないが経験的にはN以外全部一緒で鳴る そうでなくとも、SH/D/FについてはFUETREKのPCM音源を 積んだSH-Mobile G1だと報道発表されているので当然全く 同一の仕様で確定。NがMA-7なのは変わらず。Pだけは音源が 不明だけど、実際に鳴るってことは少なくともROHMからFUETREKの 音源に乗り換えたんじゃないのかな。と思ってる。
902 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 11:23:13 ] ドコモとFueTrekは去年くらいに近業務提携したはずだから、それの影響? wav2mldのサイトを見ると、903シリーズ以降は、[P F D SA]、[SH SO]、Nの3種類みたいだね。 1種類になったってことは、N以外は全部同じになるのか。 そのうちフォーマット公開されないかな
903 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 04:28:38 ] サーバーサイドにあるPHPにアクセスして、 ネットワークごしに画像をダウンロードする方法で戸惑っています。 // PHP側 <?php $img = imagecraetefromgif("img.gif"); header("Content-Type: image/gif"); imagegif($img); ?> // Java側 void downloadImage(String url) {
904 名前:903 mailto:sage [2007/08/12(日) 04:42:27 ] サーバーサイドにあるPHPにアクセスして、 ネットワークごしに画像をダウンロードする方法で戸惑っています。 // PHP側 <?php $img = imagecraetefromgif("test.gif"); header("Content-Type: image/gif"); imagegif($img); ?> // Java側 void downloadImage(String url) { try { HttpConnection hc = (HttpConnection)Connector.open(path, Connector.READ, true); hc.setRequestMethod(HttpConnection.GET); hc.connect(); InputStream in = hc.openInputStream(); byte[] data = new byte[(int)hc.getLength()]; in.read(data); ... } このような関数で、引数urlでphpのスクリプトにアクセスして画像をダウンロードしたいと思っているのですが、 これだとhc.getLength()が-1で、明らかに正常にアクセスできていません。 ちなみに、urlでgif画像の直リンクを張った場合は正常に動作します。 PHPの出力方法に問題がありそうな気がするので若干スレ違い気味ですが、原因がわかる方がいましたらお願いします。
905 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 07:00:26 ] > 原因がわかる方がいましたらお願いします。 ヘッダーにコンテントレングスをセットしていないから。
906 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 07:13:22 ] Content-Lengthの出力はサーバ側の設定によるもの。 アパッチのコンフィグで設定するなり何なり。 一方、iアプリ側はgetLength()が-1になることも考慮した組み方をしておく。 Content-Lengthを設定しておらず、自分でもいじれないサーバではアプリ側で対処するしかない。 if ((int)hc.getLength() == -1){〜} else{〜} てな記述。 具体的な記述内容はググればいくらでも例が見付かる。
907 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 10:43:49 ] >>904 >これだとhc.getLength()が-1で、明らかに正常にアクセスできていません。 getLength() が -1 でも正常にアクセスできててデータの中身はちゃんと読める。
908 名前:904 mailto:sage [2007/08/12(日) 12:06:52 ] >>905 PHP側でContent-Typeを出力する前に header("Content-Length : " . filesize("test.gif")); を追加してみたのですが、connect()の段階で止まってしまうのです。 >>906-907 -1でも正常にアクセスできているのは、初耳でした。 確かにレスポンスコードは200だったのですが・・・、ありがとうございます。 以下のコードで、正常に動作することを確認しました。 // Java側 hc.openInputStream()以下 ... byte[] data; if ((int)hc.getLength() != -1) { data = new byte[(int)hc.getLength()]; in.read(data); } else { ByteArrayOutputStream bs = new ByteArrayOutputStream(); while (true) { int temp = in.read(); if (temp == -1) { break; } bs.write(temp); } data = bs.toByteArray(); } ...
909 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 12:17:17 ] 公式資料に書いてあるっての
910 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 14:17:20 ] >908 そして第2のはまりポイント in.read(data); は一度で全部読み込めるとは限らないから -1が返るまでループ処理してバッファに追記していくこと
911 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 14:17:53 ] ってゴメン それはちゃんと書いてあるね
912 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 14:25:07 ] いや、getLength() != -1 のほうの data = new byte[(int)hc.getLength()]; in.read(data); これは良くない ↓のようにするか data = new byte[(int)hc.getLength()]; int i = 0, n; while ((n = in.read(data, i, data.length - i)) >= 0) { i += n; } 面倒かったら↓で data = new byte[(int)hc.getLength()]; new DataInputStream(in).readFully(data);
913 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 14:52:40 ] >>908 >connect()の段階で止まってしまうのです。 こりゃ実際に出力しているデータサイズが違うんじゃないの? たとえば ContentLength: 100を設定しておいて、データは90バイトしか送ってないとしたら 携帯側は残り10バイトが届くまで受信待ちの状態になってるだろうさ
914 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 17:59:27 ] だな。鯖側の処理おかしいもん。 こんなんでどうよ? <?php $fname = "test.gif"; $fdata = file_get_contents($name); $fsize = strlen($fdata); header("Content-Length: ". $fsize ); echo $fdata; ?>
915 名前:914 mailto:sage [2007/08/12(日) 18:04:08 ] あー、ちなみに何がおかしかったかというとimagecraetefromgif()でイメージリソース として取得したデータを、PHPで出力時にGIFに再変換しているから元のデータと微妙に 変わっているということ(画像としては同じになるけどヘッダとか違う)。 で、出力サイズは元ファイルのを出しているから、正しいサイズになってない。 そもそもgd呼ぶような面倒なことはしないで、そのままバイナリ吐いてやればよかった。
916 名前:914 mailto:sage [2007/08/12(日) 18:05:49 ] ごめ。2行目の引数は「$fname」な。 - $fdata = file_get_contents($name); + $fdata = file_get_contents($fname);
917 名前:904 mailto:sage [2007/08/12(日) 21:18:41 ] >>912 ネット上で調べた文献の多くがこの方法だったので・・・、迂闊でした。 一回のread()で読み切れない場合があるってことですかね? 今ひとつ理解できていませんが、直しておきます。 >>913-916 この方法を使ったら、普通にgetLength()で取得できるようになりました。 file_get_contents()でリソースを取得すれば良かったのですね。 ありがとうございます、おかげ様で理想通りに動作するようになりました。
918 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 21:24:49 ] >>917 InputStream#read は 「1バイト以上読む」 っていう仕様なので。 1バイトでも読めたらそれで返ってくることが許されてる。
919 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 23:44:44 ] 女の子にもてもてになるiアプリの作り方を教えてください。
920 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 23:51:52 ] エロゲーでも参考にして作ればいいと思うよ
921 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 02:30:50 ] >>919 女の子にモテモテになってからiアプリを作ればおk
922 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:41:14 ] 俺の女性の知り合いはみんなau_| ̄|○ il||li
923 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 05:46:13 ] じゃあ、オープンアプリを作ればいいじゃない
924 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 06:01:14 ] オープンだとウイルス入ってそうで怖い
925 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 01:03:27 ] スクリプトのパースメソッドだけで500行行きそうです
926 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 18:09:32 ] 質問させて下さい! ショートタイマーを使ったリアルタイム処理のゲームを作っています。 複数の端末で実機テストを行った所、一切エラーは発生しなかったのでユーザに配布したのですが 同じ機種でもエラーが発生する場合と発生しない場合があり、しかも特定の箇所ではなく毎回違う 場所でエラーが発生するそうなんです。 携帯側に処理を渡してないからかなと思い、至る所にスリープ処理を入れたのですが、それでも エラーが発生するそうなのです。 そこで一つ質問なのですが、現在のソースを見るとショートタイマーの発生時間は20に設定しています。 ループ内のスリープ時間の合計を見ると上記の20を超えておりました。 例えばショートタイマーイベントでの処理が終わっていないうちに次のショートタイマーのイベント発生時間に なった場合、強制的に2つの処理が同時に行われてしまうのでしょうか? それが原因でエラーが発生しているのかな?と思いましたので。 自分の端末でエラーが出るなら確認しやすいのですが、なにせ自分の端末ではエラーが発生しないので…。 長文で申し訳ありませんがよろしくお願い致します。
927 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 18:41:13 ] ループ内のスリープ時間ってなによ 何かループしてんの?
928 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 19:39:41 ] while(true)で回して中でsleepじゃなくて timerでタイマーイベント取得して、更にその中でsleep?
929 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 21:26:36 ] 個人の携帯の使い方に問題があってエラーが出る事も多いから、 いちがいにプログラムが悪いとも言えない。
930 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 22:34:28 ] タイマー分解能やタイマー精度、CPU負荷の問題で、きっちり20msecずつwaitすることはまずない。 タイマーイベントは同時に起こらないはず。心配ならsynchronizedすればいい。ただしイベントがたまりすぎると変になる機種もある。
931 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 22:39:37 ] とりあえず何のExceptionが出てるんだ? それはそうと、リアルタイムのゲームを作るならタイマイベントで 処理するよりも、while()ぶん回したほうがいいと思うけど。
932 名前:926 mailto:sage [2007/08/16(木) 03:55:22 ] 説明が分かりにくかったようで申し訳ありません… えっと、while(true)でぶん回す事も考えたのですが参考にしたサイトでは ショートタイマーでイベントを取得するように書かれていたので、そのようにして おります。20msecおきにタイマーイベントを取得して処理を行っているのです が(その事自体をループと書いてしまいました)そのタイマーイベントの中で Thread.sleep()を含んでいます。この合計が20msecを超えてしまっている という事です。というか書きながら思ったのですが、タイマーイベントを使用して いるのにThread.sleepを入れる必要性はないですね…。while(true)で無限 ループを作っている訳ではないのに…(汗) ただ、どちらにしてもそのタイマーイベントの中で時々forループで約5秒程の描画 処理が入る場合があるんです。なのでタイマーイベントの処理が20msec以内に 終わらない事が多々ある事は変わりません。 とりあえず質問したかった事はタイマーイベント処理が終わっていない時に次の タイマーイベント発生時間が来た場合、後ろをすぐ追いかけてくるような感じで 同時に処理が行われるのか?という事だったんですが930さんのご回答で 解決したように思います。
933 名前:926 mailto:sage [2007/08/16(木) 04:02:25 ] 連投&回答&再質問させて下さい… >>931 それがエミュレータでも自分の持っている実機でも一切エラーは発生しないんです。 なのでどこでどうエラーになっているのか皆目検討もつかないという感じです。。 ただ、友達の端末で試した所、エラーにはならないものの、画面のチラつきが激し かったんです。描画時には必ずlock〜unlockをかけているにも関わらずです。 なので、もしかしたら処理が同時に行われてて描画→描画が変なタイミングに なっているのかなぁなどと思った次第です。もちろんエミュレータや自分の持ってる 実機では一切画面のチラつきなどはありません。 とりあえずタイマーイベント処理の中から意味不明なThread.sleepを外して、イベント 発生時間を1000msecとか極端に伸ばしてみながら確認してみようと思います。 皆さん、色々ありがとうございました。
934 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 13:37:23 ] だからエラーってなにさ。
935 名前:926 mailto:sage [2007/08/16(木) 16:01:17 ] >>934 だからわかんねぇつってんだろハゲ! もっと文章読めや ソース公開してもいいかと思ったが ひとつ上のレスすら読めねえんじゃ無駄だわ
936 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 16:24:57 ] 今日も暑いねぇ。
937 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 16:35:30 ] >>935 読み難い長文書いておいて、「もっと文章読め」ってのは、質問する 立場としてどうよ。 >>934 は、お前さんの書き込みじゃ情報不足だってことを指摘してるだけでしょ。 大体お前さんは、ユーザーのところで起きている「エラー」というのがどういう 現象なのか、それを把握しているのかどうかを書いていないと思うが。
938 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 16:39:27 ] 別人じゃろうて。。。
939 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 17:30:31 ] しかし説明するか泣きを入れるかどっちかにして欲しいのは確か
940 名前:926 mailto:sage [2007/08/16(木) 19:01:37 ] すみません、935は私ではありません…。 読みづらい文章を書いて偽者が発生する原因を作ってしまった事をお詫び致します。。 ちなみに、ユーザからの問い合わせでは突然「アプリエラー」と表示されて終了する場合が あるという情報だけです。それも特定の箇所とかじゃなく完全に不特定だそうで…。 自分の実機やエミュでは一度もエラーが発生した事はありません。ちなみに数名から上記 のエラー報告を頂いたのですが機種もバラバラなんです。同じ機種でもエラーが発生する 人としない人がいるという、何とも対応しがたい現象なんです。しかも全ユーザから見る とエラーが発生する人はほんの数名だけ…(報告してないだけかもしれませんが) ただ今日ネットで調べまくって「もしかしたら」というものを見つけたので書いてみます。 @画面のチラつきが関連しているかもしれない →全てPaintにぶち込んでrepaint()ではなくpaint(getGraphics());に変えてみます。 Atimer処理を一時停止した後のタイマーstart()が二重になっていないか? →全てのタイマーstart()の前に念のためタイマーstop()を入れてみます というか毎回情報不足&ダラダラと長文で分かりづらくて申し訳ありません。 偽者も出てきたので皆に迷惑をかけるといけないので暫く自力で頑張ってみます。 本当にありがとうございました!
941 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 19:20:01 ] まあたぶん携帯のメモリー不足でエラーが出やすいんだと思うけど
942 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 20:11:11 ] アプリで例外をcatchしない場合もαエラーなんじゃないっけ?
943 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 21:16:50 ] すみません。質問させてください。 当方、iアプリでパチスロの収支管理ソフトを作ろうと思っています。 ですが、java自体初めてなものでScratchPadの保存ができても、一覧がうまくつくれません・・・ 本を買ったのですが・・一覧だけはのってなくて・・ 他の部分もこれでいいんだろうか・・という書き方になってしまっています。 一度、一覧を使った全体のサンプルソースを参考にさせて頂きたいです。 かなり、探したんですが見つかりません。 ご存知の方、教えて頂いたら幸いです。 家計簿でもなんでも、一覧を表示しているものであれば・・ 未熟な質問で申し訳ない。宜しくお願いします。
944 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 21:26:02 ] 酔ってます(@ω@) 一覧って意味がわからんのですお。 プログラムとしてはデータを読んで、表示するだけですお。 ついでに言うなら、パチは辞めた方がいいんじゃねーか? 2ch的にも人間としても(・∀・)
945 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 23:55:18 ] >943はiアプリのわからないところを質問するって段階以前の話だな 「初めてのプログラミング」とかそういう書籍を読むところから始めてくれ
946 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 03:06:25 ] はじめまして、Javaを勉強しはじめて五日目になります。 wikiを見てもまだ理解が出来る次元ではないので少しお邪魔します。 理由は、ゲームを作りたいからという動機なのでお仕事でやってる方には申し訳ないと思いますが 初心者歓迎の文字を見て入らせていただきました。 (ソフトはiαppliTool DoJa-3.5を使っております) 現在iアプリを作成中で、音楽を鳴らしているのですが音量を再生する場合に SoundPlayer.playTrackSound( 0, 0, 100 ); //トラック,リピート,音量(100max) と、置いているのですが、音量を変える時にソフトキーから切り替えで Int volを作りvolに数字を代入して SoundPlayer.playTrackSound( 0, 0, 100 - vol); としたところ、音楽が最初から再生されてしまいました。 これを現在流していたところまでの音楽から音量を途中で切り替わるようにしたいのですが どうしたら良いでしょうか、説明不足でしたら申し訳ございません。 どうか宜しくお願いします。
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を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。