§3 アニメーション 2 vb2005 | プログラミング実習 [Menu] | |
【5】 画像データの移動(1)
画像の切り替えはそのままで、画像をウィンドウの右側へ移動させる。
画像(オブジェクト)の移動とは、表示位置(座標)を設定するプロパティLocation(またはLeftとTopプロパティ)を変えながら表示させることである。右側への移動とは、水平方向の移動なのでLeftプロパティを変更していくことにする。
(16) Timer1_Tickメソッドに次のようにプログラムを追加する。(下線部)
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Static number As Integer = 1
Static dx As Integer = 10 '移動量(10ピクセル)設定
MainPict.Left = MainPict.Left + dx '移動量加算
If number = 0 Then
MainPict.Image = My.Resources.right1
ElseIf number = 1 Then
MainPict.Image = My.Resources.right2
End If
number = number + 1
If number = 2 Then
number = 0
End If画像切り替え
アニメーションの処理
End Sub
波線部の1行目(移動量設定)を省略して、波線部の2行目を「Main.Left = Main.Left + 10」としても良いが、次の段階で画像の移動方向を変える予定なので、このようにしている。
(17) プログラムを実行する。[アニメ]ボタンをクリックする。
クリックするとアニメーション(移動)が始まる。クリックするたびに開始と停止を繰り返す。ウィンドウ右側のフレームを超えて移動するので、適当なところでプログラムを終了すること。
【6】 画像データの移動(2)
画像がウィンドウ左右のフレームに到達したとき、移動方向を逆にするようにする。すなわち、画像がフレームで、はね返るようにする。
(18) Timer1_Tickメソッドに次のようにプログラムを追加する。(下線部)
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Static number As Integer = 1
Static dx As Integer = 10 '移動量(10ピクセル)
If number = 0 Then
MainPict.Image = My.Resources.right1
ElseIf number = 1 Then
MainPict.Image = My.Resources.right2
End If
number = number + 1
If number = 2 Then
number = 0
End If
MainPict.Left = MainPict.Left + dx '移動量加算
If MainPict.Left >= Me.ClientSize.Width - MainPict.Width Then 'フレーム右に到達したとき、(図@)
MainPict.Left = Me.ClientSize.Width - MainPict.Width '画像をフレーム右に合わせ、(図@)
dx = -dx '移動量(方向)を反転する。(dx = -1 * dx と同じ)
ElseIf MainPict.Left <= 0 Then 'フレーム左に到達したとき、(図A)
MainPict.Left = 0 '画像をフレーム左に合わせ、(図A)
dx = -dx '移動量(方向)を反転する。
End If
End Sub
(19) プログラムを実行する。[アニメ]ボタンをクリックする。
クリックするとアニメーション(移動)が始まる。クリックするたびに開始と停止を繰り返す。ウィンドウ左右のフレームで移動方向が変わる。
【7】 移動スピードの変更
画像の切り替えと移動のスピードは、タイマー(Timer1)オブジェクトのIntervalプロパティの値で決まる。ここでは、実行中にスピードが変更できるようにする。
(20) カウンタを1つ追加し、プロパティを次のように設定する。
(Name) SpeedCnt Font.Size 12 (ポイント) Location 100, 10 Maximum 10 (最大値) Minimum 1 (最小値) Size 50, 25 or (50,23) Value 5 (現在値)
カウンタは、正式にはNumericUpDownオブジェクトと呼ぶ。入力欄の右側にある上下のボタンをクリックすると入力欄の数値が変わる。実行中の値はValueプロパティで調べることができる。入力可能な値の範囲はMaximumプロパティとMinimumプロパティで設定できる。
(21) カウンタ(SpeedCnt)のイベントに対応するメソッドを次のように作成する。
イベントは、クリックではなく、値が変わったときに発生するイベントということで「チェンジ(ValueChange)イベント」と呼ぶ。
Private Sub SpeedCnt_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SpeedCnt.ValueChanged
Timer1.Interval = SpeedCnt.Value * 100
End Sub
タイマー(Timer1)のIntervalプロパティにカウンタの値を100倍した値を代入しているだけである。カウンタの値は1〜10の範囲であるからIntervalプロパティのは100〜1000の範囲となる。
(22) プログラムを実行する。[アニメ]ボタンをクリックする。
クリックするとアニメーション(移動)が始まる。カウンタの数値を変えるとスピードが変わる。
実行して[アニメ]ボタンをクリックしてもスピードが5(Interval=500(0.5秒))で移動はしない。これは、タイマーのIntervalプロパティの値をプロパティウィンドウで300に設定しているためである。
対策1 → プロパティウィンドウでIntervalプロパティを500に設定しておく。
対策2 → プログラムでIntervalプロパティを500に設定する。
○ 特別なイベント Load
一般には、プログラムを実行するとイベントが発生するのを待ち続け、イベントが発生するとそのイベントに対応するメソッドのプログラムが実行される。
特別なイベントの1つに、「Load」イベントがある。フォームに対するこのイベントは、プログラムを実行した最初に一度だけ発生する。
次に、このイベントを使ってIntervalプロパティを500に設定する。
(23) フォームのLoadイベントに対応するFome1_Loadメソッドを準備する。
デザインウィンドウで、フォームをダブルクリックすると、Fome1_Loadメソッドの定義部が表示される。
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
(24) Form1_Loadメソッドを次のように作成する。
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Timer1.Interval = SpeedCnt.Value * 100
End Sub
(25) プログラムを実行する。
[アニメ]ボタンをクリックするとInterval=500のスピードでアニメーションが始まる。
○ 特別なメソッド Form Closing
プログラムが終了する前に発生するイベントとして「FormClosing」イベントがある。
次に、このイベントを使って終了確認をする。
(26) FormClosingイベントに対応するFome1_FormClosingメソッドを準備する。
クラス名(@)に「(Form1 イベント)」、イベント名(A)に「FormClosing」を選択して入力する。(図参照)
(27) Fome1_FormClosingメソッドを次のように作成する。
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Dim res As Integer
res = MsgBox("終わりますか", MsgBoxStyle.YesNo)
If res = 7 Then
e.Cancel = True '終了をキャンセルする。
End If
End Sub
MsgBox関数では、[はい]ボタンで6、[いいえ]ボタンで7が得られる。
(28) プログラムを実行する。
閉じる×ボタンをクリックすると確認のダイアログが表示される。
§3 アニメーション 2 vb2005 | Copyright©2007 Hiroshi Masuda |