|
|
2008/3/16(Sun) 13:56:03|NO.14311
今、WordやExcelで作った大量の文書データを閲覧するようなソフトを作っています。
文書データは暗号化した状態にしておき、閲覧時にデータ復号化→ファイル閲覧→閲覧終了後復号化データの削除
という流れをとっています。
で、そのプログラムは出来たのですが、初歩的なところでつまづいています。
データのリストを画面上で選択する際、ポインタをボタンに近づけるとそのボタンの周りに枠が出てきて、選択す
るとそのボタンの枠が点滅する、というゲーム等でよく用いられているボタンを作成しました。
点滅、ボタン作成などはもちろん問題ないのですが、ポインタを色々なボタンに近づける際、ボタンが変わるごと
にサッと枠が移ればいいのですが、どうも遅れが出たりしてしまいます。
ループ中にawait 10を入れていますが、これを10より小さくしても100fpsを超えるし、逆にwaitなどにしても待ち
時間が伸びて結果的に遅くなるし・・・。何か良い方法ありますでしょうか。
screen ,110,410
//90×30の四角を10ずつ離してY方向に10個並べる
repeat 10
color 177,150,252 : boxf 10,POSY,100,POSY+30
POSY=POSY+40
loop
repeat
//カーソルが四角の中にある場合黒枠、ない場合白枠
if(mousex>=10)&(mousex<=100)&(mousey>=PCNT*40)&(mousey<=30+PCNT*40):color ,,,:else:color 255,255,255
boxf 8 , PCNT*40-2 , 102 , PCNT*40
boxf 8 , PCNT*40+30 , 102 , PCNT*40+32
boxf 8 , PCNT*40 , 10 , PCNT*40+30
boxf 100 , PCNT*40 , 102 , PCNT*40+30
PCNT=PCNT+1
if PCNT>10 : PCNT=0
await 10
loop
|
|
2008/3/16(Sun) 16:43:37|NO.14313
枠判定毎にawaitを入れるのではなく、
全て判定してから休憩するというのは如何でしょうか?
screen ,110,410
//90×30の四角を10ずつ離してY方向に10個並べる
repeat 10
color 177,150,252 : boxf 10,POSY,100,POSY+30
POSY=POSY+40
loop
repeat
repeat 10
//カーソルが四角の中にある場合黒枠、ない場合白枠
if(mousex>=10)&(mousex<=100)&(mousey>=cnt*40)&(mousey<=30+cnt*40):color ,,,:else:color 255,255,255
boxf 8 , cnt*40-2 , 102 , cnt*40
boxf 8 , cnt*40+30 , 102 , cnt*40+32
boxf 8 , cnt*40 , 10 , cnt*40+30
boxf 100 , cnt*40 , 102 , cnt*40+30
loop
await 10
loop
|
|
2008/3/16(Sun) 16:46:17|NO.14314
面白そうなのでやってみました。
3.1って難しいですね。
選択したときの「点滅」もメッセージを受け取って動作する
スクリプトにしないといけないでしょうが…。
#define WM_MOUSEMOVE 0x200
screen ,100+110,410
//90×30の四角を10ずつ離してY方向に10個並べる
POSY=2
repeat 10
color 177,150,252 : boxf 10,POSY,100,POSY+29
POSY=POSY+40
loop
now = 0
color 0,0,0
;マウスが動いたら飛ぶ
oncmd goto *command , WM_MOUSEMOVE
stop
*command
y=(now=0)*40-2 ;今まであった黒枠を消す
pos 8 , now*40-2
gcopy 0 , 8 , y , 95 , 36
x=lparam&0xffff : y=lparam>>16
if (x-10)/90=0 & (y\40<31) { ;ボタンの上にある
y=y/40 : title "今は上から" + y + "番目のボタン"
if y<10{
boxf 8 , y*40 , 102 , y*40+1
boxf 8 , y*40+32 , 102 , y*40+33
boxf 8 , y*40+2 , 9 , y*40+31
boxf 101 , y*40+2 , 102 , y*40+31
now=y
}
}
stop
|
|
2008/3/16(Sun) 17:21:46|NO.14316
|
|
2008/3/16(Sun) 21:21:21|NO.14333
ループ方式でも工夫すればなんとかなるかな??
割込みじゃないから、別の処理中でループが回らないと機能しないけど・・・。
screen ,110,410
//90×30の四角を10ずつ離してY方向に10個並べる
repeat 10
color 177,150,252 : boxf 10,cnt*40,100,cnt*40+30
loop
#const blink_speed 15 //点滅速度の値
pos_mark = -1 //現在マークされているボタンの位置・番号
repeat
//現在マウスカーソルの居るボタンを得る
pos_now = -1
if( mousex>=10 && mousex<=100 ) {
repeat 10
if( mousey < cnt*40 ) { continue }
if( mousey > cnt*40+30 ) { continue }
pos_now = cnt
break
loop
}
//現在マークされているボタンと、現在のマウスの居るボタンが、異なっていたら書き換え
if( pos_now != pos_mark ) {
if( pos_mark != -1 ) {
color 255,255,255
gosub *draw_mark
}
pos_mark = pos_now
if( pos_now != -1 ) {
color 0,0,0
gosub *draw_mark
blink_count = 0
blink_state = 1
}
}
//一定時間経ったらマークの色変更
if( blink_count > blink_speed ) {
blink_count = 0
blink_state = 1 - blink_state
if( blink_state ) { color 0,0,0 } else { color 255,255,255 }
gosub *draw_mark
}
await 20
if( pos_mark != -1 ) { blink_count++ }
loop
*draw_mark
boxf 8 , pos_mark*40-2 , 102 , pos_mark*40
boxf 8 , pos_mark*40+30 , 102 , pos_mark*40+32
boxf 8 , pos_mark*40 , 10 , pos_mark*40+30
boxf 100 , pos_mark*40 , 102 , pos_mark*40+30
return
| |
|
2008/3/16(Sun) 21:39:04|NO.14339
uhouhoさん、Meganeさん、Asさんどうもありがとうございます。
確かに判定中にはawaitいらないですね(笑)一括判定してその後にawaitすれば遅れることはなくなりました!
しかしfpsがやっぱり…プログラム用のPCはIntel Core 2 Duoなので特に問題なかったのですが、通常用の
PC(Intel Pentium)で確認すると、ツールとしては適さないfps、CPU値が出てきました…点滅時にexecでデー
タ開いたりするので点滅のスクリプトも結構考えないと重い^^;
HSP開発Wiki読んでデュアルじゃなくても快適に動作するソフト目指して勉強してみます。
|
|
2008/3/16(Sun) 21:49:46|NO.14340
かぶりました(笑)aさん、ありがとうございます。
CやJavaを利用してた時はこんな画面をダイナミックに変化させるようなプログラミングしてません
でしたから、今回HSPに手を出した次第です。ループ形式の工夫で結果がこんなに変わるとは…HSP
って面白いですね!
皆さん、ありがとうございました!
|
|
2008/3/16(Sun) 21:58:11|NO.14341
CやJAVAを経験しているのであれば、HSPでたくさんのWin32APIや、ウィンドウプロシージャの仕組みやさまざまな関数など
理解することによって、VCやJavaによる大規模なWindowsプラットフォームSDKによるプログラミングも、
自ずとできるようになっているはずですよ。開発がんばってください(b^−
|
|
2008/3/17(Mon) 08:07:17|NO.14350
結果報告です(笑)
まだスクリプトリフォームすべき部分があると思いますが、一応動作的には満足いくようになりました。
まあ、プログラム完成をみてからいじくっていこうと…
#module
#deffunc choice_system int p1,int p2,int p3,int p4,int p5,int p6
BOXPOSX=int(p1) //四角を配置するX座標
BOXLENGH=int(p2) //四角のX方向への長さ
BOXPOSY=int(p3) //四角を配置するY座標
BOXHIGH=int(p4) //四角のY方向への長さ
NEXTBOX=int(p5) //次の四角への間隔
REPCHOCNT=int(p6) //四角の個数
redraw 0
repeat REPCHOCNT
color 177,150,252 :boxf BOXPOSX,BOXPOSY,BOXPOSX+BOXLENGH,BOXPOSY+BOXHIGH
BOXPOSY=BOXPOSY+NEXTBOX
loop
BOXPOSY=BOXPOSY-NEXTBOX*REPCHOCNT
repeat REPCHOCNT
if(mousex>=BOXPOSX)&(mousex<=BOXPOSX+BOXLENGH)&(mousey>=BOXPOSY+cnt*NEXTBOX)&(mousey<=BOXPOSY+BOXHIGH+cnt*NEXTBOX):color ,,,:else:color 255,255,255
boxf BOXPOSX-2 , BOXPOSY+cnt*NEXTBOX-2 , BOXPOSX+BOXLENGH+2 , BOXPOSY+cnt*NEXTBOX
boxf BOXPOSX-2 , BOXPOSY+cnt*NEXTBOX+BOXHIGH , BOXPOSX+BOXLENGH+2 , BOXPOSY+cnt*NEXTBOX+BOXHIGH+2
boxf BOXPOSX-2 , BOXPOSY+cnt*NEXTBOX , BOXPOSX , BOXPOSY+cnt*NEXTBOX+BOXHIGH
boxf BOXPOSX+BOXLENGH , BOXPOSY+cnt*NEXTBOX , BOXPOSX+BOXLENGH+2 , BOXPOSY+cnt*NEXTBOX+BOXHIGH
loop
redraw 1
return
#global
screen ,170,280
mes "四角を配置するX座標":input p1
mes "四角のX方向への長さ":input p2
mes "四角を配置するY座標":input p3
mes "四角のY方向への長さ":input p4
mes "次の四角への間隔":input p5
mes "四角の個数":input p6
button goto "作成",*MADE
stop
*MADE
screen 1,p1+p2+p1,p3+p5*p6
repeat
choice_system p1,p2,p3,p4,p5,p6
await 10
loop
stop
| |
|