1

Visual Basic で迷路アプリケーションを作成しています。ゲームは、整数である X と Y の 2 つの変数に依存します。再描画のためにフォーム全体を基本的に無効にするタイマーがあります。私の質問は、フォームの周りにさまざまな正方形や長方形が点在していることです。フォームが描画する正方形がこれらのオブジェクトに触れているかどうかを検出するために、ハンドラーまたはそのようなものを作成するにはどうすればよいですか?

コード:

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 を変更する必要があり、再描画すると移動します。

ありがとう

4

1 に答える 1

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
于 2012-04-04T13:59:56.010 に答える