§3 アニメーション 2 vb2005 プログラミング実習 [Menu]
 back next 

【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ピクセル)設定
       
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        '移動量加算
    End Sub
波線部の1行目(移動量設定)を省略して、波線部の2行目を「Main.Left = Main.Left + 10」としても良いが、次の段階で画像の移動方向を変える予定なので、このようにしている。

(17) プログラムを実行する。[アニメ]ボタンをクリックする。

結果 クリックするとアニメーション(移動)が始まる。クリックするたびに開始と停止を繰り返す。ウィンドウ右側のフレームを超えて移動するので、適当なところでプログラムを終了すること。

 移動量を20や50に増やして実行してみよう。
  結果→ (     )くなる。

 

【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) プログラムを実行する。

結果 閉じる×ボタンをクリックすると確認のダイアログが表示される。



 back next 
 §3 アニメーション 2 vb2005 Copyright©2007 Hiroshi Masuda 
inserted by FC2 system