2011-10-20 19 views
0

私は新しいゲームごとに地形をランダム化する月面着陸ゲームを作成しています。私のゲームでは、ゲームの地形の閉曲線を描画するグラフィックスオブジェクトを作成しています。私は、画像オブジェクトがグラフィックスオブジェクトと衝突するかどうかを検出しようとしています。私は、グラフィックスがそうのようなオブジェクトを作成します。私はこれを行うための多くの方法を試してみましたVisual Basicでグラフィックスオブジェクトとピクチャオブジェクトの衝突を検出しました

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 

、それらのどれも動作するようには思えません。

ありがとうございます。

+0

これは、http://gamedev.stackexchange.com – MPelletier

+0

で確認してください。提案していただきありがとうございます!私はそれを行います。 – cessnao3

答えて

1

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) 

10 Rnd + 20 Rnd + 10 Rnd - 20 Rnd == 20 Rndとして

Me.xpoint1 = 20 * Rnd() 

ように簡略化することができます。 4つのランダムな値を加えることで、より良いランダム値を得ることはできません。


Regionクラスも興味深いです。それは長方形とグラフィックパスを含むことができ、Intersectメソッドを持ち、それ自身と他のものとの交差点を返します。RegionGraphicsPathまたはRectangle。また、地形の外側を取得するために使用できるComplementメソッドもあります。地形の外側をグラフィックオブジェクトと交差させ、結果が空の場合(IsEmptyメソッドでテストできます)、衝突がないことを意味します。