第三人称游戏VB6中墙碰撞的困难

第三人称游戏VB6中墙碰撞的困难,vb6,collision-detection,Vb6,Collision Detection,好的,所以我尝试在VB6中为一个类项目制作一个第三人称游戏,当这个人与墙(形状)碰撞时,他们不应该移动。但问题是,当人撞到墙上时,它会停止,但是现在墙被卡住了,不会与所有其他墙一起滚动。这是我的密码: Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyLeft Or vbKeyRight Or vbKeyUp Or vbKeyDown Then tmrMove.

好的,所以我尝试在VB6中为一个类项目制作一个第三人称游戏,当这个人与墙(形状)碰撞时,他们不应该移动。但问题是,当人撞到墙上时,它会停止,但是现在墙被卡住了,不会与所有其他墙一起滚动。这是我的密码:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyLeft Or vbKeyRight Or vbKeyUp Or vbKeyDown Then
        tmrMove.Enabled = True
    End If

    Select Case KeyCode
        Case vbKeyLeft
            XVel = 0 - Speed
            YVel = 0
        Case vbKeyRight
            XVel = Speed
            YVel = 0
        Case vbKeyUp
            YVel = 0 - Speed
            XVel = 0
        Case vbKeyDown
            YVel = Speed
            XVel = 0
    End Select

    Keys(KeyCode) = True
End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
    Keys(KeyCode) = False
    If Keys(vbKeyLeft) = False And Keys(vbKeyRight) = False And Keys(vbKeyUp) = False And Keys(vbKeyDown) = False Then
        XVel = 0
        YVel = 0
    End If
End Sub


Private Sub tmrMove_Timer()
    For i = 0 To (Wall.Count - 1)
        If Collision(Character, Wall(i)) = False Then
            Wall(i).Left = Wall(i).Left - XVel
            Wall(i).Top = Wall(i).Top - YVel
        End If
    Next i
End Sub


Public Function Collision(Shape1 As ShockwaveFlash, Shape2 As Shape) As Boolean
    If (Shape1.Left + Shape1.Width) > Shape2.Left And _
    Shape1.Left < (Shape2.Left + Shape2.Width) And _
    (Shape1.Top + Shape1.Height) > Shape2.Top And _
    Shape1.Top < (Shape2.Top + Shape2.Height) Then
        Collision = True
    Else
        Collision = False
    End If
End Function
Private子表单_KeyDown(KeyCode为整数,Shift为整数)
如果KeyCode=vbKeyLeft或vbKeyRight或vbKeyUp或vbKeyDown,则
tmrMove.Enabled=True
如果结束
选择大小写键代码
案例vbKeyLeft
XVel=0-速度
YVel=0
案例vbKeyRight
XVel=速度
YVel=0
案例vbKeyUp
YVel=0-速度
XVel=0
案例vbKeyDown
YVel=速度
XVel=0
结束选择
键(键代码)=真
端接头
私有子表单_KeyUp(KeyCode为整数,Shift为整数)
密钥(KeyCode)=False
如果键(vbKeyLeft)=False,键(vbKeyRight)=False,键(vbKeyUp)=False,键(vbKeyDown)=False,则
XVel=0
YVel=0
如果结束
端接头
专用子TMR移动计时器()
对于i=0到(Wall.Count-1)
如果碰撞(字符、墙(i))=False,则
墙(i).左=墙(i).左-XVel
墙(i).顶部=墙(i).顶部-YVel
如果结束
接下来我
端接头
公共函数碰撞(Shape1作为ShockwaveFlash,Shape2作为Shape)作为布尔值
如果(Shape1.Left+Shape1.Width)>Shape2.Left和_
形状1.左<(形状2.左+形状2.宽)和_
(形状1.顶部+形状1.高度)>形状2.顶部和顶部_
形状1.顶部<(形状2.顶部+形状2.高度)然后
碰撞=真
其他的
冲突=错误
如果结束
端函数
现在你可以看到,问题是当它碰撞时,我不知道如何“解开”,所以我们碰撞的墙会被卡住,不会与其他东西滚动。很难解释,希望你能理解。谢谢


<>你可以看到,

< p>最简单的修复碰撞逻辑的方法是考虑以下问题:

  • 我可以上楼吗
  • 我可以下楼吗
  • 我可以向左移动吗
  • 我可以向右移动吗
而不是问“我是不是撞到墙了?”

通过比较移动后的位置与墙施加的限制来回答这些问题

代码示例(仁慈点……我在过去10年中没有编写VB6;-)

此示例假定您已将建议的新位置应用于
Shape1
。如果愿意,可以将未移动的
形状1
与向左速度一起传递,并相应修改计算。我认为您可能希望在代码示例中比较形状的左边缘和墙的右边缘,而不是墙的左边缘

请注意,如果移动后的位置将您放置在墙内,则需要将实际位置调整为正好位于房间内(如果每帧移动超过一个像素,则速度可以将当前位置放置在墙内或墙外)

Public Function CanMoveLeft(Shape1 As ShockwaveFlash, Shape2 As Shape) As Boolean
    If (Shape1.Left + Shape1.Width) > Shape2.Right) 
    Then
        CanMoveLeft = True
    Else
        CanMoveLeft = False
    End If
End Function