Подвижные платформы Vb6 в 2-х стороннем скроллере - PullRequest
0 голосов
/ 08 ноября 2011

Хорошо, поэтому я разработал 2-мерный боковой скроллер (платформер), и он чертовски эффективен для IMO, использует 1 таймер, и я пытаюсь сделать возможным перемещение платформ. Вот что я пробовал и отлаживаю с

 Private Sub Timer1_Timer()
'moving platforms
For f = 0 To Platform.Count - 1
    If Platform(f).Tag = "moving" Then
        For j = 0 To Platform.Count - 1
            If Collision(Platform(f), Platform(j)) And j <> f Then
                Speed(f) = Speed(f) * -1
            End If
        Next j
        Platform(f).Left = Platform(f).Left + Speed(f)
    End If
Next f

По сути, вот что делает код: Для всех платформ он проверяет, на какой платформе есть тег «перемещение», если у него есть этот тег, переместите его, но перед перемещением посмотрите, нужно ли изменить направление, поэтому он снова проходит по всем платформам, чтобы посмотрим, нужно ли ему снова измениться, и нужно ли это делать, если нужно, но в этом коде это не работает: (

В чем может быть проблема? Начальное значение всех скоростей равно 1, и у меня есть масштабное расстояние до пикселя, поэтому оно так мало. Любая помощь приветствуется

Функция столкновения:

Public Function Collision(Shape1 As Control, Shape2 As Control) 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 + Shape1.Height) < Shape2.Top + Shape2.Height Then
    Collision = True
Else
    Collision = False
End If
End Function

Ответы [ 3 ]

1 голос
/ 13 ноября 2011

Несколько вариантов оптимизации, которые вы можете рассмотреть:

1) В отличие от других языков, vb оценивает все выражения в выражении.Другими словами:

Если FunctionA = true и FunctionB = true, то DoSomething

всегда будет запускать FunctionB, даже если FunctionA был false.В своем таймере вы можете проверить, что j не равно f в операторе if перед проверкой столкновения, чтобы не тратить время на проверку этого столкновения, когда вы уже знаете, что собираетесь его игнорировать.

2)Если я выполню цикл от 1 до 3 во внешнем и внутреннем цикле, то получу сравнение:

    1 - 1
    1 - 2
    1 - 3
    2 - 1
    2 - 2
    2 - 3
    3 - 1
    3 - 2
    3 - 3

Если бы я был умным, я бы заставил мой внутренний цикл начать на один уровень выше, чем мой внешний цикл.Тогда я получаю только следующее:

    1 - 2
    1 - 3
    2 - 3

Это намного меньше циклов, и это только на 3 числах.

Попробуйте заменить строку цикла for на это: Для j = f +1 To Platform.Count - 1

И если вы сделаете это, вы получите дополнительное преимущество, так как вам не нужно проверять также j <> f.

0 голосов
/ 08 ноября 2011

Хорошо, проблема была решена. Соблюдайте эту функцию столкновения:

Public Function Collision(Shape1 As Control, Shape2 As Control) 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 + Shape1.Height) < Shape2.Top + Shape2.Height Then
        Collision = True
    Else
        Collision = False
    End If
End Function

Заметили проблему? В этом случае две платформы, которые я тестирую на столкновение, имеют одинаковую высоту . Подумайте об этом, если вы видите в этой функции столкновения последнее условие:

(Shape1.Top + Shape1.Height) < Shape2.Top + Shape2.Height

Поскольку Shape1 имеет ту же вершину, что и Shape2, это условие ложно, поскольку я подал в суд на знак «меньше», а не «меньше» или «РАВНО» Чтобы убедиться, что проблем нет, я заменил все свои знаки на или равные.

Public Function Collision(Shape1 As Control, Shape2 As Control) 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 + Shape1.Height) <= Shape2.Top + Shape2.Height Then
        Collision = True
    Else
        Collision = False
    End If

Функция завершения

Вы бы посмотрели на это! Движущаяся платформа, которая подпрыгивает между платформами рядом с ней. Красивая.

0 голосов
/ 08 ноября 2011

Этот код выглядит нормально.я думаю, что ошибка происходит в вашем коде столкновения, так как этот код устанавливает вашу скорость.

try

Speed ​​(f) = -Speed ​​(f);

И вы тожена самом деле ударил изменение скорости?Какое значение скорости после столкновения?

...