Vb.net 在Visual Basic中检测图形对象和图片对象之间的碰撞
我正在制作一个月球着陆器游戏,为每个新游戏随机化地形,所以每个游戏都是不同的。对于我的游戏,我正在创建一个图形对象,为游戏的地形绘制一条闭合曲线。然后我尝试检测图片对象是否与图形对象发生碰撞。我创建图形对象的方式如下:Vb.net 在Visual Basic中检测图形对象和图片对象之间的碰撞,vb.net,graphics,collision-detection,Vb.net,Graphics,Collision Detection,我正在制作一个月球着陆器游戏,为每个新游戏随机化地形,所以每个游戏都是不同的。对于我的游戏,我正在创建一个图形对象,为游戏的地形绘制一条闭合曲线。然后我尝试检测图片对象是否与图形对象发生碰撞。我创建图形对象的方式如下: Private Sub generateRandomTerrain() Dim terrainBrush As New SolidBrush(Color.Gray) Dim terrainDraw As Graphics = Me.CreateGraphi
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
我尝试过很多方法,但似乎都不管用
谢谢。使用
System.Drawing.Drawing2D.GraphicsPath
类将路径创建为样条曲线。可以使用AddClosedCurve
方法将点添加到路径中。然后可以使用path.IsVisible(点)
或path.IsVisible(x,y)
测试点是否位于闭合曲线内
最后,您可以使用terrainDraw.FillPath(画笔,路径)
你的代码
Me.xpoint1 = (Rnd() * 10) + (Rnd() * 20) + (Rnd() * 10) - (Rnd() * 20)
可以简化为
Me.xpoint1 = 20 * Rnd()
As10RND+20RND+10RND-20RND==20RND
。通过添加四个随机值,无法获得更好的随机值
区域
类也很有趣。它可以包含矩形和图形路径,并具有一个Intersect
方法,该方法返回自身和另一个区域的交集
、GraphicsPath
或矩形
。它还有一个补码
方法,可用于获取地形外部。如果您将地形外部与某个图形对象相交,结果为空(您可以使用IsEmpty
方法进行测试),则表示没有碰撞。最好在“确定”时询问此问题。谢谢你的建议!我会的。