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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。