2016-06-16 5 views
1

2Dゲームを設定し、タイルマッピングを使用して迷路テーマを適用しました。タイルサイズは48です。地図。.DrawImage(img、x、y、w、h)との衝突を特定する

If LevelStart = True Then 
    'Creates maze 

    a = 0 'a is the horizontal coordinate 
    b = 0 'b is the vertical coordinate 

    For X = 0 To Me.Width Step TileSize 
     For Y = 0 To Me.Height Step TileSize 
      If (a = 0 And b <= 18) Or (a = 22 And b <= 18) Or (b = 0 And a <= 22) Or (b = 18 And a <= 22) Then 'The wall border around the edge of the level 
       Map.DrawImage(bmpWall, X, Y, TileSize, TileSize) 
      ElseIf (a = 1 And ((b >= 1 And b <= 3) Or (b >= 5 And b <= 13) Or (b >= 15 And b <= 17))) Or (a = 2 And (b = 1 Or (b >= 3 And b <= 5) Or b = 11 Or (b >= 13 And b <= 15) Or b = 17)) Or (a = 3 And (b = 1 Or (b >= 7 And b <= 9) Or b = 11 Or b = 17)) Or (a = 4 And ((b >= 1 And b <= 5) Or b = 7 Or b = 9 Or (b >= 11 And b <= 14) Or b = 16 Or b = 17)) Or (a = 5 And (b = 5 Or b = 7 Or b = 9 Or b = 14 Or b = 16)) Or (a = 6 And ((b >= 1 And b <= 3) Or b = 5 Or b = 7 Or (b >= 9 And b <= 14) Or b = 16 Or b = 17)) Or (a = 7 And (b = 1 Or b = 3 Or b = 5 Or b = 7 Or b = 17)) Or (a = 8 And (b = 1 Or (b >= 5 And b <= 7) Or (b >= 9 And b <= 13) Or b = 15 Or b = 17)) Or (a = 9 And ((b >= 1 And b <= 3) Or b = 5 Or b = 9 Or b = 13 Or (b >= 15 And b <= 17)) Or (a = 10 And (b = 1 Or (b >= 3 And b <= 9) Or b = 11)) Or (a = 11 And (b = 1 Or b = 8 Or b = 11 Or (b >= 13 And b <= 17))) Or (a = 12 And (b = 1 Or (b >= 3 And b <= 11) Or b = 13 Or b = 15 Or b = 17)) Or (a = 13 And (b = 1 Or b = 3 Or b = 13 Or b = 15 Or b = 17))) Or (a = 14 And ((b >= 1 And b <= 13) Or b = 15 Or b = 17)) Or (a = 15 And (b = 1 Or b = 4 Or b = 10 Or (b >= 15 And b <= 17))) Or (a = 16 And ((b >= 1 And b <= 4) Or (b >= 6 And b <= 8) Or b = 10 Or (b >= 12 And b <= 15) Or b = 17)) Or (a = 17 And (b = 2 Or b = 8 Or b = 10 Or b = 12 Or b = 15 Or b = 17)) Or (a = 18 And (b = 2 Or (b >= 4 And b <= 6) Or (b >= 8 And b <= 10) Or b = 12 Or b = 13 Or b = 15 Or b = 17)) Or (a = 19 And (b = 1 Or b = 2 Or b = 4 Or b = 6 Or b = 8 Or b = 13 Or b = 15 Or b = 17)) Or (a = 20 And (b = 1 Or b = 4 Or b = 6 Or b = 8 Or (b >= 10 And b <= 13) Or b = 17)) Or (a = 21 And ((b >= 1 And b <= 4) Or (b >= 6 And b <= 10) Or (b >= 13 And b <= 17))) Then 'The path 
       Map.DrawImage(bmpPath, X, Y, TileSize, TileSize) 
      ElseIf a <= 22 And b <= 18 Then 'The walls 
       Map.DrawImage(bmpWall, X, Y, TileSize, TileSize) 
      End If 
      b += 1 
     Next Y 
     a += 1 
     b = 0 
    Next X 
End If 

は今、私はそのyとx軸上を移動PictureBoxからの衝突を検出することができますどのように思ったんだけど。このコードに基づいて、どうすれば衝突コンポーネントを書くことができますか?

+0

などのKeyPressイベントで、何か一般的にあなたはいないでしょう話します。あなたは、物事が仮想空間にあった場所を追跡し、そこに衝突検出を置く別のエンジンを持っていました。その後、描画ロジックは描画のみを担当します。 –

+0

私はこれらの線に沿って考えていたので、Map.DrawImage(bmpWall、X、Y、TileSize、TileSize)をバーチャルタグ付きタイルに置き換えて、phyiscalを使っている以外は、マップを描画するコードを複製することを考えましたからの衝突を検出する。私は私の人生のためにこれにvirutalトラッキングを追加する方法を考え出すことはできません。 –

+0

残念ながら、私は理論を知っていますが、実装を知っていません。 –

答えて

0

2D配列を使用して、異なるタイルを保存することができます。

Dim stage = { { 1, 1, 1, 1, 1 }, 
       { 1, 0, 0, 0, 1 }, 
       { 1, 0, 1, 0, 1 }, 
       { 0, 0, 1, 0, 0 }, 
       { 1, 1, 1, 1, 1 } } 

Dim playerX = 0, playerY = 3, TileSize = 48 

For x = 0 to stage.GetLength(0) - 1 
    For y = 0 to stage.GetLength(1) - 1 
     Dim index = stage(x, y) ' gets 0 or 1 from the stage 2D array 
     Dim image = {bmpPath, bmpWall}(i) ' image = bmpPath if i is 0, or bmpPath if i is 1 
     Map.DrawImage(image, x * TileSize, y * TileSize, TileSize, TileSize) 
    Next y 
Next x 

Map.DrawImage(bmpPlayer, playerX * TileSize, playerY * TileSize, TileSize, TileSize) 

Me.KeyPreview = True ' needed for the KeyPress event 

その後

Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress 

    If e.KeyChar = Keys.Right AndAlso 
     playerX < stage.GetLength(0) - 1 AndAlso ' if not at the right most tile 
     stage(playerX + 1, playerY) = 0 Then  ' if the tile on the right is path 

     Map.DrawImage(bmpPath, playerX * TileSize, playerY * TileSize, TileSize, TileSize) 
     playerX = playerX + 1 
     Map.DrawImage(bmpPlayer, playerX * TileSize, playerY * TileSize, TileSize, TileSize) 

    Else If e.KeyChar = Keys.Left AndAlso playerX > 0 Then 
     ' add the rest of the code for the other directions 
    End If 
End Sub 
+0

ありがとうございます!あなたのコードを実装しようとすると、私は暗い画像= {bmpPath、bmpWall} [stage [x、y]]を使うことができません。エラーが発生しましたエラーブラケットIDに ''がありません。いくつかの方法で行を変更しようとしましたが、この行のコードを実行する方法を理解できません。 –

+0

私の悪いC#は大括弧を使います。すべてをかっこで置き換えます。私はコードを試していないので、それ以上の変更が必要かもしれません。 – Slai

+0

ありがとう、うわー、うまくいった –