Список VB.net (из T) не возвращает индексированный объект - PullRequest
0 голосов
/ 30 сентября 2011

Я работаю над небольшой игрой, которая основана на карте квадратов сетки. У меня есть класс (clsGrid), который хранит несколько свойств для каждого квадрата сетки. Квадратные объекты сетки организованы в список (из clsGrid).
Читатель цикла и потока успешно считывает свойства из текстового файла, помещает свойства в объекты сетки и добавляет объекты сетки в мой список сеток. При получении сетки из списка сеток я получаю необычные результаты. Независимо от индекса, который я даю в списке, я всегда получаю последнюю индексированную сетку в списке. Похоже, что отладчик предполагает, что правильные числа читаются в потоковом считывателе и добавляются в gridHolder. Однако в окне сообщения в конце всегда отображается LAST grid.id, независимо от того, какой индекс я ему предоставляю.

Я работал над этим так долго, что, наверное, что-то глупо. Заранее спасибо за помощь.

'A subroutine that generates a map (list of grids)
Sub GenerateMap()
    Dim reader As StreamReader = File.OpenText("map1.txt")
    Dim gridHolder As New clsGrid

    'The streamreader peeks at the map file.  If there's nothing in it, a warning is displayed.
    If reader.Peek = CInt(reader.EndOfStream) Then
        MessageBox.Show("The map file is corrupted or missing data.")
        reader.Close()
    Else
        'If the map file has information, X and Y counts are read
        intXCount = CInt(reader.ReadLine)
        intYCount = CInt(reader.ReadLine)

        'Reads in grid properties until the end of the file
        Do Until reader.Peek = CInt(reader.EndOfStream)
            gridHolder.TerrainType = CInt(reader.ReadLine)
            gridHolder.MovementCost = CInt(reader.ReadLine)
            gridHolder.DefensiveBonus = CInt(reader.ReadLine)
            gridHolder.ID = listMap.Count
            listMap.Add(gridHolder)
        Loop
        reader.Close()
    End If
End Sub

'This function returns a Grid object given an X and Y coordinate
Function lookupGrid(ByVal intX As Integer, ByVal intY As Integer) As clsGrid
    Dim I As Integer
    Dim gridHolder As New clsGrid

    'This formula finds the index number of the grid based on its x and y position
    I = ((intX * intYCount) + intY)
    gridHolder = listMap.Item(I)
    MessageBox.Show(gridHolder.ID.ToString)

    Return gridHolder
End Function

1 Ответ

4 голосов
/ 30 сентября 2011

В GenerateMap ваш цикл «До» добавляет ссылку на один и тот же экземпляр clsGrid (gridHolder) в список каждый раз.Поскольку все ваши элементы списка ссылаются на один и тот же экземпляр, в окне сообщения отображаются одинаковые результаты независимо от индекса I.

Вам необходимо каждый раз создавать новый экземпляр clsGrid в цикле.Один из способов сделать это - добавить строку «gridHolder = New clsGrid» в качестве первой строки в вашем цикле.Затем вы также можете удалить слово «Новый» из существующего затемнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...