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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0122
スクリーンのドラッグ6解決


リンク

2019/1/22(Tue) 22:00:12|NO.86371

bgscrで作成したスクリーンで描画処理を実行しながらスクリーン上の
任意のポイントをドラッグする事でスクリーンを移動させる処理をします。

#define WM_MOUSEMOVE 0X0200 #define WM_LBUTTONDOWN 0x0201 #define WM_LBUTTONUP 0X0202 oncmd gosub *ldown,WM_LBUTTONDOWN oncmd gosub *lup,WM_LBUTTONUP oncmd gosub *mmove,WM_MOUSEMOVE buffer 1 color:boxf bgscr 0 lFlg=0 rot=0.0 repeat stick ky:if ky&&128:end gosub *draw await 16+((cnt\3)>0) loop *draw redraw 0 color 255,255,255:boxf pos 320,240 grotate 1,0,0,rot,200,200 rot+=0.02 pos 0,0:color 255,0,0:mes "ESC:終了"+" クリックフラグは、"+lFlg redraw 1 return *ldown X1=mousex:Y1=mousey lFlg=1 return *lup lFlg=0 return *mmove if lFlg==0:return width ,,ginfo_mx-X1,ginfo_my-Y1 return
これには問題点が2つあり、

1 ドラッグ中に高速でマウスを動かすとスクリーン外にポインタが
出るケースがあるが検知できない
2、ドラッグするしないに関わらずウインドウ上でマウスが動くとawaitが飛ばされて
処理が早廻しになる

1に関してはWM_MOUSELEAVEが使えるかと思ったのですが不可でした。
特に2を改善したいです。良い方法があるでしょうか?



この記事に返信する


ham

リンク

2019/1/23(Wed) 00:13:14|NO.86372

大雑把な回答ですみませんが、一応。

1はマウスキャプチャーと呼ばれる関数を使えばOKってどこかで見たことあります。
2は..

repeat 16/2+((cnt\3)>0)
await 1
loop

awaitの所をこれに置き換えれば大丈夫かな?
ちゃんとawait 16の時と速度同じになってますかね..?



リンク

2019/1/23(Wed) 20:24:10|NO.86382

ご指摘いただいた点を改良したところ、バッチリ要件を満たしました。
ありがとうございました。SetCaptureが何のコマンドかもさっぱりですが
この流れでここにあるならそういう機能だろうと適当に入れてみたら
しっかり動いていますね。

#include "user32.as" #define WM_MOUSEMOVE 0X0200 #define WM_LBUTTONDOWN 0x0201 #define WM_LBUTTONUP 0X0202 oncmd gosub *ldown,WM_LBUTTONDOWN oncmd gosub *lup,WM_LBUTTONUP oncmd gosub *mmove,WM_MOUSEMOVE buffer 1 color:boxf bgscr 0 lFlg=0 rot=0.0 repeat stick ky:if ky&&128:end gosub *draw repeat 16/2+((cnt\3)>0) await 1 loop loop *draw redraw 0 color 255,255,255:boxf pos 320,240 grotate 1,0,0,rot,200,200 rot+=0.02 pos 0,0:color 255,0,0:mes "ESC:終了"+" クリックフラグは、"+lFlg redraw 1 return *ldown X1=mousex:Y1=mousey lFlg=1 SetCapture hwnd return *lup lFlg=0 ReleaseCapture return *mmove if lFlg==0:return width ,,ginfo_mx-X1,ginfo_my-Y1 return

解決としたいところですがひとつ新たな疑問が出てしまいました。
await 1をループさせているくだりは、oncmdで飛ばされる待ち時間を最小限に
抑える方法だと推察しておりますが、だとしたら
await 16と近い結果を返すのは

repeat 16
await 1
loop

になる気がします。しかし実際これをやると倍ぐらい遅くなりました。
例示いただいたリピート半分くらいのほうが正しい速度になるのは、
どういった理由によるものでしょうか。



ham

リンク

2019/1/23(Wed) 20:59:34|NO.86384

awaitの精度が低いのが原因なのではと思っています。
await 1で実際に待った時間を計ってみると何故か2msなんですよね。


#uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" wait 50 repeat 30 time=timeGetTime() await 1 mes timeGetTime()-time loop

なので恐らくそのせいで半分にすると正しい速度になるのだと!



MillkeyStars

リンク

2019/1/24(Thu) 11:23:29|NO.86388

await 1 より、描画処理が間に合っていないんじゃないかな。
描画処理が間に合っていなきゃ、await 1 は無意味になるからね。
普通に await 0 にして、スクリプト側でタイマーを作ったほうがいいと思うよ。



ham

リンク

2019/1/24(Thu) 13:00:29|NO.86389

>await 1 より、描画処理が間に合っていないんじゃないかな。
ですが、下の例ですと何も描画していないのにawait 16と比べて2倍遅くなるので、
やはりawaitのせいではないでしょうか?

repeat 16 await 1 loop




リンク

2019/1/24(Thu) 16:39:54|NO.86390

もともとの描画処理が1msを超えている、なるほど!
てことでAとBで検証プログラム組んでみた結果を踏まえて改良したCを
加えてみました。お二人のおかげですっきり解決、ありがとうございました。

#uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" #define TRIAL 20 //繰り返し試行回数 #define FUKA 3 //描画負荷 color 255,255,255 wait 10 p1=timegettime() //A)await16 1回 repeat TRIAL gosub *draw await 16 loop p2=timegettime()-p1 p3=timegettime() //B)await 1 16回 repeat TRIAL gosub *draw repeat 16 await 1 loop loop p4=timegettime()-p3 p5=timegettime() //C)描画にかかった時間考慮してawait1 repeat TRIAL po=timegettime() gosub *draw pn=timegettime()-po repeat limit(17-pn,1,16) await 1 loop loop p6=timegettime()-p5 color 255,255,255:boxf //結果表示 if pn>16:pe=pn*TRIAL:color 255,0,0:else:pe=16*TRIAL:color mes "負荷処理 :"+pn+"ms" color:mes "理想時間 :"+pe+"ms" mes"-----------------------" color:mes"A)await16:"+p2+"ms"+" 差 "+(p2-pe) mes "B)await1 :"+p4+"ms"+" 差 "+(p4-pe) mes "C)改 :"+p6+"ms"+" 差 "+(p6-pe) stop *draw //負荷 repeat FUKA a=rnd(128) color a,a,a boxf loop return



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