0
votes

Ever since I added the CheckForCollision_Enemy method, I've been getting a stack overflow exception every time I run my code. Here is the CheckForCollision_Enemy method, in the Main class.

 Public Sub CheckForCollision_Enemy()
    Dim ship1 As New Enemy(Nothing, Nothing)
    Dim ship2 As New Enemy(Nothing, Nothing)
    Debug.Print("")

    Dim ships = {acc_e, bs_e, sb_e, ds_e, pb_e}

    For i As Integer = 0 To ships.Length - 1
        ship1 = ships(i)
        For j As Integer = 0 To ships.Length - 1
            ship2 = ships(j)
            If ship1.name <> ship2.name Then
                For l As Integer = 0 To ship1.length - 1
                    For t As Integer = 0 To ship2.length - 1
                        If ship1.space_filled(l, 0) = ship2.space_filled(t, 0) And ship1.space_filled(l, 1) = ship2.space_filled(t, 1) Then
                            Debug.Print("Collision at {" & ship1.space_filled(l, 0) & ", " & ship1.space_filled(l, 1) & "} " & ship1.name & " VS " & ship2.name)
                        End If
                    Next
                Next
            End If
        Next
    Next


End Sub

Here is the Enemy class. This is the class where the error is shown. I marked exactly where as a comment.

Shared gen As New Random()
Dim x As Integer = 0
Dim y As Integer = 0
Public Sub New(ByVal namep As String, ByVal lengthp As Integer)
    name = namep
    length = lengthp

    ReDim _start_point(2)
    ReDim _space_filled(length, 2)

    GenerateDirection()
    If direction = "horizontal" Then
        x = gen.Next(0, 11 - length)
        y = gen.Next(0, 10)
    ElseIf direction = "vertical" Then
        x = gen.Next(0, 10)
        y = gen.Next(0, 11 - length)
    End If
    GenerateStartPoint()
    ExtendStartPoint()

    DefineFilled()
    ColorFilled()

    Main.CheckForCollision_Enemy() 'If this is taken out, it will work fine.
End Sub

    Public Sub GenerateStartPoint()
    start_point = {x, y}
End Sub
Public Sub GenerateDirection()
    If gen.Next(0, 2) = 0 Then
        direction = "horizontal"
    Else
        direction = "vertical"
    End If
End Sub

Public Sub ExtendStartPoint()
    If direction = "horizontal" Then
        For i As Integer = 0 To length - 1
            space_filled(i, 0) = start_point(0) + i
            space_filled(i, 1) = start_point(1)
        Next
    ElseIf direction = "vertical" Then
        For i As Integer = 0 To length - 1
            space_filled(i, 0) = start_point(0)
            space_filled(i, 1) = start_point(1) + i
        Next
    End If
End Sub

Public Sub DefineFilled()
    For i As Integer = 0 To length - 1
        x = space_filled(i, 0)
        y = space_filled(i, 1)
        Try
            generate = False
            Main.TrackerBoard.box_list(x, y).full = True
        Catch
        End Try
    Next
End Sub
Private Sub ColorFilled()
    For y As Integer = 0 To 9
        For x As Integer = 0 To 9
            'Debug.Print(Main.PlayerBoard.box_list(x, y).full)
            If Main.TrackerBoard.box_list(x, y).full = True Then 'New error: "InvalidOperationException"
                Main.TrackerBoard.box_list(x, y).image.BackColor = System.Drawing.Color.Red
            Else
                Main.TrackerBoard.box_list(x, y).image.BackColor = System.Drawing.Color.Silver 'Most often, the error appears here.


            End If
        Next
    Next
End Sub

Here is the ship class. I've taken out most of the methods to save space; if you want to see anything, I'll add it in for you.

Public Class Ship
    Dim _name As String
    Public Property name() As String ...

    Dim WithEvents _image As PictureBox
    Public Property image() As PictureBox ...

    Dim _length As Integer
    Public Property length() As Integer ...

    Dim _direction As String
    Public Property direction() As String ...

    Dim _selected As Boolean
    Public Property selected() As Boolean ...

    Dim _placed As Boolean
    Public Property placed() As Boolean ...

    Dim _location() As Integer = {0, 0}
    Public Property location() As Integer() ...

    Dim _has_moved As Boolean
    Public Property has_moved() As Boolean ...

    Dim _space_filled(,) As Integer
    Public Property space_filled() As Integer(,) ...

    Public rect As System.Drawing.Rectangle

    Dim mouse_up As Boolean = False
    Dim tile_size As Integer = 25

    Public Sub New(ByVal namep As String, ByVal imagep As PictureBox, ByVal lengthp As Integer, ByVal directionp As String, ByVal selectedp As Boolean, ByVal placedp As Boolean)
        name = namep
        image = imagep
        length = lengthp
        direction = directionp
        selected = selectedp
        placed = placedp

        location(0) = 0
        location(1) = 0

        ReDim space_filled(length, 2)
        rect = New System.Drawing.Rectangle(location(0), location(1), length * tile_size, 1 * tile_size)

    End Sub

    Private Sub Ship_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles _image.MouseMove ...

    Private Sub Ships_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles _image.MouseClick ...

    Private Sub Ship_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles _image.MouseUp ...


    Public Sub Update() ...


    Public Sub SnapToBox() ...


    Private Sub DefineSpaceFilled() ...


    Private Sub ColorFilled() ...

End Class
1
remove the NEW from Dim ship1 As New Enemy(Nothing, Nothing) because you arent creating new ships just object vars for the collision loops. If Main is the main form name, you cant do Main.CheckForCollision_Enemy(). CheckCollision should really be elsewhere, failing that you need to reference it thru the Form instance not the class name, which can be confusing if your app starts from a Main Form.Ňɏssa Pøngjǣrdenlarp

1 Answers

3
votes

Your CheckForCollision_Enemy calls New Enemy, and New Enemy calls CheckForCollision_Enemy. You are recursing until the stack overflows.