iモード携帯電話用Java(iアプリ) Part14at TECH
iモード携帯電話用Java(iアプリ) Part14 - 暇つぶし2ch809:デフォルトの名無しさん
07/07/26 07:42:35
別にDoJaからコンパイルする必要はない。
クラスパスを指定して普通のJavaソースと同じようにコンパイルするだけ。

810:デフォルトの名無しさん
07/07/26 12:40:58
つか、最新の開発ツールだと -source 1.3 付けてくれてるみたいだぞ。久々にいじったのでいつからかわからんが、これでjdk1.4とはおさらばできそうだ。

811:デフォルトの名無しさん
07/07/26 22:24:49
新しいコンパイラなら最適化も素晴らしくなっているだろう……と思いきや
最近のjavacはJITの存在を念頭に置いてて、あまり最適化しない、むしろ
JITが扱いやすい型にはまったバイトコード生成をするという話も聞く。

812:デフォルトの名無しさん
07/07/26 22:56:29
javacがするのは、定数折りたたみ、意味のない式や制御構造の削除とかの簡単なもの。
JITの性能が上がりすぎて、コンパイル時の最適化が効果が薄くなった。
コンパイル時の最適化を期待するにはjavac以外のツールが必要。

813:805
07/07/27 04:42:59
>>809>>810
ありがとうございます。
そういや、最近DoJa5.0はVer3になりましたもんね。
それでできるようになったのかな?
以前は1.5だとエラー出てたけど。

814:デフォルトの名無しさん
07/07/27 11:17:31
何か今時の話題のようなので報告。
JDK1.5.0_12+iαppliTool 5.0ver3.00 でコンパイル成功してます。
環境変数等、インストールした時のまんまなので標準環境だと思ふ


815:デフォルトの名無しさん
07/07/28 02:35:09
DoJaの開発環境は地味ながら継続的に改良されているよね
もうちょっと宣伝すればいいのに

816:デフォルトの名無しさん
07/07/28 23:59:39
DXなしでGPSを使用したアプリって作成不可?
端末の位置情報を取得するくらいならできるのかな

817:名無しさん@そうだ選挙に行こう
07/07/29 08:31:24
無理

818:デフォルトの名無しさん
07/07/30 01:53:36
F904i(マーガレット機種)でjamのDrawAreaの設定について教えてください。
F904iは描画領域が240×432なんですが、
DrawAreaもそれに合わせて240×432にしたところ、
y=392~411のあたりにソフトキーラベルが浮いて表示されると
ユーザから指摘を受けました。
で、DrawAreaを240×391にしたところ、
今度は「描画領域が相変わらず240×432になっている」と指摘されました。
F904iのDrawAreaの挙動って、何か特殊な対応が必要なんでしょうか?
なんとかソフトキーラベルが画面表示に被らないようにしたんですが。。。


819:デフォルトの名無しさん
07/07/30 02:55:07
>>818
DoJa-5.x用の開発ガイド詳細編を読んでみるといいよ。
DrawAreaで検索かけて掛かったところ全部。

DrawAreaは任意の値で領域サイズを変えられるわけじゃない。
サポートしているサイズが端末ごとに決まっている模様。

ソフトキー描画を非表示にするメソッドが使える場合もあるとも書いてある。
全画面表示を指定した場合のソフトキー表示が気に入らなかったら、
ソフトキーを非表示にしてアプリでソフトキーを描画する方法になるだろうね。

820:デフォルトの名無しさん
07/07/30 03:12:20
Frame.setSoftLabelVisible(false)

821:デフォルトの名無しさん
07/07/30 09:58:28
さらに突っ込むなら
現時点でFrame#setSoftLabelVisible(false)を使用して全画面表示が
可能なのは、端末資料を見る限りだとFシリーズの903i以降と703i以降だ。

なお、F機はフルスクリーンにしないと端末資料に書かれている
最大画面サイズを使用できない。

822:デフォルトの名無しさん
07/07/30 21:19:04
勝手直感ゲームまだー?(・∀・ )っ/凵 ⌒☆チンチンチン


823:818
07/07/31 02:20:57
>819-821
ありがとうございます。
ずっと、任意の領域に変えられるものだと思ってました。。。

>可能なのは、端末資料を見る限りだとFシリーズの903i以降と703i以降だ。
Fと、Dの903/703もいけそうでした。

>Frame.setSoftLabelVisible(false)
今自分が作っているアプリの場合だと、
クライアントアプリ内で端末名判断してやることになりそうです。
ソースにベタで。
新しく同様の機種が出るたびにリビルド。。。



824:デフォルトの名無しさん
07/07/31 03:42:43
703でも903のアプリは動きそうなんですけどダメですか?


825:デフォルトの名無しさん
07/07/31 04:21:26
どちらとも言えない。アプリによって答えは違う。
そのアプリが動くかどうかは作った人に聞け。

826:821
07/07/31 10:08:25
>>823
>Fと、Dの903/703もいけそうでした。
D端末の端末資料には全画面表示非対応となっているが
いったい端末資料のどこを見て全画面表示が可能だと判断したんだ?

俺が言っているいる全画面表示(フルスクリーン)というのは
Frame#setSoftLabelVisible(false)によってソフトキーの表示を消し
その領域まで使用できることだぞ。

240x320など、240x240以上の領域がDrawAreaで指定可能であるのと
全画面表示が可能であるのは、別の話。
F以外の903以降の端末(PとN903iを除く)の端末はソフトキーを消さずに
240x320以上の領域が使用できるということだ。


827:デフォルトの名無しさん
07/07/31 11:08:39
>>822
トラステッドおんりー

828:デフォルトの名無しさん
07/07/31 11:34:52
GestureReaderであれば普通に使えるでしょ?
大して面白い機能でも無いから使わんけど。

829:デフォルトの名無しさん
07/07/31 17:38:25
>>821さ、誤解を招くようなおかしい文章を自分が書いといて何で噛み付いてんだい。

>Frame#setSoftLabelVisible(false)を使用して全画面表示が可能なのは、
setSoftLabelVisible()はソフトキーの表示/非表示を切り替えるためのメソッドだ。
でもあんたの説明では全画面表示の切り換えに使うメソッドのように読み取れる。

>>823が書いた「Fと、Dの903/703もいけそうでした。」はもちろん
Dの903/703でもsetSoftLabelVisible()はサポートしてるようでした、の意味だ。

830:デフォルトの名無しさん
07/07/31 20:41:46
サポートしてなくても、とりあえずThrowableをcatchしとけばいいんでない?

831:デフォルトの名無しさん
07/07/31 22:31:39
質問させてください。
アプリから、端末に保存している曲データ(MFiやSMFではなく、圧縮音声データ)
を再生したいと思っています。

単純に思いつくのは、MovieStore.selectEntry()でiモーションデータ取得する方法
ですが、このクラスはNとSHの端末でしかサポートされていないようです。
(今回はFをターゲットにしているので、この方法は使えません)

曲データはサイズがでかいので、アプリ同梱や通信でとってくる方法も出来れば
使いたくありません。
あくまで、あらかじめ端末に保存されている曲データを再生したいと思っています。

他に良い方法はあるでしょうか?


832:デフォルトの名無しさん
07/07/31 23:35:49
偽装gifして読み込む

833:デフォルトの名無しさん
07/08/01 00:05:33
903以降のFって、偽装GIFのコメントヘッダを勝手にとっちゃうから使えないって聞いたけど…

834:デフォルトの名無しさん
07/08/01 21:58:21
偽装jpgという手もあるぞ
F903iXだけどgifdeladでjpg偽装したテキストが
iアプリのテキストリーダーで読めたからいけるはず

URLリンク(www.moeracode.net)

835:831
07/08/01 23:27:54
>>831-834
情報㌧クスです。
偽装なんとかについては詳しくないので、一度研究してみます。

836:デフォルトの名無しさん
07/08/02 11:18:52
DoJaってLinkedList持ってないよな?
リスト構造が必要になった時って皆どうしてるんだ?

837:デフォルトの名無しさん
07/08/02 13:03:04
無いなら作れ

838:836
07/08/02 15:10:32
Vectorで代用することにしたよ。
使えるらしいし。

839:デフォルトの名無しさん
07/08/03 01:18:47
>>838
LinkedListとVectorじゃ、計算量的な特徴は全く違うけどね。

840:デフォルトの名無しさん
07/08/03 01:38:22
サスペンドイベントと終了イベント(MIDPで言うところのpauseApp()とdestroyApp())が
取れないことがわかって絶望した。
アプリ終了されたときにセーブか何かするってできんやん……

841:デフォルトの名無しさん
07/08/03 03:10:33
サスペンド発生のタイミングは基本的に着信やバッテリー残量不足など
即座にアプリから端末へ制御を渡さなければならない状況。
そのためアプリに余計な処理をさせないようにしてある。

終了イベントをアプリで受け取れるようじゃ端末として問題ありだろう。
電源キーで強制終了しようにも、わざと(またはバグで)無限ループ、
バッテリー抜くまで終了できないアプリが作れちゃう。

で、セーブデータ保存タイミングだけど、アプリ実行中にこまめに保存するしかない。
ゲームなら1ステージクリアごととか、タイトル画面へ戻る度にとか。

842:デフォルトの名無しさん
07/08/03 03:23:20
841だが何かズレたこと言ってるな自分
暑さのせいだ、スルーしといてくれ

843:デフォルトの名無しさん
07/08/03 04:43:50
もしかしてMIDP準拠のアプリで、destroyAppで無限ループすると操作効かなくなるの?

844:デフォルトの名無しさん
07/08/03 09:23:09
Maximum byte code length (32KB) exceeded
というエラーがいきなり出るようになったんですが
なんなんですかこれは?
ネットで調べても見つかりません

845:デフォルトの名無しさん
07/08/03 10:37:53
英語の意味のまんま。
直訳してみ?

846:デフォルトの名無しさん
07/08/03 10:51:52
バイトコードが32KBを越えた
意味不明

847:デフォルトの名無しさん
07/08/03 10:56:00
だからそのままだって。
1メソッド32KBの制約に引っかかったから普通のプログラム組めってこと。


848:デフォルトの名無しさん
07/08/03 11:10:41
>>843
実機依存かもしれないが、イベントハンドラから一定時間リターンしなかったら
強制終了、だったような。

849:デフォルトの名無しさん
07/08/03 11:54:49
>>844
ネットで何を調べたんだ?

850:デフォルトの名無しさん
07/08/03 20:28:57
>>844
っていうかこのスレくらい検索しようぜw
ソースうpしてくれ。
>>379のときは見れなかったんだ。興味あるw

851:デフォルトの名無しさん
07/08/04 15:45:48
ボタンを一ドット単位で配置設定なんてことできないよね?

852:379
07/08/04 21:12:12
メソッドのサイズを削るために
メソッド内の変数を外に出したらクラスの容量が一気に増えて
今度はクラスの容量が32KBオーバーになっちゃったみたい。
メソッドのサイズ削るよりクラス削るほうが難しそうです・・
ちょうど話題に上がってたみたいなのでもう1回うpしてみました。
URLリンク(zif.hp.infoseek.co.jp)

853:デフォルトの名無しさん
07/08/04 22:06:16
クラスに32Kの容量制限があるなんて初耳だ

854:デフォルトの名無しさん
07/08/04 23:08:03
500シリーズとか700シリーズの話じゃね?
30kだっけか。


855:デフォルトの名無しさん
07/08/04 23:15:05
おそらく暗黙的に宣言される static {} のサイズが32Kを超えたと思われ。
単純な配列データは別ファイルにしてリソースとして読み込むようにして、
その他のものは幾つかのクラスに分散すべし。

856:379
07/08/05 00:32:23
>>855
レスありがとうございます
リソースとして読み込むってのがよく分からないけど
とりあえず変数は別のクラスに分散させてみます

857:デフォルトの名無しさん
07/08/05 03:53:49
>>856
855さんが言ってるのは、配列の初期化だと思われ。
byte[] a = { ....};
ってやつね。

858:デフォルトの名無しさん
07/08/05 09:28:20
>>854
jarのサイズでなく、プログラム的に1メソッドのサイズ制限だと思われ。
どっかのpdfに書いてあった気がするが忘れたし暑くて探す気がしないから調べといて。

859:デフォルトの名無しさん
07/08/05 12:26:58
>>851
できちゃうんだな、これが。

860:デフォルトの名無しさん
07/08/05 15:45:13
クラスのメンバ変数は、バイトコード上ではすべて特別なメソッドに置かれる。
そのメソッドが32kBを超えたからコンパイルエラーになった。

855のリソースにして読むというのは、大きな配列はスクラッチパッドやネットワークとかのクラス外に置いて、実行時に動的に読み込めということだろう。

861:379
07/08/05 21:17:15
>>860
普通のメソッドは3000行書いても大丈夫だったのに
クラスのメンバ変数はちょっと書いただけで32KB超えたってことは
メンバ変数にすると容量を大量に消費するってことかな

大きな配列は別クラスに移してあるのでリソースにしなくても大丈夫かな

862:デフォルトの名無しさん
07/08/05 22:07:33
int[] a = { 10, 20, 30, 40 };
とかっていうのは
a = new int[4];
a[0] = 10;
a[1] = 20;
a[2] = 30;
a[3] = 40;
って書いたのとほぼ同じだから、相当に容量を食う。

863:デフォルトの名無しさん
07/08/05 22:11:59
byte[] a = { 10, 20, 30, 40 };
に至っては
a = new byte[4];
a[0] = (byte)((int)10);
a[1] = (byte)((int)20);
a[2] = (byte)((int)30);
a[3] = (byte)((int)40);
と言う感じでintの即値をbyteにキャストするから、さらに食う。

864:デフォルトの名無しさん
07/08/05 23:34:03
>>863
byteの配列ってそんな実装なんだ。
知らなかった。勉強になったよ。
まさか想定の4倍食ってるとは……。

865:デフォルトの名無しさん
07/08/06 00:49:26
ヒント : javap -c

866:デフォルトの名無しさん
07/08/06 01:39:33
どちらにせよ、データは外出ししておいた方が、管理しやすいし入れ替えやすいし良いよ。
理想的には、プログラムをいじらなくても敵キャラやステージを追加できるくらいにすべき。

867:デフォルトの名無しさん
07/08/06 12:16:36
iアプリで音楽再生するプログラムを書いています。
サンプルを参考にして、MIDIから変換したMLDファイルの演奏はできました。
変換はフリーソフトを使いました。
次は効果音を鳴らしたいんですが、効果音はMIDIではないですよね。効果音は
どのように作成すればいいのでしょうか。
プログラムの話とは少し違いますが、iアプリで鳴らせる音について調べても
良く分からなかったので質問しました。

いろんなサイトを見ても、MLD形式のファイルがMIDIだと書いてあるのに、
着ボイスの拡張子もMLDだったりでよく分かりません。あと、YAMAHAのサイトで
変換するツールのようなものを見つけたのですが、NEC端末用と書いてあったので
違うのかもしれません。

お願いします。


868:デフォルトの名無しさん
07/08/06 13:17:38
>>867
waveからmldに変換するツール探すといいよ。
多分殆どはシェアウェアで、
フリーのは2秒制限とかの制約がつくものが多いと思う。

mldは機種ごとにフォーマットが異なるので、
対応させる機種分mldファイルを用意しないとならない。
Nだけ対応すれば良いのなら、YAMAHAのでもいいかもね。


869:デフォルトの名無しさん
07/08/06 13:22:11
>>859
どーやって?


870:デフォルトの名無しさん
07/08/06 14:23:35
>>860
ちと試してみたけど、以下のケースでNGだった。
32KB制限云々に限って言えば、
メンバ変数の初期化はコンストラクタ内で実行されるのと同意なんでない?

class app{
 static byte buf[] = {0,1,2,3,4,・・・}; // ←バイトコードで16KB以上、32KB未満になる配列
 app() {
  byte buf2[] = {0,1,2,3,4,・・・}; // ←バイトコードで16KB以上、32KB未満になる配列
 }
};

>>861
前にも指摘されてるけどさ、
そもそも「3000行の普通のメソッド」なんて有り得ないから。
cだけどこの辺読んでみるといいかも。
URLリンク(www.pro.or.jp)

まー、その場しのぎで良いならクラス2つに分けて、
変数部分だけごっそり移動すれば解決するんじゃないかね。
0から作り直したほうが早いと思うけど。


871:デフォルトの名無しさん
07/08/06 14:31:31
一昔前のiアプリじゃいかにメソッドを作らないかを
試行錯誤したもんだが、随分とヌルくなっちまったな。


いいことだ(・∀・)

872:デフォルトの名無しさん
07/08/06 14:34:00
インスタンス変数はコンストラクタで、static変数はstaticイニシャライザで初期化される

873:デフォルトの名無しさん
07/08/06 15:04:36
インスタンス変数とコンストラクタが<init>で、スタティック変数とstatic{}内が<clinit>というメソッド名になる。
>>867
MLDは、MIDIのような情報、Wave(ADPCM)のような情報どちらも扱える。
>>863
配列の初期化のときの代入は、iastoreとbastoreの違いだけで、
バイトコード上でのキャストはなかったはず。

874:379
07/08/06 16:45:56
>>870
メソッド少なくしたのはどっかのサイトにメソッドは少ないほうが
容量少ないって書いてあったからです。
次作るときはオブジェクトに分けるのを試してみたいです。

配列がバイトコードになったときのサイズどうやって調べたんですか?

875:デフォルトの名無しさん
07/08/06 18:41:46
キーリビートってどう実装したらいいんですか?

876:デフォルトの名無しさん
07/08/06 18:59:38
>>869
レイアウト管理オブジェクトを無効にして、
自分でコンポーネントの座標を設定する。

877:867
07/08/06 19:15:42
>>868
ありがとうございます。
wav2mldというソフトを見つけて体験版を試してみたのですが、長さは
2秒もない音声ですがエミュレータ上では再生できませんでした。
そんなに高くなかったので製品版を購入してもう一度試してみようと思います。
他にも変換ソフトがあるようでしたら教えてもらえると嬉しいです。フリーじゃ
なくてもいいです。自分の端末はSOなのでYAMAHAのものではダメのようです。

>>873
ありがとうございます。
WAV形式のMLD形式(?)があって、どちらも拡張子がMLDということでよいでしょうか。
wav2mldというソフトの製品版を使ってみようと思います。

878:デフォルトの名無しさん
07/08/06 21:05:30
>>875
毎フレームgetKeypadState()して、過去数フレームと見比べる。


ところで、Java->C, J2ME->BREW自動変換をうたうツールやベンチャーをたまに見かけるが、
GCをどう解決してるかについて何も言ってないのは詐欺認定でいいよな?

879:デフォルトの名無しさん
07/08/06 22:31:40
>>875
俺はボタンが押されたら別スレッドでループを回して
離れたらスレッドを切るようにしてる

880:831
07/08/06 23:19:16
>>831で質問した者です。
偽装JPEGファイル経由で音声iモーション(AACファイル)再生できたので、
やり方など残しておきます。

・ImageStore.selectEntry()でImageStore取得
・ImageStore.getInputStream()でInputStream取得
・InputStream.read()で不要なデータ読み捨て
・MediaManager.getImage(java.io.InputStream in)でMediaImage取得
・MediaManager.use()
・AudioPresenter.getAudioTrackPresenter()でAudioTrackPresenter取得
・AudioTrackPresenter.setSound(MediaImage sound)でiモーションセット
・AudioTrackPresenter.play()で再生

再度、>>831-834に感謝。

881:デフォルトの名無しさん
07/08/07 08:06:06
>>880
おーすごい、レポ乙でつ(`・ω・´)ゝ

882:デフォルトの名無しさん
07/08/07 11:05:55
>>880
俺偽装ファイル扱うの知らないんだが、最後から2番目の
MediaImage sound
てどこから出てくるん? MediaManager.getSoundの間違い?

883:デフォルトの名無しさん
07/08/07 11:36:22
AudioTrackPresenterのリファレンス参照しる
> 動画のオーディオトラックは MediaImage オブジェクトであるため、
> setSound(MediaImage) メソッドにて設定する必要があることに
> 注意して下さい。

884:デフォルトの名無しさん
07/08/07 12:30:48
>>877
>>376でも言った気がするが、PsmPlayerがあるだろ。無料で使えてwav変換も出来るぞ。

885:デフォルトの名無しさん
07/08/07 15:26:18
PsmはN用に変換してもN903iで再生できなかった

886:821
07/08/07 15:49:06
NはYAMAHAのサウンドを使っているから他と同じにしてはだめ。

今まで各端末メーカごとのサウンド作成する必要がったが
903から統一されて一つのサウンドでよくなった。
しかし、Nだけ903用のサウンドを使用しても鳴らず
N902i用のサウンドを使う羽目になった。

887:デフォルトの名無しさん
07/08/07 17:08:35
IアプリからSOAP経由でWEBサービスを利用する事ってできるんでしょうか?
BREWアプリなら可能なんですが…。

888:デフォルトの名無しさん
07/08/07 17:25:00
>>887




889:デフォルトの名無しさん
07/08/07 18:46:59



890:デフォルトの名無しさん
07/08/07 18:54:40
>>886
ごめん、それもっと詳しく教えてくほしい

891:886
07/08/07 20:07:50
すまん、前提が違っていた。
俺がmld変換に使っているツールはpsmではなく
DoCoMoの公式CPに配信されるツールとプラグインなのよ。

ところで、俺はpsmについてはあまり詳しく知らないんだけど
これって505の世代までしか対応していないんじゃないかな?
そうだとすると、903とは世代が相当違うから
鳴る保障はほとんどないのでは?

892:デフォルトの名無しさん
07/08/07 20:42:49
MFiToolsか…

893:831
07/08/07 22:39:16
>>882
AudioTrackPresenter.setSound(MediaImage sound)の括弧の中は、
単なる引数を書いてるだけなので、AudioTrackPresenter.setSoundに
MediaImageオブジェクトを渡すってことです。
("sound"は単なる引数名)

894:デフォルトの名無しさん
07/08/08 23:08:34
Javaを勉強するぞおおぉ!

895:デフォルトの名無しさん
07/08/09 22:34:11
やっぱりあんまりメモリ気にしなくて良いのは楽だなぁ。
自分で弄れた方が良い場面もあったが、最近は殆ど関係無いから
やっぱJavaって良いわ。

896:デフォルトの名無しさん
07/08/10 13:39:35
>886

>今まで各端末メーカごとのサウンド作成する必要がったが
>903から統一されて一つのサウンドでよくなった。

これのソースが知りたい…
(ソースと言ってもプログラムじゃなくて情報源のほう)

897:デフォルトの名無しさん
07/08/11 00:11:05
たぶんサウンドというのはMIDI音源のことじゃなくて
PCM音源のことを言っているんだと思う
PCM音源だと機種によっては実装していない


898:デフォルトの名無しさん
07/08/11 01:03:29
MFiTools(?)の吐くmldが1種類になったってことだろ

899:デフォルトの名無しさん
07/08/11 02:08:43
音源がなければMLDに変換してもWAVE再生は不可能ということじゃないの?


900:886
07/08/11 02:58:10
898の言っているのが正解。一種類で済むようになったって話。
ただしNは例外。
イロイロ調べてみたけど、一般の資料では、この辺の事書いてあるやつないんだな。
ってなわけで、この件について俺はもう語らん。

901:デフォルトの名無しさん
07/08/11 03:08:37
>>896
903が発売されたころ公式CPにはサウンドの互換性一覧
みたいなのが公開されて滝がする。俺は部署違うので、中身
見てないし、知ってても言えないんだけどそれじゃないのかなあ。
# 知ってはいないが経験的にはN以外全部一緒で鳴る

そうでなくとも、SH/D/FについてはFUETREKのPCM音源を
積んだSH-Mobile G1だと報道発表されているので当然全く
同一の仕様で確定。NがMA-7なのは変わらず。Pだけは音源が
不明だけど、実際に鳴るってことは少なくともROHMからFUETREKの
音源に乗り換えたんじゃないのかな。と思ってる。

902:デフォルトの名無しさん
07/08/11 11:23:13
ドコモとFueTrekは去年くらいに近業務提携したはずだから、それの影響?
wav2mldのサイトを見ると、903シリーズ以降は、[P F D SA]、[SH SO]、Nの3種類みたいだね。
1種類になったってことは、N以外は全部同じになるのか。
そのうちフォーマット公開されないかな

903:デフォルトの名無しさん
07/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
07/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:デフォルトの名無しさん
07/08/12 07:00:26
> 原因がわかる方がいましたらお願いします。
ヘッダーにコンテントレングスをセットしていないから。


906:デフォルトの名無しさん
07/08/12 07:13:22
Content-Lengthの出力はサーバ側の設定によるもの。
アパッチのコンフィグで設定するなり何なり。

一方、iアプリ側はgetLength()が-1になることも考慮した組み方をしておく。
Content-Lengthを設定しておらず、自分でもいじれないサーバではアプリ側で対処するしかない。
if ((int)hc.getLength() == -1){~} else{~} てな記述。
具体的な記述内容はググればいくらでも例が見付かる。

907:デフォルトの名無しさん
07/08/12 10:43:49
>>904
>これだとhc.getLength()が-1で、明らかに正常にアクセスできていません。

getLength() が -1 でも正常にアクセスできててデータの中身はちゃんと読める。

908:904
07/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:デフォルトの名無しさん
07/08/12 12:17:17
公式資料に書いてあるっての

910:デフォルトの名無しさん
07/08/12 14:17:20
>908
そして第2のはまりポイント
in.read(data); は一度で全部読み込めるとは限らないから
-1が返るまでループ処理してバッファに追記していくこと

911:デフォルトの名無しさん
07/08/12 14:17:53
ってゴメン
それはちゃんと書いてあるね

912:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/12 14:52:40
>>908
>connect()の段階で止まってしまうのです。
こりゃ実際に出力しているデータサイズが違うんじゃないの?

たとえば
ContentLength: 100を設定しておいて、データは90バイトしか送ってないとしたら
携帯側は残り10バイトが届くまで受信待ちの状態になってるだろうさ

914:デフォルトの名無しさん
07/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
07/08/12 18:04:08
あー、ちなみに何がおかしかったかというとimagecraetefromgif()でイメージリソース
として取得したデータを、PHPで出力時にGIFに再変換しているから元のデータと微妙に
変わっているということ(画像としては同じになるけどヘッダとか違う)。
で、出力サイズは元ファイルのを出しているから、正しいサイズになってない。
そもそもgd呼ぶような面倒なことはしないで、そのままバイナリ吐いてやればよかった。

916:914
07/08/12 18:05:49
ごめ。2行目の引数は「$fname」な。
 - $fdata = file_get_contents($name);
 + $fdata = file_get_contents($fname);


917:904
07/08/12 21:18:41
>>912
ネット上で調べた文献の多くがこの方法だったので・・・、迂闊でした。
一回のread()で読み切れない場合があるってことですかね?
今ひとつ理解できていませんが、直しておきます。

>>913-916
この方法を使ったら、普通にgetLength()で取得できるようになりました。
file_get_contents()でリソースを取得すれば良かったのですね。

ありがとうございます、おかげ様で理想通りに動作するようになりました。


918:デフォルトの名無しさん
07/08/12 21:24:49
>>917
InputStream#read は 「1バイト以上読む」 っていう仕様なので。
1バイトでも読めたらそれで返ってくることが許されてる。

919:デフォルトの名無しさん
07/08/12 23:44:44
女の子にもてもてになるiアプリの作り方を教えてください。

920:デフォルトの名無しさん
07/08/12 23:51:52
エロゲーでも参考にして作ればいいと思うよ

921:デフォルトの名無しさん
07/08/13 02:30:50
>>919
女の子にモテモテになってからiアプリを作ればおk

922:デフォルトの名無しさん
07/08/13 04:41:14
俺の女性の知り合いはみんなau_| ̄|○ il||li

923:デフォルトの名無しさん
07/08/13 05:46:13
じゃあ、オープンアプリを作ればいいじゃない

924:デフォルトの名無しさん
07/08/13 06:01:14
オープンだとウイルス入ってそうで怖い

925:デフォルトの名無しさん
07/08/15 01:03:27
スクリプトのパースメソッドだけで500行行きそうです

926:デフォルトの名無しさん
07/08/15 18:09:32
質問させて下さい!
ショートタイマーを使ったリアルタイム処理のゲームを作っています。
複数の端末で実機テストを行った所、一切エラーは発生しなかったのでユーザに配布したのですが
同じ機種でもエラーが発生する場合と発生しない場合があり、しかも特定の箇所ではなく毎回違う
場所でエラーが発生するそうなんです。
携帯側に処理を渡してないからかなと思い、至る所にスリープ処理を入れたのですが、それでも
エラーが発生するそうなのです。

そこで一つ質問なのですが、現在のソースを見るとショートタイマーの発生時間は20に設定しています。
ループ内のスリープ時間の合計を見ると上記の20を超えておりました。
例えばショートタイマーイベントでの処理が終わっていないうちに次のショートタイマーのイベント発生時間に
なった場合、強制的に2つの処理が同時に行われてしまうのでしょうか?
それが原因でエラーが発生しているのかな?と思いましたので。
自分の端末でエラーが出るなら確認しやすいのですが、なにせ自分の端末ではエラーが発生しないので…。

長文で申し訳ありませんがよろしくお願い致します。

927:デフォルトの名無しさん
07/08/15 18:41:13
ループ内のスリープ時間ってなによ
何かループしてんの?

928:デフォルトの名無しさん
07/08/15 19:39:41
while(true)で回して中でsleepじゃなくて
timerでタイマーイベント取得して、更にその中でsleep?

929:デフォルトの名無しさん
07/08/15 21:26:36
個人の携帯の使い方に問題があってエラーが出る事も多いから、
いちがいにプログラムが悪いとも言えない。


930:デフォルトの名無しさん
07/08/15 22:34:28
タイマー分解能やタイマー精度、CPU負荷の問題で、きっちり20msecずつwaitすることはまずない。
タイマーイベントは同時に起こらないはず。心配ならsynchronizedすればいい。ただしイベントがたまりすぎると変になる機種もある。

931:デフォルトの名無しさん
07/08/15 22:39:37
とりあえず何のExceptionが出てるんだ?
それはそうと、リアルタイムのゲームを作るならタイマイベントで
処理するよりも、while()ぶん回したほうがいいと思うけど。

932:926
07/08/16 03:55:22
説明が分かりにくかったようで申し訳ありません…

えっと、while(true)でぶん回す事も考えたのですが参考にしたサイトでは
ショートタイマーでイベントを取得するように書かれていたので、そのようにして
おります。20msecおきにタイマーイベントを取得して処理を行っているのです
が(その事自体をループと書いてしまいました)そのタイマーイベントの中で
Thread.sleep()を含んでいます。この合計が20msecを超えてしまっている
という事です。というか書きながら思ったのですが、タイマーイベントを使用して
いるのにThread.sleepを入れる必要性はないですね…。while(true)で無限
ループを作っている訳ではないのに…(汗)
ただ、どちらにしてもそのタイマーイベントの中で時々forループで約5秒程の描画
処理が入る場合があるんです。なのでタイマーイベントの処理が20msec以内に
終わらない事が多々ある事は変わりません。
とりあえず質問したかった事はタイマーイベント処理が終わっていない時に次の
タイマーイベント発生時間が来た場合、後ろをすぐ追いかけてくるような感じで
同時に処理が行われるのか?という事だったんですが930さんのご回答で
解決したように思います。


933:926
07/08/16 04:02:25
連投&回答&再質問させて下さい…
>>931
それがエミュレータでも自分の持っている実機でも一切エラーは発生しないんです。
なのでどこでどうエラーになっているのか皆目検討もつかないという感じです。。
ただ、友達の端末で試した所、エラーにはならないものの、画面のチラつきが激し
かったんです。描画時には必ずlock~unlockをかけているにも関わらずです。
なので、もしかしたら処理が同時に行われてて描画→描画が変なタイミングに
なっているのかなぁなどと思った次第です。もちろんエミュレータや自分の持ってる
実機では一切画面のチラつきなどはありません。
とりあえずタイマーイベント処理の中から意味不明なThread.sleepを外して、イベント
発生時間を1000msecとか極端に伸ばしてみながら確認してみようと思います。
皆さん、色々ありがとうございました。

934:デフォルトの名無しさん
07/08/16 13:37:23
だからエラーってなにさ。


935:926
07/08/16 16:01:17
>>934
だからわかんねぇつってんだろハゲ!
もっと文章読めや
ソース公開してもいいかと思ったが
ひとつ上のレスすら読めねえんじゃ無駄だわ

936:デフォルトの名無しさん
07/08/16 16:24:57
今日も暑いねぇ。

937:デフォルトの名無しさん
07/08/16 16:35:30
>>935
読み難い長文書いておいて、「もっと文章読め」ってのは、質問する
立場としてどうよ。
>>934は、お前さんの書き込みじゃ情報不足だってことを指摘してるだけでしょ。

大体お前さんは、ユーザーのところで起きている「エラー」というのがどういう
現象なのか、それを把握しているのかどうかを書いていないと思うが。

938:デフォルトの名無しさん
07/08/16 16:39:27
別人じゃろうて。。。

939:デフォルトの名無しさん
07/08/16 17:30:31
しかし説明するか泣きを入れるかどっちかにして欲しいのは確か

940:926
07/08/16 19:01:37
すみません、935は私ではありません…。
読みづらい文章を書いて偽者が発生する原因を作ってしまった事をお詫び致します。。

ちなみに、ユーザからの問い合わせでは突然「アプリエラー」と表示されて終了する場合が
あるという情報だけです。それも特定の箇所とかじゃなく完全に不特定だそうで…。
自分の実機やエミュでは一度もエラーが発生した事はありません。ちなみに数名から上記
のエラー報告を頂いたのですが機種もバラバラなんです。同じ機種でもエラーが発生する
人としない人がいるという、何とも対応しがたい現象なんです。しかも全ユーザから見る
とエラーが発生する人はほんの数名だけ…(報告してないだけかもしれませんが)

ただ今日ネットで調べまくって「もしかしたら」というものを見つけたので書いてみます。
①画面のチラつきが関連しているかもしれない
→全てPaintにぶち込んでrepaint()ではなくpaint(getGraphics());に変えてみます。
②timer処理を一時停止した後のタイマーstart()が二重になっていないか?
→全てのタイマーstart()の前に念のためタイマーstop()を入れてみます

というか毎回情報不足&ダラダラと長文で分かりづらくて申し訳ありません。
偽者も出てきたので皆に迷惑をかけるといけないので暫く自力で頑張ってみます。

本当にありがとうございました!

941:デフォルトの名無しさん
07/08/16 19:20:01
まあたぶん携帯のメモリー不足でエラーが出やすいんだと思うけど


942:デフォルトの名無しさん
07/08/16 20:11:11
アプリで例外をcatchしない場合もαエラーなんじゃないっけ?

943:デフォルトの名無しさん
07/08/16 21:16:50
すみません。質問させてください。

当方、iアプリでパチスロの収支管理ソフトを作ろうと思っています。
ですが、java自体初めてなものでScratchPadの保存ができても、一覧がうまくつくれません・・・
本を買ったのですが・・一覧だけはのってなくて・・
他の部分もこれでいいんだろうか・・という書き方になってしまっています。

一度、一覧を使った全体のサンプルソースを参考にさせて頂きたいです。
かなり、探したんですが見つかりません。

ご存知の方、教えて頂いたら幸いです。
家計簿でもなんでも、一覧を表示しているものであれば・・

未熟な質問で申し訳ない。宜しくお願いします。


944:デフォルトの名無しさん
07/08/16 21:26:02
酔ってます(@ω@)


一覧って意味がわからんのですお。
プログラムとしてはデータを読んで、表示するだけですお。

ついでに言うなら、パチは辞めた方がいいんじゃねーか?
2ch的にも人間としても(・∀・)

945:デフォルトの名無しさん
07/08/16 23:55:18
>943はiアプリのわからないところを質問するって段階以前の話だな
「初めてのプログラミング」とかそういう書籍を読むところから始めてくれ

946:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/17 10:57:07
SoundPlayerって自分で作ったクラス?

948:デフォルトの名無しさん
07/08/17 11:38:53
>>947
そうですね、サウンドの管理は別のクラスでしています

949:デフォルトの名無しさん
07/08/17 11:49:12
>>943
収支管理かぁ昔つくったなぁ・・・練習作品としては悪くないけどな。
他の人も言ってるが「一覧」ってのが一体何を指すのか判らんからアドバイスはできないぞ。
画面に並べて表示する仕方がわからない!って意味なら表現方法なんて無限なんだから誰にもわからん。
ソース晒した方がよっぽどアドバイスもらえるかと。
ついでにいえばスロはもう終わりだから辞めとけw依存症になるまえに!

>>946
まず誰もSoundPlayer.playTrackSound()ってのが何なのか判らないとおもうが。
自作メソッドなら中身見ないことにはどうにもならんが・・・どこかから拾ったものか?
頭から再生されるのはそのメソッドが内部でplayメソッドを使っているからだと思うが。

音量の設定はAudioPresenterクラスの
setAttributeメソッドで音量を指定してセットする。

950:デフォルトの名無しさん
07/08/17 12:26:16
>>949
ありがとうございます。
setAttributeだけをいじったら音量だけ変わりました。
別のファイルで作っていたので見落としていたみたいです。
私の為にお時間いただいてありがとうございました。

951:デフォルトの名無しさん
07/08/17 19:17:35
>>944
よってらっしゃる・・
ありがとございます。
すみません。一覧っていうのは縦のグリッド表示の意味だったんですが、
iアプリじゃ無理のようですね。
わかりにくくてすみません。
パチスロは確かに2ch的には完全になかったかもです・・
でも、他に作れそうなものが、思いつかなくて・・;;

>>949
ありがとうございます。
ソースはとてもじゃないですが、晒せるほどのものじゃ・・
実際DOJAで動かしてみたら、

ラベル1 □□□□  ←テキストボックス
ラベル2 □□□□
ラベル3 □□□□


となるはずが

ラベル1 □□□□ラベル2 □□□□ラベル3
 □□□□

みたいな画面になって散々でした;;
HTMLLayout を使ってるんですが、何故か改行されませんね・・
DOJAじゃ反映されないのかな・・
この業界も長いので、ついサンプルに頼りがちで申し訳ない
勉強になるとおもってもう少しがんばってみます。
パチスロは実は5号機になってからほとんどいってません


952:デフォルトの名無しさん
07/08/18 00:21:54
サウンドの話を蒸し返して申し訳ないですが…
結局waveから変換したmldを再生させるゲームを作るには
①各端末用のmldデータをネット上に置く
②アプリ内で端末情報を取得して、それに応じたmldをダウンロードして再生する
っていう感じになるのかな?
そもそも端末情報(機種)って取得出来るの?

953:デフォルトの名無しさん
07/08/18 00:29:43
できるよ。

954:デフォルトの名無しさん
07/08/18 19:50:01
System.get…なんだっけ?
開発資料PDFの後ろの方にまとめてある

955:デフォルトの名無しさん
07/08/18 21:43:16
System.getProperty("microedition.platform")

ただしdoja2.0以降だったと思った
まぁADPCMなMLDな時点でdoja3.0以降ぐらいになるとは思うけど

956:デフォルトの名無しさん
07/08/18 23:33:32
アプリゲットのダウンロード数ってどうやって調べてるんですか?

957:デフォルトの名無しさん
07/08/18 23:43:20
>>952
あらかじめjam/jarごと機種別データを用意しておいて
ダウンロード時にUserAgent見て判別したほうがいいよ
場合によっては、アプリ本体も機種別処理を書かないと
いけない場合があるから。NとかFとかDとかな…orz


958:デフォルトの名無しさん
07/08/19 02:40:14
リソースを変えるだけなら、アプリ側だけで済ます方が簡単だろ

959:デフォルトの名無しさん
07/08/19 22:03:12
ちょっと皆に質問!
ボタンの連打対策ってどうしてます?

例えば無限ループで回してるシューティングゲーム等の場合なんだけど
一時的なアニメーション処理をforループで表示させてるんですよ。
その場合、forループでの処理中にボタンが押された場合、ループを抜けた直後に
ボタンのイベントが開始されてしまいますよね?
ループ前とループ後にフラグを立てて、ボタンイベントの入り口でフラグ判別を
してみたんだけど、ループ中のフラグじゃなくループ後に拾うはずのフラグの方に
分岐してしまう。。
これはforループ中は「ボタンが押された」っていう情報を待機させておいて、実際に
ボタンのイベントに飛ぶのはループを抜けた直後からって事だからだと思うんだけど。

要するにforループでの処理中はボタン押下の処理を行わせたくないって事なんだけど
皆はどういう感じで組んでるのか教えて下さい。。

960:デフォルトの名無しさん
07/08/20 00:51:29
getKeypadState

961:デフォルトの名無しさん
07/08/20 02:02:52
ループの中にスリープを入れてますかぁ?




962:デフォルトの名無しさん
07/08/20 06:27:36
>>960
早速getKeypadStateについて調べてみます!
ありがとうございます。

>>961
それが入れてるけど駄目なのですよ(T-T)
ループ中にガンガン連打してみると、ループ明けに3回分くらいのボタン押下処理が行われた形になってしまう…

963:デフォルトの名無しさん
07/08/20 12:19:21
イベント処理の中でループしてんじゃないでしょうね?

964:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/20 18:26:03
URLが「http://」とか「https://」で始まっていないとか

966:964
07/08/20 18:35:02
早速のご回答ありがとうございます。

>始まっていないとか
packageURLを""で括っていたので、もしやと思い外したらうまくいきました。
非常に助かりました。ありがとうございました。

967:デフォルトの名無しさん
07/08/20 21:17:00
>>963
えっと、こんな感じです。

void paint{
  メイン描画処理
}
processEvent{
  ショートタイマー{
    repaint();
  }
  決定キー{
  分岐にて各種処理
  ※ここで場合によってfadeout()へ飛ばしています
  }
}
void fadeout(){
  forループで描画処理
}

かなり簡略化して書いてみました。
自分は元々Cから入ったのでついつい関数と呼んでしまうんですが
fedeout()関数の入り口と出口にフラグを立てて決定キーイベント中で判別しても
ループ中に溜まってたボタン連打分がループ抜けしてから一気に押し寄せる感じです。
もちろんループ中にスリープは入れているのですが…


968:デフォルトの名無しさん
07/08/20 21:51:34
スリープ入れるとか関係ないし
あるイベントを処理してるあいだ次のイベントが飛んでこないのはあたりまえ
イベント処理の中でループしないというのが正しい方法

969:デフォルトの名無しさん
07/08/21 05:58:47
SDカードへの保存について質問です。

MediaManager.getImage("URLリンク(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:デフォルトの名無しさん
07/08/21 11:20:23
>>968
まぁまぁ、知らないものはしょーがない。

>>967
processEventは大半が単一スレッドで実装されているものなので、
スリープすると他のイベント処理も一緒に停止する。
Win32の実装も同じだったと思うけど、そういうもの。
なので、根本的に作り変えないとダメ。

メインループ作るなら、IApplication#start() が別スレッドなので、
ここで無限ループ作る方法が楽だよ。
タイマーなんて不安定なもの使うより確実。

>>969
httpでダウンロードできるファイルなら、
素直にhttpConnectionでダウンロードすりゃいいんでない?
MediaImageから変換する方法が無いでも無いけど。


971:970
07/08/21 15:24:54
970踏んだのでテンプレ更新してるんだが・・・
>>1のまとめサイトが全く更新されてないので消しても良いだろうか。
wikiさえも役に立ってねぇ


972:デフォルトの名無しさん
07/08/21 15:38:27
とりあえず残しておいた(´・ω・`)
次スレ

iモード携帯電話用Java(iアプリ) Part15
スレリンク(tech板)


973:デフォルトの名無しさん
07/08/21 23:32:06
>>969
970さんが言っているように、HttpConnectionでjpgファイルをダウンロードするのが吉。
もし、どうしてもMediaImageからbyte配列にしたいんだったら、
MediaImageからgetImageでImage取り出して、それをImageEncoderにぶちこむ。
結果として得られるEncodedImageからはInputStreamが取れる。

974:967
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/24 10:44:27
umeるか

977:デフォルトの名無しさん
07/08/24 11:25:33
うめ

978:デフォルトの名無しさん
07/08/24 11:35:38
うめ

979:デフォルトの名無しさん
07/08/24 11:40:02
public class ume extends Canvas{

980:デフォルトの名無しさん
07/08/24 11:57:04
ただうめるのもつまらんな。
なんか情報残して埋めるか。

Doja5.0のエミュレータを起動する際に -u オプションを使用して
ADFへのURLを設定する際、そのURLが有効でないと起動時に落ちる


981:デフォルトの名無しさん
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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch