四角のアニメーション
以下のようなアニメーションを見てみよう。
問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