MyBoxの実装
MyBoxを使うと四角を使ったアニメーションが簡単になった。
しかし、MyBoxはVBに最初から備わっている機能ではない。プログラムの別の部分にMyBoxのプログラムがある。つまり、MyBoxのようなオブジェクトは「自分で自由に作る」ことができる。どのようにして作るのだろうか。
MyBoxのようなものを「クラス」と呼ぶ。そしてそのようなものをプログラムすることを「クラスを実装する」と言う。「MyBoxを実装する」、とはすなわち
「MyBoxというクラスのプログラミングをする」、ということだ。
先のプログラムで、MyBoxをあらわす部分を以下にしめす。MyBox クラスは「Class MyBox」という行で始まり,「End Class」という行で終わる。そしてそれら2行を除くとその中身は以下のように7つの部分からなっている。
Class MyBox |
Dim x ' x座標 Dim y ' y座標 Dim w ' 幅 Dim h ' 高さ Dim vx ' 1Tickあたりのx方向移動量 Dim vy ' 1Tickあたりのy方向移動量 |
Public Sub New(ByVal picture1 As PictureBox, _ ByVal timer1 As Timer) AddHandler picture1.Paint, AddressOf Paint AddHandler timer1.Tick, AddressOf Tick End Sub |
Public Sub Location(x1, y1) ' 位置(x,y)を指定された値(x1,y1)にする x = x1 y = y1 End Sub |
Public Sub Size(w1, h1) ' サイズ(w,h)を指定された値(w1,h1)にする w = w1 h = h1 End Sub |
Public Sub Speed(vx1, 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 |
最初の部分を見てみよう。
Dim x ' x座標 Dim y ' y座標 Dim w ' 幅 Dim h ' 高さ Dim vx ' 1Tickあたりのx方向移動量 Dim vy ' 1Tickあたりのy方向移動量 |
この部分は変数の宣言で、特に目新しくない。これから使う変数の変数名を示しているだけで、計算や描画などの作用は何もない。
Public Sub New(ByVal picture1 As PictureBox, _ ByVal timer1 As Timer) AddHandler picture1.Paint, AddressOf Paint AddHandler timer1.Tick, AddressOf Tick End Sub |
この部分はやや難しいプログラムで後で説明するが、変更しないようにしよう。
Sub Location(x1, y1) ' 位置(x,y)を指定された値(x1,y1)にする x = x1 y = y1 End Sub |
Sub Size(w1, h1) ' サイズ(w,h)を指定された値(w1,h1)にする w = w1 h = h1 End Sub |
Sub Speed(vx1, vy1) ' 速度(vx,vy)を指定された値(vx1,vy1)にする vx = vx1 vy = vy1 End Sub |
これらは、以下のような共通の形をしている。
Sub xxxxxx(a1,a2,a3) 命令1 命令2 End Sub |
このようなコードを、「サブプロシージャー」と呼ぶ。
Public Sub xxxxxx(ByVal a1, ByVal a2, ByVal a3) 命令1 命令2 End Sub |
と書く場合もあるが、Public や ByVal はあってもなくても同じである。
a1,a2,a3を引数 (英語では argument )と言う。
引数は参照はしてよいが、代入には使用しない。
引数を参照すると、呼び出し時に指定した値が参照される。
たとえば
box(i).location(10,20)
という命令でLocateを呼び出すと、
Sub Location(x1, y1)
という引数が定義されているから、
x1では10が、y1では20が参照される。そこで、
x=x1
という代入ではxに10が代入されることになる。
実は、これまで、すでに意識せずにサブプロシージャーを使ってきた。たとえば、第1回の授業で作ったプログラムは以下のようなものだ(A班でもだいたい同じようなプログラムを作ったはずである)。
思い出せない人は Lesson 1-9 を見よう。
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Label1.Text = "Hello" End Sub |
これも、実はサブプロシージャーである。
Button1_Click などのサブプロシージャと、MyBoxのLocationなどのサブプロシージャの違いは以下の通りだ。
(1) Button1_ClickはClass Form1 の中にあり、LocationなどはClass MyBox の中にある。
(2) Locationなどのサブプロシージャの名前は、自分で自由に命名することができる。 (Button1_Click はVisual Studioが自動的に命名した名前だ)
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 = System.Drawing.Pens.Black g.DrawRectangle(pen, x, y, w, h) End Sub |
これらは、オブジェクトの1 tick 毎の動作と、描画動作をプログラムしている部分だ。赤字の部分はまだ説明が難しいので、このまま変更しないように注意しよう。