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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1116
空気マウスやタッチの1フレーム前の座標差分を求めたいが、上手く行きません。5解決


空気

リンク

2015/11/16(Mon) 23:20:55|NO.73068

マウス左クリック時やタッチ時の1フレーム前の座標差分を求めたいのですが、
1ドット程度に低速でマウスを動かすと異常な値が出てしまいます。
原因を教えて頂けると幸いです。

以下、私が記述したスクリプトです。
#include "hsp3dish.as"
setcls 1,$FFFFFF repeat redraw 0 getkey on_left_click,1;左クリック又はタッチされていたらon_left_clickに1が代入される ;on_left_clickに1が代入されていなかったら、座標の差分を求めるルーチンで使う変数を初期化 if on_left_click != 1{ mouseX_difference = 0 mouseY_difference = 0 mouseX_tmp = 0 mouseY_tmp = 0 not_skip_0fream_y = 0 not_skip_0fream_x = 0 } ;on_left_clickに1が代入されていたら、座標の差分を求めるルーチンへ if on_left_click = 1 : gosub *x_diff : gosub *y_diff cls;適当にcls、本来はboxf等を使う mes mouseX_difference;マウスXの差分数値を描画 mes mouseY_difference;マウスYの差分数値を描画 redraw 1 await 100;デバッグ用に低速で loop *x_diff ;デバッグ用に低速で ;not_skip_0fream_x=1でないとき(タッチ後0フレーム目の時)は差分を求めないように if not_skip_0fream_x = 1 : mouseX_difference = mouseX_tmp - mouseX;1フレ前のマウスX座標-現在のマウスX座標 not_skip_0fream_x = 1;1フレーム経過フラグX軸ON mouseX_tmp = mouseX;1フレーム後に使用するために、現在のマウスX座標を記録する return *y_diff ;not_skip_0fream_y=1でないとき(タッチ後0フレーム目の時)は差分を求めないように if not_skip_0fream_y = 1 : mouseY_difference = mousey_tmp - mouseY;1フレ前のマウスY座標-現在のマウスY座標 not_skip_0fream_y = 1;1フレーム経過フラグY軸ON mouseY_tmp = mouseY;1フレーム後に使用するために、現在のマウスY座標を記録する return



この記事に返信する


スペース

リンク

2015/11/16(Mon) 23:51:09|NO.73069

何故かはわかりませんが、clsを使うとmousex、mouseyが0になるようです。
そして動かした瞬間、正しい座標になります。
異常な値が表示されるのはそれが原因だと思います。



空気

リンク

2015/11/17(Tue) 00:00:43|NO.73070

スペースさん
教えて頂き、ありがとうございました。
clsをboxfに変更したところ、正常に動作しました。

clsを使うとmousex、mouseyが0になるという謎の仕様があるのですね。
clrobjならまだ分からなくも無いのですが。



Noap

リンク

2015/11/17(Tue) 00:37:39|NO.73072

おそらくもう見ていないと思いますが、この質問を見て補足したいことがあるので投稿します。

推測するとスペースさんも空気さんもわたしよりHSPの使い始めたのは早いと思うのでHSP2から使っていてHSP2と同じようにしてこまっていると思うのでHSP2とHSP3の違いを書きます
推測が的外れであればごめんなさい

原因はbmscr構造体の違いです
わざわざ書かなくても知っていると思いますがHSP3はbmscr構造体がHSP2よりたくさんの情報を持っています

HSP2ではclsでmousexとmouseyが初期化されるということはありませんでした

cls while cls //color 255,255,255 : boxf : color : pos 0,0 ginfo 0 mes "mousex="+mousex+"\nmousey="+mousey+"\nginfo_mx="+prmx+"\nginfo_my="+prmy await 10 wend


HSP3ではbmscr構造体が拡張されてbmscr構造体でmousexとmouseyは管理されるようになりました
clsでそのウィンドウのbmscrも初期化されるのでmousexとmouseyは0で初期化されます

mref bmscr,67 cls while cls //color 255,255,255: boxf: color 0,0,0: pos 0,0 my=(bmscr.74 >> 16) mx=(bmscr.74 & $0000FFFF) mes "(bmscr.74 & $0000FFFF)="+mx+"\n(bmscr.74 >> 16)="+my+"\nmousex="+mousex+"\nmousey="+mousey+"\nginfo_mx="+ginfo_mx+"\nginfo_my="+ginfo_my await 10 wend

初心者なのでHSPに詳しいわけではないので何か変なところがあればごめんなさい



Noap

リンク

2015/11/17(Tue) 00:41:26|NO.73073

まとめるとbmscr構造体でmousexとmouseyを管理するようになったのが原因です



Noap

リンク

2015/11/17(Tue) 00:50:12|NO.73074

質問のスクリプトのコメントに書いているので分かっているとは思いますが、
念のため書いておくとループ中で連続で何度もclsを呼ぶのは連続で全部初期化していることになるのでただ文字を表示するだけであればcolorとboxfとposをわたしはおすすめします。



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