 |
|
 |
|
中高生のための 今から始めるプログラミング
04. クリックされた座標を取得する |
最終更新日:2004/02/10
|
|
|
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 の値を初期化するようにしてください。ソースが変えられたら、実行してみましょう。今度は一回分のクリックしか認識しないようになったのではないでしょうか。
|
|
|
ここまでのソースをダウンロード
|
|
|
|
|
 |
|
 |