Обнаружение столкновения между графическим объектом и графическим объектом в Visual Basic - PullRequest
0 голосов
/ 20 октября 2011

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

    Private Sub generateRandomTerrain()
    Dim terrainBrush As New SolidBrush(Color.Gray)
    Dim terrainDraw As Graphics = Me.CreateGraphics

    'Generate Different Points for Terrain
    Me.xpoint1 = (Rnd() * 10) + (Rnd() * 20) + (Rnd() * 10) - (Rnd() * 20)
    Me.ypoint1 = (Rnd() * 30) + (Rnd() * 10) - (Rnd() * 20) + (Rnd() + 5)

    Me.xpoint2 = (Rnd() * 10) + (Rnd() * 20) + (Rnd() * 10) - (Rnd() * 20)
    Me.ypoint2 = (Rnd() * 30) + (Rnd() * 10) + (Rnd() * 20) + (Rnd() + 5) + (Rnd() * 30) - (Rnd() * 30)

    Me.xpoint3 = (Rnd() * 10) + (Rnd() * 20) + (Rnd() * 10) - (Rnd() * 20)
    Me.ypoint3 = (Rnd() * 30) + (Rnd() * 10) - (Rnd() * 20) + (Rnd() + 5) - (Rnd() * 30) + (Rnd() * 30)

    Me.xpoint4 = (Rnd() * 10) + (Rnd() * 20) + (Rnd() * 10) - (Rnd() * 20)
    Me.ypoint4 = (Rnd() * 30) + (Rnd() * 10) + (Rnd() * 20) + (Rnd() + 5) - (Rnd() * 30) + (Rnd() * 30)

    'Add System to make sure that hills are not too sharp???

    'Generate Points to Draw
    Dim terrain() As Point = {New Point(0, Me.Size.Height), New Point(0, Me.Size.Height - 100), New Point((Me.Size.Width * 0.2) + Me.xpoint1, Me.Size.Height - Me.ypoint1 - 100), New Point((Me.Size.Width * 0.45) + Me.xpoint2, Me.Size.Height - Me.ypoint2 - 100), New Point((Me.Size.Width * 0.75) - Me.xpoint3, Me.Size.Height - 100 - Me.ypoint3), New Point((Me.Size.Width * 0.8) + (Me.Size.Width * 0.05) - Me.xpoint4, Me.Size.Height - Me.ypoint4 - 100), New Point(Me.Size.Width, Me.Size.Height - 100), New Point(Me.Size.Width, Me.Size.Height)}

    'Is Terrain Drawn-Clear
    If Me.isTerrainDrawn = 1 Then
        terrainDraw.Clear(Color.Transparent)
        Me.isTerrainDrawn = 0
    End If

    'Draw Terrain Aspects
    terrainDraw.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
    terrainDraw.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    terrainDraw.CompositingMode = Drawing2D.CompositingMode.SourceOver

    'Draw Terrain
    terrainDraw.FillClosedCurve(terrainBrush, terrain)

    'Set Terrain to Drawn
    Me.isTerrainDrawn = 1
End Sub

Я пробовал много способов сделать это, но ни один из них не работает.

Спасибо.

1 Ответ

1 голос
/ 04 февраля 2012

Создайте свой путь в виде кривой сплайна с помощью класса System.Drawing.Drawing2D.GraphicsPath. Вы можете добавить точки к пути с помощью метода AddClosedCurve. Затем вы можете проверить, находится ли точка в замкнутой кривой с помощью path.IsVisible(point) или path.IsVisible(x, y).

Наконец, вы можете нарисовать путь с помощью terrainDraw.FillPath(brush, path)


Ваш код

Me.xpoint1 = (Rnd() * 10) + (Rnd() * 20) + (Rnd() * 10) - (Rnd() * 20)

может быть упрощено как

Me.xpoint1 = 20 * Rnd()

Как 10 Rnd + 20 Rnd + 10 Rnd - 20 Rnd == 20 Rnd. Вы не получите лучшего случайного значения, если добавите четыре случайных значения.


Класс Region тоже интересен. Он может содержать прямоугольники и графические пути и имеет метод Intersect, который возвращает пересечение самого себя и другого Region, GraphicsPath или Rectangle. У него также есть метод Complement, который вы можете использовать, чтобы получить внешнюю поверхность. Если вы пересекаете поверхность местности с каким-либо графическим объектом, и результат является пустым (который можно проверить с помощью метода IsEmpty), это означает, что столкновения нет.

...