我正在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
由于某种原因,在Me.Controls中添加“For Each PictureBox”也大大加快了这个方向的移动速度。
Collison来自一个模块,我知道碰撞是有效的,因为我在指定两个图片框的同时测试了它
答案 0 :(得分: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
所以现在如果发生碰撞,我们会跟踪它,并且只有在没有发生碰撞的情况下才允许移动。
修改强> 一般来说,你应该在移动之前测试碰撞,这样你实际上只有在你知道不会发生碰撞时才移动你的角色。
如果您决定在移动后处理碰撞,您将在移动前缓存yoru播放器的坐标,然后 - 如果发生碰撞 - 将其坐标重置为保存的值。
你可能想要阅读游戏开发中的碰撞处理,有很多很好的教程可以帮助你,并且展示出比我在这里提出的更好的解决方案。