/// 実習I2 グラフィックス(2) プログラミング実習 目次に戻る
 back next 

プロジェクト名  実習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

解答欄(英数字は半角で入力すること。余分な空白は入れないこと)
  @   A   B   C
  D   E   F   G
  H
   解答を入力し、[解答チェック]ボタンをクリックする。正解は   、不正解は   で表示される。

キーワード

Dock
 コンテナ(土台になるオブジェクト。この実習ではフォーム。)に固定するコントロールの部分を設定する。設定する値(図参照)は次のとおり。
Top コントロールの上部をコンテナに固定。
Left コントロールの左側をコンテナに固定。
Right コントロールの右側をコンテナに固定。
Bottom コントロールの下部をコンテナに固定。
Fill コントロールの上下左右をコンテナに固定。
Dockのプロパティ

解説

 「実習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

解答欄(英数字は半角で入力すること。余分な空白は入れないこと)
  @   A   B   C
  D   E   F   G
   解答を入力し、[解答チェック]ボタンをクリックする。正解は   、不正解は   で表示される。

解説

 画像を表示する座標用の変数Gx,Gyを配列にする。配列の個数は表示する画像の個数となる。座標の処理は、ループで繰り返し処理をする。
 画像の移動量Dx,Dyも画像の個数分の配列にする。

テスト

□ 実行すると20個の画像が斜め(45度)に移動する。ウィンドウの枠で跳ね返る。

 

 back next 
/// 実習I2 グラフィックス(2) Copyright©2015-2017 Hiroshi Masuda 

 

 

 

inserted by FC2 system