四角のアニメーション

以下のようなアニメーションを見てみよう。

問1


前回の配列を使った方法でこのようなアニメーションを作ることもできるがやや面倒だ。オブジェクト指向プログラミングを利用してみよう。

このアニメーションは以下プログラムで描画できる。

まず空のフォームを作成する。

コードエディタで Class Form1~End Classを以下のプログラムで置き換える。

 

サンプル
空のフォームを作り、Class Form1をこのコードで置き換える
Public Class Form1
    Private Sub Form1_Load( _
            ByVal sender As System.Object, _
            ByVal e As System.EventArgs _
            ) Handles MyBase.Load
        ' Pictureboxの作成と初期化
        Dim Picturebox1 As PictureBox
        Picturebox1 = New PictureBox
        Picturebox1.Dock = DockStyle.Fill
        Picturebox1.BackColor = Color.White
        Me.Controls.Add(Picturebox1) 'Form1と接続
        ' Timerの作成と初期化
        Dim Timer1 As Timer
        Timer1 = New Timer
        Timer1.Interval = 10
        Timer1.Enabled = True
        AddHandler Timer1.Tick, _
        	AddressOf Me.Timer1_Tick
        ' box(1)~box(20)の作成と初期化
        Dim box(20) As MyBox
        Dim i
        For i = 1 To 20
            ' box(i)を作成. 乱数で初期化する
            box(i) = New MyBox(Picturebox1, Timer1)
            box(i).Location( _
              Int(300 * Rnd(1)), Int(300 * Rnd(1)))
            box(i).Speed( _
              Int(9 * Rnd(1)) - 4, Int(9 * Rnd(1)) - 4)
            box(i).Size( _
              Int(30 * Rnd(1)) + 2, Int(30 * Rnd(1)) + 2)
        Next
    End Sub
    Private Sub Timer1_Tick( _
            ByVal sender As System.Object, _
            ByVal e As System.EventArgs _
            )
        ' 1Tick毎に表示を更新
        Me.Refresh()
    End Sub
End Class
Public Class MyBox
    Dim x  ' x座標
    Dim y  ' y座標
    Dim w  ' 幅
    Dim h  ' 高さ
    Dim vx ' 1Tickあたりのx方向移動量
    Dim vy ' 1Tickあたりのy方向移動量
    Public Sub New(ByVal p1 As PictureBox, _
      ByVal t1 As Timer)
        AddHandler p1.Paint, AddressOf Paint
        AddHandler t1.Tick, AddressOf Tick
    End Sub
    Public Sub Location(ByVal x1, ByVal y1)
        ' 位置(x,y)を指定された値(x1,y1)にする
        x = x1
        y = y1
    End Sub
    Public Sub Size(ByVal w1, ByVal h1)
        ' サイズ(w,h)を指定された値(w1,h1)にする
        w = w1
        h = h1
    End Sub
    Public Sub Speed(ByVal vx1, ByVal vy1)
        ' 速度(vx,vy)を指定された値(vx1,vy1)にする
        vx = vx1
        vy = vy1
    End Sub
    Public Sub Tick(ByVal sender As System.Object, _
    ByVal e As System.EventArgs)
        ' 指定された速度で移動する
        x = (x + vx + 300) Mod 300
        y = (y + vy + 300) Mod 300
    End Sub
    Public Sub Paint(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.PaintEventArgs)
        Dim g As Graphics
        Dim pen As System.Drawing.Pen
        g = e.Graphics
        pen = New System.Drawing.Pen( _
           Color.FromArgb(&HFFFF0000))
        g.DrawRectangle(pen, x, y, w, h)
    End Sub
End Class