.
中高生のための
今から始めるプログラミング
04. クリックされた座標を取得する
最終更新日:2004/02/10

<<BACK ↑HOME NEXT>>

 1  現在のマウス位置を取得する命令文
さて、実際にオセロをプレイするには、まずマウスで盤面をクリックした座標がわからなくてはなりませんね。これには mouse poll という命令文を使います。
 
mouse poll X,Y,LEFT,RIGHT
と書けば、X, Y にはそれぞれ画面上のカーソルの x, y 座標が、LEFT, RIGHT にはそれぞれマウスの左、右ボタンが押されているかが代入されます(押されている:0、押されていない:1)。では、メインルーチンを、画面がクリックされると、クリックされた座標を表示できるようにしてみましょう。
 
!**************** メインルーチン ****************
110 call format  !formatを呼び出し
210 do until right=1
220  mouse poll mx,my,left,right !マウス位置を取得
230  if left=1 then
240   print mx,my !クリックされた座標を表示
289  end if
299 loop
999 end
画面のいろいろな場所をクリックしてみましょう。数字が表示されませんか?それがクリックされた座標です。尚、画面を右クリックすると終了できます。
 

 2  マスの位置を計算する
今は、クリックした座標がわかっただけですので、これをもとにオセロをするとなるとあまり実用的ではありません。そこで、実際どこのマスがクリックされたかを計算する必要があります。これは、(x,y)座標を格子の幅 w で割れば簡単に求められます。
 
!**************** メインルーチン ****************
110 call format  !formatを呼び出し
160 let w=40 !格子の幅
210 do until right=1
220  mouse poll mx,my,left,right !マウス位置を取得
230  if left=1 then
240   print mx,my !クリックされた座標を表示
250   let x=int(mx/w)
260   let y=7-int(my/w)
270   print x,y !クリックされたマスの番地を表示
289  end if
299 loop
999 end
ここで、メインルーチンとサブルーチンの変数は別扱いになりますから、もう一度定数 w を定義しておかなければならないところに注意してください。また、ここでも y 座標が普通と逆になることに注意してください。
 

 3  はみ出しを防止する
さて、画面をクリックしながら、カーソルを画面外に持っていってみましょう。マスの位置がマイナスになったりしませんか?これは、画面外の座標も mouse poll が認識してしまっているのが原因です。これを解決するには、画面の範囲内にカーソルがあるか判定することが必要です。画面の座標の範囲は (0-320,0-320) ですから、(x,y) がこの範囲内にあればよいことになります。ですから、250-270行目を、
 
!**************** メインルーチン ****************
110 call format  !formatを呼び出し
160 let w=40 !格子の幅
210 do until right=1
220  mouse poll mx,my,left,right !マウス位置を取得
230  if left=1 then
245   if (x>0 and x<320) and (y>0 and y<320) then !はみ出し防止
250    let x=int(mx/w)
260    let y=7-int(my/w)
270    print x,y !クリックされたマスの番地を表示
284   end if
289  end if
299 loop
999 end
とはさめば、マウスがはみ出しても認識されることはありません。
 

 4  「クリック」か「押しっぱなし」かを判定する
mouse poll では、マウスの左ボタンが押されたか押されていないかの判定しかできませんので、プレイヤーがクリックしたのか、あるいは押しっぱなしにしているのかを判定することができません。お気づきかと思いますが、画面をクリックした時、何度も同じ座標が表示されたと思います。これは、「押されている」という判断しかできないため、何度も認識してしまっているからです。これを解決するには、直前のマウスの左ボタンの状態を覚えておいて、例え left の値が 1 でも、直前が 0 であるときのみ 250-270行目を実行するようにすれば良いです。つまり、
 
!**************** メインルーチン ****************
110 call format  !formatを呼び出し
160 let w=40 !格子の幅
165 let left=0 !初期化
210 do until right=1
215  let left_=left !直前のマウスの左ボタンの状態
220  mouse poll mx,my,left,right !マウス位置を取得
230  if left=1 and left_=0 then
250   let x=int(mx/w)
260   let y=7-int(my/w)
270   print x,y !クリックされたマスの番地を表示
289  end if
299 loop
999 end
とすれば良いのです。ただし一番最初の left_ の値が決まらなくなってしまうので、165行目で先に left の値を初期化するようにしてください。ソースが変えられたら、実行してみましょう。今度は一回分のクリックしか認識しないようになったのではないでしょうか。
 
ここまでのソースをダウンロード
 

<<BACK ↑HOME NEXT>>

Copyright (C) 2003-2004 Shohei Ohsawa, Naoya Okada & Fumiya Miyakawa. All rights reserved.