マウスジェスチャー(2) 感度の導入
 マウスジェスチャースクリプトを引数ライブラリと一時変数ライブラリを使って実装してみようとしたら、座標取得だけでかなり重くなってしまいました。内部的にスタック2つも使ったりしてたらそりゃ重くなるか……。
 実行速度のことを考えて、最終的には自作命令とかほとんど使わずに実装しますが、それだと読みづらいスクリプトになってしまうので、製作途中は自作命令ありで行こうと思います。

 で、今回は「感度の導入」です。まずはサンプルスクリプトから。

*define
mov %0,100
numalias x1,%0:inc %0
numalias y1,%0:inc %0
numalias x2,%0:inc %0
numalias y2,%0:inc %0
numalias dx,%0:inc %0
numalias dx_sign,%0:inc %0
numalias dy,%0:inc %0
numalias dy_sign,%0:inc %0
numalias sensitivity,%0:inc %0
numalias temp,%0:inc %0

defsub abs_sgn
game

*start
mov %sensitivity,10
clickpos %x1,%y1

*loop
clickpos %x2,%y2

abs_sgn %x2 - %x1,%dx,%dx_sign
abs_sgn %y2 - %y1,%dy,%dy_sign

if %dx < %sensitivity && %dy < %sensitivity caption "":goto *loop_end
if %dx >= %dy && %dx_sign > 0 caption "右"
if %dx >= %dy && %dx_sign < 0 caption "左"
if %dx <= %dy && %dy_sign > 0 caption "下"
if %dx <= %dy && %dy_sign < 0 caption "上"

*loop_end
mov %x1,%x2
mov %y1,%y2
goto *loop

*abs_sgn
getparam %0,i%1,i%2
mov %3,1
if %0 < 0 mov %3,-1
mov %%1,%0 * %3
mov %%2,%3
return


 さて、今回の変更点は
1.変数%sensitivityの導入
2.自作命令cmp_abs削除、代わりに自作命令abs_sgn追加
 の2点です。
 まずは1.の説明から。感度を意味する数字変数%sensitivityを導入しています。。このスクリプトではローカル変数で実装していますが、できればグローバル変数にしてオプション画面からマウスジェスチャーの感度を変更できるようにしたりするといい感じになると思います。
 次に2.の説明を。%sensitivityを使う際は「マウスの移動距離と比較し、%sensitivity以下なら処理をスキップする」というような感じになりますが、単純に
%dx < %sensitivity
 なんてしてしまうとアウトです。%dxは負の値も取りうるわけですから。だからといって
if -%dx < %sensitivity && %dx < %sensitivity && -%dy < %sensitivity && %dy < %sensitivity
 とかやるのはちと面倒です。
 ここで、少し考え方を変えます。前回のスクリプトで登場した以下のif文、
if %temp >= 0 && %dx > 0 caption "右"
 これの条件文の2つ目、 %dx > 0 で必要としているのは「正なのか負なのか」という情報だけですよね。そして感度の実装に必要なのは移動距離の絶対値ですし、上のif文の %temp >= 0 で比較しているのも実際は移動距離の絶対値の大きさなわけです。ならばもう、絶対値と符号を分けちゃいましょう。
 ということで登場するのが自作命令abs_sgnです。第一引数に受け取った数値の絶対値(abs)を第二引数に、符号(sgn)を第三引数に返します。絶対値を返す命令と符号を返す命令をそれぞれ作ってもいいのですが、スクリプトを短くするために統合しています。

 さて、これで方向の取得周りは大体できました。次からはbtndownとisdownを使って、動的な方向の取得に挑戦です。
[PR]
by lyricist_m | 2008-05-09 23:00 | NScripter
<< ブログ名を変更しました。 効果音つき選択肢とexbtn_... >>