Трудности со столкновениями стен в игре от третьего лица VB6 - PullRequest
1 голос
/ 11 октября 2011

Хорошо, поэтому я пытаюсь сделать игру от третьего лица в 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

Теперь, как вы можете видеть, проблема в том, что когда он сталкивается, я не знаю, как "разогнать", чтобы стена, с которой мы столкнулись, застряла и не прокручивалась состальные вещи.Это сложно объяснить, надеюсь, вы понимаете.Спасибо

Как видите,

1 Ответ

0 голосов
/ 11 октября 2011

Самый простой способ исправить логику столкновения - это рассмотреть вопросы:

  • Могу ли я подняться?
  • Можно ли спуститься вниз?
  • Могу ли я двигаться влево?
  • Могу ли я двигаться правильно?

, а не вопрос «Я в столкновении со стеной?»

Вы отвечаете на эти вопросы, сравнивая свою позицию после перемещения с пределом, установленным стеной.

Пример кода (будьте добры ... Я не писал VB6 за последние 10 лет; -)

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

В этом примере предполагается, что вы уже применили предложенную новую позицию к Shape1. Если вы предпочитаете, вы можете передать неподвижное значение Shape1 вместе с левой скоростью и соответствующим образом изменить расчет. Я думаю, что вы, вероятно, хотите сравнить левый край фигуры с правым краем стены, а не с левым краем стены в вашем примере кода.

Обратите внимание, что если ваша позиция после перемещения поместит вас в стену, вам нужно настроить фактическое положение так, чтобы оно находилось прямо внутри комнаты (если вы перемещаетесь более чем на один пиксель за кадр, ваша скорость может текущее положение внутри или за стеной).

...