2009年11月09日

Rubyの勉強17(画像ボタンとタイマーのお話)

「クリックゲーム」の話の続きです。

前回vrubyの VRMouseFeasible でマウスのクリックを捕らえて画像を変化させました。
今回はタイマー VRTimerFeasible と組み合わせておさらいしてみようと思います。

サンプルも少しだけゲームっぽくしてみました。

5times_s1.jpg
(画面の見本です。動きません)

今回作るものはボタンの画像が1つと文字表示部が1つだけのシンプルなものです。
マウスのポインタがボタンの上に来ると色が変わります。
そしてボタンの画像を押す(マウス左クリック)とボタンの絵は押された状態に変わります。

クリックを押している間はタイマーが作動します。
クリックを放すとタイマーが停止して押していた間のタイムが表示されます。

というのを作ってみました。
一応(たとえば)5秒ぴったりで止められるかな? という感じで作ってますが
ぴったりで止めても「おめでとう」的なメッセージは用意してません。

必要ならボタンの画像も使ってください。

go_btm1.bmp go_btm2.bmp go_btm3.bmp

__________________________
#! ruby -Ks
require'vr/vruby'
require 'vr/vrcontrol'
require 'vr/vrhandler'
require 'vr/vrtimer'

class MyForm < VRForm
include VRMouseFeasible
include VRDrawable
include VRTimerFeasible

def initialize
@a = 0 #秒のカウント(0.1秒単位)
@bmpc = 0 #ボタンの画像変更用
@white = RGB(255,255,255) #paint用の色指定
end

def construct
self.caption = '5stops'
@font = @screen.factory.newfont('MS Pゴシック', 12)
@bmp1 = SWin::Bitmap.loadFile("go_btm1.bmp")
@bmp2 = SWin::Bitmap.loadFile("go_btm2.bmp")
@bmp3 = SWin::Bitmap.loadFile("go_btm3.bmp")

addControl(VREdit,'time_areas','0',30,10,60,20)
@time_areas.setFont(@font)
end

def self_paint
setPen(@white); setBrush(@white)
fillRect(0,0,130,170)
if @bmpc == 0
drawBitmap @bmp1,20,40
elsif @bmpc == 1
drawBitmap @bmp2,20,40
else
drawBitmap @bmp3,20,40
end
end

def timset
addTimer(100,'ct')
end

def ct_timer
@a += 0.1
end

def self_mousemove(shift,x,y)
if 20 < x and x < 100 and 40 < y and y < 120
@bmpc = 1
else
@bmpc = 0
end
self.refresh
end

def self_lbuttondown(shift, x, y)
if 20 < x and x < 100 and 40 < y and y < 120
timset ; @bmpc = 2
self.refresh
end
end

def self_lbuttonup(shift, x, y)
if 20 < x and x < 100 and 40 < y and y < 120
deleteTimer('ct')
@time_areas.text = @a
@a = 0 ; @bmpc = 1 ; self.refresh
end
end

end

VRLocalScreen.start(MyForm,100,100,125,165)

__________________________

VRMouseFeasible については前回簡単に説明したので省略します。
lbuttonup と lbuttondown の2種類あるので両方をうまく試せないかなと思い
今回は lbuttondown でタイマースタート、lbuttonup でストップとしました。

前回試さなかった self_mousemove(shift,x,y) を今回は使ってます。
これでボタンの色を変更させてます。マウスのポインタがボタン画像の上にあったら
画像を変化させるための変数 @bmpc の値を変えるようにしました。

ただし、このせいですごく画面がちらつくようになってしまいました。これってなんとかならないもんでしょうかね。
(訂正:ちらつき修正できました。11/10の記事参照願います)

もちろん色の変化をさせなければちらつきませんけど……
その場合サンプル内の def self_mousemove(shift,x,y) を削除します。
またその場合は def self_lbuttonup(shift, x, y) 内の
@bmpc = 1 を @bmpc = 0 にしてください。

タイマーの方は require 'vr/vrtimer'の後
VRTimerFeasible を include して
サンプルでは自作メソッド内で addTimer(100,'ct') して設定してます。
100はタイマーにセットする時間です。1000で1秒なんで今回は0.1秒刻みです。
'ct' はこっちで付けた名前です。指定しない場合は self で呼び出します。

construct内で設定する場合はプログラムの開始時からタイマーが動きますから
今回は任意で始動させたいのでメソッド内に設定しました(これで合ってると思うんですけど……)

続くdef ct_timerでタイマーに設定した時間が来たら何をやらせるのかを設定します。
今回は@aという変数に+0.1していきます。

ボタンが押されている間はタイマーで0.1づつ加算されて、ボタンをはなすとその数字が表示される……
ようは@aでタイムを管理してるんです。
def self_lbuttonup 内の deleteTimer('ct') でずっと動き続けないようにタイマーを消去します。

今回もどこか間違ってたら暖かいツッコミをお願いいたします


人気ブログランキングに参加してます。
ポチッ!としてくださると嬉しいです。
にほんブログ村 IT技術ブログ プログラム・プログラマへ
にほんブログ村

 
posted by Hol_nice at 21:35| Comment(0) | TrackBack(0) | プログラム | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください

この記事へのトラックバック