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 毎の動作と、描画動作をプログラムしている部分だ。赤字の部分はまだ説明が難しいので、このまま変更しないように注意しよう。