/// 実習I2 グラフィックス(2) | プログラミング実習 |
プロジェクト名 実習I2イメージ移動2
動作説明
タイマーを使って画像を移動する。ウィンドウの枠で跳ね返る。
デザイン
フォーム Form1
Size = 500, 500
タイマー Timer1
ピクチャボックス picField
BackColor = White (白)
Dock = Fill ←※1
Image = right1.gif
コード(プログラム)
Public Class Form1
'メンバ変数
Dim Gr As Graphics 'Graphicsオブジェクト用
Dim Gx, Gy As Integer '座標用
Dim Dx, Dy As Integer '移動量用
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs)
Handles Me.FormClosing
@ .Dispose() 'Graphicsオブジェクト解放
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
'タイマーの設定
Timer1. A = 100 '間隔100(ms)
Timer1.Enabled = True 'タイマー動作開始
'移動量と初期座標設定
Dx = 10
Dy = 10
Gx = 50
Gy = 50
'Bitmapオブジェクト作成
picField.Image = B Bitmap(picField.Width, picField.Height)
'Graphicsオブジェクト作成
C = Graphics.FromImage(picField.Image)
'描画
Gr.DrawImage(My.Resources.right1, Gx, Gy) 'イメージ描画
picField. D () 'イメージ更新
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Timer1.Tick
'座標計算
Gx = Gx + Dx
Gy = Gy + Dy
'左右の跳ね返り判定
If Gx E Me.ClientSize.Width - My.Resources.right1.Width Then
Gx = Me.ClientSize.Width - My.Resources.right1.Width
Dx = -Dx
ElseIf Gx F 0 Then
Gx = 0
Dx = -Dx
End If
'上下の跳ね返り判定
If Gy G Me.ClientSize.Height - My.Resources.right1.Height Then
Gy = Me.ClientSize.Height - My.Resources.right1.Height
Dy = -Dy
ElseIf Gy H 0 Then
Gy = 0
Dy = -Dy
End If
'消す (消してから)
Gr.Clear(Color.White) 'イメージ消去、白塗り
'描画 (描く)
Gr.DrawImage(My.Resources.right1, Gx, Gy) 'イメージ描画
picField.Refresh() 'イメージ更新
End Sub
End Class
キーワード
- Dock
- コンテナ(土台になるオブジェクト。この実習ではフォーム。)に固定するコントロールの部分を設定する。設定する値(図参照)は次のとおり。
Top コントロールの上部をコンテナに固定。 Left コントロールの左側をコンテナに固定。 Right コントロールの右側をコンテナに固定。 Bottom コントロールの下部をコンテナに固定。 Fill コントロールの上下左右をコンテナに固定。
解説
「実習G1移動計算」はピクチャボックスを移動させているが、この実習では画像の描画位置を変えることで移動させている。基本は、実習I1と同じく、「消してから描く」である。
座標の計算や跳ね返りの判定は、「実習G1移動計算」と同じ要領で計算する。
テスト
□ 実行すると斜め右下(45度)に移動する。ウィンドウの枠で跳ね返る。
Memo 今回、ピクチャボックス(picField)のDockプロパティをFillに設定した理由
ピクチャボックスの四辺がフォームの内側に固定されるので、ウィンドウのサイズを変更するとそれに合わせて、ピクチャボックスもサイズが変わる。ただし、今はサイズ変更したときにBitmapオブジェクトを作り直していない(元の大きさのままである)ので、正しく動作しない。
次のメソッドは、フォームがサイズ変更された(Resize)ときに実行されるものである。このメソッドの中でBitmapオブジェクトを作り直すプログラムを追加するだけでよい。追加しておくこと。
Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Resize
picField.Image = Nothing '空にする
'Bitmapオブジェクト作成し直し
picField.Image = New Bitmap(picField.Width, picField.Height)
'Graphicsオブジェクト作成し直し
Gr = Graphics.FromImage(picField.Image)
End Sub
I2の2
動作説明
タイマーを使って 「複数」 の画像を移動する。ウィンドウの枠で跳ね返る。
デザイン 変更なし
コード(プログラム) 下線部が追加・修正部分
Public Class Form1
'メンバ変数
Dim Gr As Graphics 'Graphicsオブジェクト用
Dim Kosuu As Integer = 20 '画像の個数用
Dim Gx(Kosuu), Gy(Kosuu) As Integer '座標用-画像の個数分を配列で用意
Dim Dx(Kosuu), Dy(Kosuu) As Integer '移動量用-画像の個数分を配列で用意
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs)
Handles Me.FormClosing
Gr.Dispose() 'オブジェクト解放
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Dim n As Integer
Dim rr As New Random
'タイマーの設定
Timer1.Interval = 100 '間隔100(ms)
Timer1.Enabled = True 'タイマー動作開始
'移動量と初期座標設定
Dx = 10 'Gx, Gy, Dx, Dyを配列にする
Dy = 10
Gx = 50
Gy = 50
For n = 1 To @
Dx(n) = rr.Next(5, 20) '移動量を 5〜19 の範囲で設定
Dy(n) = rr.Next(5, 20)
If rr.Next(0, 2) = 0 Then '乱数0 or 1。0なら移動量Dxを負に
Dx(n) = -Dx(n)
End If
If rr.Next(0, 2) A 0 Then '乱数0 or 1。0なら移動量Dyを負に
Dy(n) = B
End If
Gx(n) = rr.Next(10, 200) '初期座標を 10〜199 の範囲で設定
Gy(n) = rr.Next(10, 200)
C
'Bitmapオブジェクト作成
picField.Image = New Bitmap(picField.Width, picField.Height)
'Graphicsオブジェクト作成
Gr = Graphics.FromImage(picField.Image)
'描画
For n = 1 To kosuu
Gr.DrawImage(My.Resources.right1, Gx(n), Gy(n)) 'イメージ描画
Next
picField.Refresh() 'イメージ更新
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Timer1.Tick
Dim n As Integer
'座標計算
D n = 1 To Kosuu
Gx(n) = Gx(n) + Dx(n)
Gy(n) = Gy(n) + Dy(n)
'左右の跳ね返り判定
If Gx(n) >= Me.ClientSize.Width - My.Resources.right1.Width Then
Gx(n) = Me.ClientSize.Width - My.Resources.right1.Width
Dx(n) = -Dx(n)
E Gx(n) <= 0 Then
Gx(n) = 0
Dx(n) = -Dx(n)
End If
'上下の跳ね返り判定
If Gy(n) >= Me.ClientSize.Height - My.Resources.right1.Height Then
Gy(n) = Me.ClientSize.Height - My.Resources.right1.Height
Dy(n) = -Dy(n)
ElseIf Gy(n) <= 0 Then
Gy(n) = 0
Dy(n) = -Dy(n)
F
Next
'消す (消してから)
Gr.Clear(Color.White) 'イメージ消去、白塗り
'描画 (描く)
For n = 1 To kosuu
Gr.DrawImage(My.Resources.right1, Gx(n), Gy(n)) 'イメージ描画
Next
G .Refresh() 'イメージ更新
End Sub
Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Resize
picField.Image = Nothing '空にする
'Bitmapオブジェクト作成し直し
picField.Image = New Bitmap(picField.Width, picField.Height)
'Graphicsオブジェクト作成し直し
Gr = Graphics.FromImage(picField.Image)
End Sub
End Class
解説
画像を表示する座標用の変数Gx,Gyを配列にする。配列の個数は表示する画像の個数となる。座標の処理は、ループで繰り返し処理をする。
画像の移動量Dx,Dyも画像の個数分の配列にする。
テスト
□ 実行すると20個の画像が斜め(45度)に移動する。ウィンドウの枠で跳ね返る。
/// 実習I2 グラフィックス(2) | Copyright©2015-2017 Hiroshi Masuda |