2012-04-04 4 views
1

私はビジュアルベーシックで迷路アプリケーションを構築しています。ゲームは2つの変数XとYが整数に依存しています。基本的にフォームを無効にして再描画を行うタイマーがあります。今私の質問は、フォームの周りに点在する様々な正方形と長方形があるということです。フォームを描画する四角形がこれらのオブジェクトに接触している場合、ハンドラを作成する方法、またはそのようなものを作成する方法はありますか?VB.NET迷路の衝突を検出する方法

コード:

Public Class Form1 
    Const W As Integer = 35 'Width 
    Const H As Integer = 35 'Height 

    Dim X As Integer 
    Dim Y As Integer 

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 
     'Handles if a key is pressed 
     Select Case e.KeyCode 
      Case Keys.Up 
       Y -= 2 
      Case Keys.Down 
       Y += 2 
      Case Keys.Left 
       X -= 2 
      Case Keys.Right 
       X += 2 

      Case Keys.Escape 
       Me.Close() 
     End Select 
    End Sub 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Me.Text = "Maze" 
     TmrRedraw.Start() 
     MsgBox("Press ESC to quit") 
     Cursor.Position = Me.Location 
    End Sub 

    Private Sub TmrRedraw_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TmrRedraw.Tick 
     If CollisionDetect() = False Then 
      Me.Invalidate() 
      CheckForWin() 
     End If 
    End Sub 

    Private Function CollisionDetect() 
     Dim Collision As Boolean = False 

     'Here is where the problem lies 


     Return Collision 
    End Function 

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint 
     e.Graphics.FillRectangle(Brushes.Blue, X, Y, W, H) 

    End Sub 

    Private Sub CheckForWin() 
     Dim WinSqX As Integer = WinSquare.Location.X 
     Dim WinSqY As Integer = WinSquare.Location.Y 

     If X = WinSqX And Y = WinSqY Then 

      TmrRedraw.Stop() 
      MsgBox("Congratulations! You won!") 
      Me.Close() 
     End If 


    End Sub 
End Class 

ああ - プレイヤーは、XとYを変更するには、矢印キーを使用する必要があり、それが再描画したときに、それが移動します。

おかげ

答えて

0

あなただけのユーザーがキーボードを押している時はいつでも無効にする必要があるので、私はあなたの例では、タイマーの必要性が表示されません。

オブジェクトの衝突のために、あなたはそれらの矩形座標を持つオブジェクトのリストが必要になり、その後、ちょうど交差点をテスト:

Public Class Form1 
    Dim block As New Rectangle(0, 0, 35, 35) 
    Dim listOfThings As New List(Of Rectangle) 

    Public Sub New() 
    InitializeComponent() 
    Me.DoubleBuffered = True 

    listOfThings.Add(New Rectangle(40, 40, 35, 35)) 
    End Sub 

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown 
    Select Case e.KeyCode 
     Case Keys.Up 
     MoveBlock(0, -2) 
     Case Keys.Down 
     MoveBlock(0, 2) 
     Case Keys.Left 
     MoveBlock(-2, 0) 
     Case Keys.Right 
     MoveBlock(2, 0) 
     Case Keys.Escape 
     Me.Close() 
    End Select 
    End Sub 

    Private Sub MoveBlock(ByVal moveX As Integer, ByVal moveY As Integer) 
    block.X += moveX 
    block.Y += moveY 

    For Each r As Rectangle In listOfThings 
     If r.IntersectsWith(block) Then 
     MessageBox.Show("Game Over") 
     End If 
    Next 

    Me.Invalidate() 
    End Sub 

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint 
    e.Graphics.Clear(Color.White) 

    For Each r As Rectangle In listOfThings 
     e.Graphics.DrawRectangle(Pens.Red, r) 
    Next 

    e.Graphics.FillRectangle(Brushes.Blue, block) 
    End Sub 
End Class 
+0

ので:ブロックは、ここにプレイヤーのユニットである、Listofthingsはすべてを含むリストでありますボード上の矩形の 1つの質問:Public Sub New()とは何ですか?これはForm1_Loadの意味ですか? – Azerty560

+0

@ Azerty560はい、基本的に、x、y、w、h変数は単純な矩形オブジェクトです。 – LarsTech

+0

すべての矩形で配列のリストを手入力する必要がありますか? (これは私が実際にフォーム上に何も絶対に必要としないのですか?) 回答ありがとう=) – Azerty560