マウスジェスチャー(1) 方向の取得
 HDDを漁ったのですが、どうやらマウスジェスチャースクリプトを消してしまったようです……。
 まあ大体のやり方は頭に残ってる(と思う)ので、マウスジェスチャーについて毎日少しずつ書いて行こうかなと思います。時間稼ぎとも言います。

 まずは「ある点(x1,y1)から見て、別の点(x2,y2)がどのあたりに位置するのか、その方向を取得する」方法について。
 最初に思いつくのは「2点間の角度を算出し、if文によって返す値を求める」というものですが、NScripterには三角関数はあるもののatan2などはありません。それに欲しいのは上下左右の4方向のみです。角度を算出していたら処理が重くなってしまう可能性があります。なのでここは簡単に、XとYのそれぞれの移動距離とその絶対値から方向を割り出しましょう。以下にサンプルスクリプトを書いてみました。

*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 dy,%0:inc %0
numalias temp,%0:inc %0

defsub cmp_abs
game

*start
clickpos %x1,%y1

*loop
clickpos %x2,%y2

mov %dx,%x2 - %x1
mov %dy,%y2 - %y1

cmp_abs %temp,%dx,%dy
caption ""
if %temp >= 0 && %dx > 0 caption "右"
if %temp >= 0 && %dx < 0 caption "左"
if %temp <= 0 && %dy > 0 caption "下"
if %temp <= 0 && %dy < 0 caption "上"
mov %x1,%x2
mov %y1,%y2
goto *loop

*cmp_abs
getparam i%0,%1,%2
if %1 < 0 mul %1,-1
if %2 < 0 mul %2,-2
if %1 > %2 mov %%0,1:return
if %1 < %2 mov %%0,-1:return
mov %%0,0
return



 実際にマウスジェスチャースクリプトを書くときはbtndown+isdownを使うのですが、ここでは簡略化するためにclickposを使います。
 まずは2点の座標の取得ですね。これにclickposを使います。それらをそれぞれ%x1,%y1,%x2,%y2に格納したら、まずはX座標の差とY座標の差を取ります。
 次に自作命令cmp_absを使用しています。この命令は「2つの数値の絶対値の大きさを比較し、左が大きければ正、右が大きければ負、等しければ0を返す」という処理を行っています。cmp命令の数値版のようなものです。cmp_absに%dxと%dyを与えることで、XとYのどちらに大きく移動したかがわかります。%dxが大きければ横方向への移動であり、%dyが大きければ縦方向への移動である、ということですね。
 あとはif文で分岐させればOKです。横方向への移動でなおかつ%dxが正なら右で負なら左、同様にして上下も分岐させます。なぜ「%temp >= 0」と=がついてるかと言うと、イコールがなければ丁度45度方向に動いた場合のみジェスチャーを取得しないというバグが発生してしまうからです。

 方向の取得は以上のようにして可能ですが、このままではたった1ピクセルしか動かしていないのに方向を取得してしまいますから、多少感度を落とすようにしなければなりません。あと、一連の処理を自作命令化する必要があるでしょう。次回はその2点について書きます。
[PR]
by lyricist_m | 2008-05-03 19:43 | NScripter
<< Unicode(Big End... セーブ/ロードサンプルをアップ >>