第三人称游戏VB6中墙碰撞的困难
好的,所以我尝试在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.
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>最简单的修复碰撞逻辑的方法是考虑以下问题:
- 我可以上楼吗
- 我可以下楼吗
- 我可以向左移动吗
- 我可以向右移动吗
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