1

私は vb.net でゲームを作成しています。キャラクターがピクチャ ボックスと衝突しているかどうかを確認する必要があります。コードに「For Each PictureBox In Me.Controls」を追加すると、衝突が検出されなくなります。コードは次のとおりです。 :

For Each PictureBox In Me.Controls
    If Not Collision(picBox1, PictureBox) Then
        walk = 1
        tmrWalk.Start()
        picBox1.Top -= 5
    End If
Next

何らかの理由で、「For Each PictureBox In Me.Controls」を追加すると、その方向の移動速度も大幅に高速化されます。

衝突はモジュールからのものです。両方のピクチャボックスを指定してテストしたため、衝突が機能することがわかっています

4

1 に答える 1

0

問題は、プレイヤー自身もすべての画像ボックスの一部であるため、プレイヤー自身に対してチェックしている可能性があるため、そのケースを回避する必要があります。

Dim colliding as Boolean = false
For Each pb as PictureBox In Me.Controls
    ' Dont test against the player
    If Not pb is picBox1
        ' Check for collision
        If Collision(picBox1, PictureBox) Then
            ' Player is colliding - dont walk!
            colliding = true
        End If
    End If
Next

If Not colliding Then
    walk = 1
    tmrWalk.Start()
    picBox1.Top -= 5
End If

したがって、衝突が発生した場合、それを追跡し、衝突がまったく発生していない場合にのみ移動を許可します。

編集 通常、移動する前に衝突をテストして、衝突が発生しないことがわかっている場合にのみ実際にキャラクターを移動する必要があります。

移動後に衝突を処理することにした場合は、移動前にヨル プレーヤーの座標をキャッシュし、衝突が発生した場合はその座標を保存された値にリセットします。

ゲーム開発における衝突処理について読みたいと思うかもしれません。そこにはたくさんの優れたチュートリアルがあり、ここで紹介したものよりも優れた解決策を示すことができます。

于 2013-11-04T12:40:32.547 に答える