前回vrubyの VRMouseFeasible でマウスのクリックを捕らえて画像を変化させました。
今回はタイマー VRTimerFeasible と組み合わせておさらいしてみようと思います。
サンプルも少しだけゲームっぽくしてみました。
(画面の見本です。動きません)
今回作るものはボタンの画像が1つと文字表示部が1つだけのシンプルなものです。
マウスのポインタがボタンの上に来ると色が変わります。
そしてボタンの画像を押す(マウス左クリック)とボタンの絵は押された状態に変わります。
クリックを押している間はタイマーが作動します。
クリックを放すとタイマーが停止して押していた間のタイムが表示されます。
というのを作ってみました。
一応(たとえば)5秒ぴったりで止められるかな? という感じで作ってますが
ぴったりで止めても「おめでとう」的なメッセージは用意してません。
必要ならボタンの画像も使ってください。
__________________________
#! 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') でずっと動き続けないようにタイマーを消去します。
今回もどこか間違ってたら暖かいツッコミをお願いいたします
人気ブログランキングに参加してます。
ポチッ!としてくださると嬉しいです。
にほんブログ村