前回の記事とあわせてお読みください。
先にプログラムの続き(construct 以降)を示します。
─────────────
def construct
self.caption = 'まちがいさがし v.0.1'
@font = @screen.factory.newfont('MS Pゴシック', 12)
@font2 = @screen.factory.newfont('MS Pゴシック', 18)
@bmp1 = SWin::Bitmap.loadFile("ms_buhin/ms_keshiki1.bmp")
@bmp2 = SWin::Bitmap.loadFile("ms_buhin/ms_keshiki2.bmp")
@maru_bmp = SWin::Bitmap.loadFile("ms_buhin/maru_btn1.bmp")
@batsu_bmp = SWin::Bitmap.loadFile("ms_buhin/batu_btn1.bmp")
addControl(VRStatic,'title_area','◆まちがいさがしゲーム◆',
30,15,220,30)
@title_area.setFont(@font2)
addControl(VRStatic,'setsu_area','3つの間違いを探してね!',
250,20,150,20)
@setsu_area.setFont(@font)
addControl(VRStatic,'atari_area','0',70,365,30,30)
@atari_area.setFont(@font2)
addControl(VRStatic,'hazure_area','0',170,365,30,30)
@hazure_area.setFont(@font2)
addControl(VRStatic,'kekka_area',"",250,365,250,30)
@kekka_area.setFont(@font2)
end
def self_paint
drawBitmap @bmp1,20,50
drawBitmap @bmp2,340,50
drawBitmap @maru_bmp,20,360
drawBitmap @batsu_bmp,120,360
end
def self_lbuttondown(shift, x, y)
atta = 0
3.times do |s|
if (@pz[s][0][0]..@pz[s][0][2]) === x and
(@pz[s][0][1]..@pz[s][0][3]) === y or
(@pz[s][1][0]..@pz[s][1][2]) === x and
(@pz[s][1][1]..@pz[s][1][3]) === y
@atari_area.caption = "#{@atari += 1}"
@pz[s] = @sumi
@kekka_area.caption = "#{@g_mes[0]}"
@kekka_area.caption = "#{@g_mes[2]}" if @atari == 3
atta = 1
end
end
if atta == 0
@hazure_area.caption = "#{@hazure += 1}"
@kekka_area.caption = "#{@g_mes[1]}"
@kekka_area.caption = "#{@g_mes[3]}" if @hazure == 3
end
self.refresh
end
end
VRLocalScreen.start(MyForm,100,100,670,450)
─────────────
あらためて画面見本はこんな感じです。

(画面の見本です。動きません)
とりあえず def self_lbuttondown の中でどんなふうに処理をさせることにしたかを説明します。
前回説明したように左右の絵の間違い部分(始点と終点のx,y座標)を配列にしたものを使ってます。
間違いが3箇所なので 3.times do の繰り返しで配列を呼び出しながら照合していく形にしました。
前に画像ボタンを作ったときは大小比較( < ) を連ねて書きましたが、こんかいは間に or を挟んで
左右の絵について一度に処理しようと思ったので、見た目にわからなくなってしまわないように
範囲オブジェクト(..)を使うことにしました。
両方のやり方を例として下のように比較してみます。
ブログの1行に記せる文字数のせいもあって変なところで改行されて伝わりにくいのを補う意味もありますが、
画像にしたので小さくて文字が潰れてしまってたらクリックして拡大してみてください。

いくぶん短くて見やすくなったのかなと思ってます。
中級者以上の方から見ればまだまだと言われてしまいそうですが……
指定の座標内がクリックされれば当たりを示すカウンターの数字が増えて、メッセージ文が出ます。
そしてクリックされた座標配列は @sumi として用意した配列で上書きされます。
この中身は全ての座標が0になってます。
これをしないと同じところを何度クリックしても当たりと判定されてしまいますので。
そして当たりのカウンターが3になると(全ての間違いをみつけた)勝利のメッセージが出ます。
逆に間違いだと間違いのカウンターの数字が増えて、メッセージが出ます。
このカウンターは3になると敗北のメッセージが出ます。
こんな感じですがどうでしょうか?
説明が下手でわかりにくかったと思いますが……(^-^;)
人気ブログランキングに参加してます。
ポチッ!としてくださると嬉しいです。

にほんブログ村