VB.NET落下シミュレーション

【画面作成】

このように配置して(Timer1を忘れないこと,○の絵を準備する)プロパティをこんな感じに設定する。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


【落下と地面判定の考え方】

 理科で習う v = v0 + a t や h = v0 t + (a t2 )/2 を使うと座標の計算が出来る。しかし,変数tを使わなくても時間が来る毎にvhを修正するやり方の方が,コンピュータ処理にあっている。

 

 地面のぶつかり判定は,PictureBox1.Top = Me .Size.Hight では,玉の上の座標で判定しているためだめで,図のように玉の大きさを加味した,

 

 

 

 

 


PictureBox1.Top + PictureBox1.Hight >= Me .Size.Hight

 と,しなければならない。

※ 跳ね返りや変数型の変換は大体になっています。

 

【コード】<<ダウンロード>>

Public Class Form1

    Inherits System.Windows.Forms.Form

Windows フォーム デザイナで生成されたコード

        '変数の宣言 g重力加速度,v速度

    Dim g, v As Single

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        '変数の初期化 g=9.8重力加速度,v=0速度

        g = 9.8:  v = 0

        'timer1の初期化 0.1秒おきにタイマを呼び出す。

        Timer1.Enabled = False

        Timer1.Interval = 100

        'トラックバーの初期化と表示

        TrackBar1.Value = 5

        TrackBar1.LargeChange = 1

        Label1.Text = "係数" & (TrackBar1.Value / 10).ToString

    End Sub

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _

 Handles MyBase.MouseDown

        'クリックした際に玉の「中央」をそこに移動。

        '「中央だから」 -PictureBox1.Width / 2 が必要になる。

        PictureBox1.Left = e.X - PictureBox1.Width / 2

        PictureBox1.Top = e.Y - PictureBox1.Height / 2

    End Sub

 

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        '速度の計算と玉の高さの処理

        v = v + g

        PictureBox1.Top = PictureBox1.Top + v

        '地面の判定

        If PictureBox1.Top + PictureBox1.Height > Me.Size.Height Then

            '地面にぶつかったときの速度に比例して,跳ね返りの計算

            v = -v * TrackBar1.Value / 10

            '地面に埋まった時のために,地面上に戻す処理

            PictureBox1.Top = Me.Size.Height - PictureBox1.Height

        End If

 

    End Sub

 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        PictureBox1.Top = 0

        If Timer1.Enabled = False Then

            Timer1.Enabled = True

            Button1.Text = "ストップ"

        Else

            Timer1.Enabled = False

            Button1.Text = "落下"

        End If

    End Sub

 

    Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll

        Label1.Text = "係数" & (TrackBar1.Value / 10).ToString

    End Sub

End Class

 

 

 

【発 展】

 横に等速で動くなるようにしてみよう。