HyperCard tribute

ハンドラの中でマウスをチェック


 HyperCardは、メッセージを受け取ることでハンドラが実行されます。しかし、メッセージを受け取れるのは、HyperCardがアイドル状態の時に限られます。
 それでは、実際にハンドラを実行しているときに、マウスのボタンチェックなどをしたいという時はどうすればよいのでしょうか。例として、ハンドラ実行時にマウスのボタンが押されたら実行を中断するものを作ってみます。
 1 
 2 
 3 
 4 
 5 
 6 
on main
  put 0 into msg
  repeat while the mouse is up
    put 1+msg into msg
  end repeat
end main

 3行目から5行目までの間にあるスクリプトが、メインのスクリプトと考えて下さい。マウスのボタンが押されるまで、メインのスクリプトを実行し続けるというものです。
 今回は、このループ内でメッセージボックスの値を1ずつ増加させていますが、もちろん内容はどのようなものでも構いません。


  • repeat while the mouse is up
     3行目では、どの条件であればループを繰り返すかを記してあります。the mouseはマウスのボタンが押されているかを調べます。押されてなければup、押されていればdownとなります。
     whileは正しければを意味します。反対語としてuntil(正しくなければ)があります。
    「the mouse is up(マウスのボタンが押されていない)」
      が
    「while(正しい)」
      ならば
    「repeat(繰り返す)」
     すなわち、マウスのボタンが押されてなければ繰り返します。


     untilを用いた書き方をすることも可能です。
     1 
     2 
     3 
     4 
     5 
     6 
    
    on main
      put 0 into msg
      repeat until the mouse is down
        put 1+msg into msg
      end repeat
    end main
    

     マウスのボタンが押されているが正しくなければ、繰り返すという事になります。



     次は、if文を用いてマウスのチェックをしてみます。
     1 
     2 
     3 
     4 
     5 
     6 
     7 
    
    on main
      put 0 into msg
      repeat
        put 1+msg into msg
        if the mouse is down then exit repeat
      end repeat
    end main
    

     repeat文には条件が与えられていませんから、永遠にループが繰り返されます。


  • if the mouse is down then exit repeat
     5行目で、マウスボタンが押されたかどうかをチェックします。exitとは抜けるという意味です。今回はexit repeatですのでrepeat文を抜けます。



     先ほどのセクションではドラッグできるボタンを作ってみました。それを、今回のハンドラ中でのマウスチェックを用いて他の書き方をしてみることにします。
     1 
     2 
     3 
     4 
     5 
     6 
    
    on mouseDown
      put the top of me-the mouseV into V
      repeat while the mouse is down
        set the top of me to the mouseV+V
      end repeat
    end mouseDown
    

  • put the top of me-the mouseV into V
     2行目で、マウスカーソルの位置とボタンのtop座標との位置の差を調べています。


  • repeat while the mouse is down
     3行目で、繰り返しの条件を設定します。
    「the mouse is down(マウスのボタンが押されている)」
      が(is)
    「down(下がっている)」
      である間(while)
    「repeat(繰り返す)」


  • set the top of me to the mouseV+V
     4行目で、ボタンのtop座標を、マウスカーソルの位置を補正した値にセットします。
    「me」
      の
    「the top(上部の座標)」
      を
    「the mouseV+V(マウスカーソルの垂直座標+補正値)」
      に
    「set 〜 to 〜 (設定する)」

     つまり、mouseDownのハンドラ中で、マウスボタンが押されているかどうかをチェックすることで、mouseStilldownの代わりをさせているのです