HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0316
OBASANポインタの動きに連動するボタンの作成8解決


OBASAN

リンク

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



この記事に返信する


uhouho

リンク

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



Megane

リンク

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



As

リンク

2008/3/16(Sun) 17:21:46|NO.14316

”repeat 〜loop”間は、ゲームなどでの連続描画には向いているのですが、
ツールでは不向きです。というのは、このスクリプトだと動作中にCPUが1〜2%ぐらいは
消費されてしまうからです。
 独自に描画をするボタンのスクリプトについてはHSP開発Wikiのほうでいくつか方法があり
ますので紹介します。

オーナードローボタン
http://hspdev-wiki.net/?cmd=read&page=OwnerDraw%2FODButton&word=%A5%AA%A1%BC%A5%CA%A1%BC%A5%C9%A5%ED%A1%BC

ウィンドウメッセージを使った画像ボタン
http://hspdev-wiki.net/?eseobj%2Fimgbtn

モジュール変数による実装
http://hspdev-wiki.net/?eseobj%2Fimgbtn2

円形ボタン
http://hspdev-wiki.net/?cmd=read&page=%B1%DF%B7%C1%A5%DC%A5%BF%A5%F3&word=%A5%DC%A5%BF%A5%F3

カスタマイズボタン
http://hspdev-wiki.net/?cmd=read&page=Module%2Fmod_customizebutton_v2&word=%A5%DC%A5%BF%A5%F3



a

リンク

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



OBASAN

リンク

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読んでデュアルじゃなくても快適に動作するソフト目指して勉強してみます。



OBASAN

リンク

2008/3/16(Sun) 21:49:46|NO.14340

かぶりました(笑)aさん、ありがとうございます。

CやJavaを利用してた時はこんな画面をダイナミックに変化させるようなプログラミングしてません
でしたから、今回HSPに手を出した次第です。ループ形式の工夫で結果がこんなに変わるとは…HSP
って面白いですね!

皆さん、ありがとうございました!



As

リンク

2008/3/16(Sun) 21:58:11|NO.14341

CやJAVAを経験しているのであれば、HSPでたくさんのWin32APIや、ウィンドウプロシージャの仕組みやさまざまな関数など
理解することによって、VCやJavaによる大規模なWindowsプラットフォームSDKによるプログラミングも、
自ずとできるようになっているはずですよ。開発がんばってください(b^−



OBASAN

リンク

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



ONION software Copyright 1997-2023(c) All rights reserved.