動物将棋 (3)
動物将棋のプログラムがさらに進んだので書いておきます。
動物将棋(4)にて、大幅に見直していますので、そちらをご覧下さい。
タッチしたところの駒番号を返す
タッチしたところにある駒の番号を返す関数を作りました。ただし、駒が無いときは0を返します。また、タッチしたマス番号も返します。
------------------------------------------ -- タッチしたの駒番号を返す。駒が無ければ0を返す。盤外であれば-1を返す -- komanum, hx, hy ------------------------------------------ function getKomaNum() local x,y local ret = -1 local hx = 1 local hy = 1 x,y = touch() --将棋盤の範囲内かどうか調べる if( x>=Center.x-108 and y>=Center.y-81 and x<=Center.x+107 and y<=Center.y+80 )then hx = math.floor( (y-(Center.y-81))/55 ) + 1 hy = math.floor( (x-(Center.x-108))/55 ) + 1 ret = Ban[hx][hy] end return ret, hx, hy end
画面x,y座標に駒を描画する
タッチして駒を移動できるように、画面のx,y座標を中心として、駒画像を表示する関数を作りました。駒を描く前に、元画像をワークエリアに退避します。この退避画像を書き戻せは、元の画像に戻ります。
------------------------------------------ -- (gx,gy)座標を中心に指定駒を描画する -- ただし、描く前に、48×48のエリアをワークの(260,0)-(307,47)に退避する ------------------------------------------ function drawKoma( gx, gy, koma ) local plyer = math.floor(koma/10) local wx = 48*(koma-plyer*10 - 1) local wy = 48*(2-plyer) + 192 --ワークに退避 canvas.getg( gx-24, gy-24, gx+23, gy+23, 260, 0, 307, 47 ) --駒を描画 canvas.putg( gx-24, gy-24, gx+23, gy+23, wx, wy, wx+47, wy+47 ) canvas.putflush() end
駒をタッチで移動させるループを作る
駒をタッチして移動させるためにループ処理プログラムを作りました。doTouchAction()という別関数を用意しました。
最初のwhileループで盤面にタッチするのを待っています。
while(true)do --駒にタッチするまで待つ x,y = touch(1) ret, hx, hy = getKomaNum() if( ret~=0 and ret~=-1 )then break end end
盤面にタッチでされると、ループを抜けてきて、タッチした場所の駒を消します。駒無し:0として、描画関数dput()を呼ぶだけです。
--Ban[hx][hy]の駒を消す dput( hx, hy, 0 )
次のwhileループが駒移動ループです。指が離れるまでループを続けます。タッチしているx,y座標に駒の絵を描いて、1つ前に描いた場所は、ワークから元の絵に描き戻す処理を繰り返します。
x1 = x y1 = y while(true)do --駒移動ループ drawKoma( x, y, ret ) x,y,s = touch() if( s==1 )then break end --ワークから描き戻し canvas.putg( x1-24, y1-24, x1+23, y1+23, 260, 0, 307, 47 ) x1 = x y1 = y end
指が離れたら、ループを抜けます。ループを抜けたときは、画面を元に戻すために、ワークから退避画像を描き戻します。そして、指を離した場所が、駒が移動できる場所かどうか確認して、移動できる場所であれば、移動処理を行います。移動できなければ、盤面を一度書き直して、指タッチ待ちループに戻ります。
------------------------------------------ -- タッチ操作処理 ------------------------------------------ function doTouchAction() local hx = 1 local hy = 1 local ret = 0 local x,y,x1,y1,s local i,j local hx1, hy1,ret1 while(true)do while(true)do --駒にタッチするまで待つ x,y = touch(1) ret, hx, hy = getKomaNum() if( ret~=0 and ret~=-1 )then break end end --Ban[hx][hy]の駒を消す dput( hx, hy, 0 ) x1 = x y1 = y while(true)do --駒移動ループ drawKoma( x, y, ret ) x,y,s = touch() if( s==1 )then break end --ワークから描き戻し canvas.putg( x1-24, y1-24, x1+23, y1+23, 260, 0, 307, 47 ) x1 = x y1 = y end -- 駒が離されたので、ワークから書き戻す canvas.putg( x1-24, y1-24, x1+23, y1+23, 260, 0, 307, 47 ) ret1, hx1, hy1 = getKomaNum() if( chkMove( hx, hy, hx1, hy1, ret )==1 )then --移動できる場所に駒が置かれたときの処理を書く end --駒を描く for j=1,4 do for i=1,3 do dput( i, j, Ban[i][j] ) end end canvas.putflush() end end
chkMove()は、駒が指定場所に進めるかどうかをチェックする関数です。この説明は、次回にしたいと思います。