forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Загрузка уровня (http://forum.boolean.name/showthread.php?t=3234)

alcoSHoLiK 26.04.2007 19:47

Загрузка уровня
 
Вложений: 2
Во многих 2Д играх, действие которых происходит в пределах экрана, уровень реализован при помощи двухмерной матрицы. Каждая клетка матрицы содержит номер, который определяет тип объекта или местности, находящейся в этой клетке.
Таким образом, имея набор объектов можно создать множество разнообразных уровней, изменяя лишь числа в отдельных клетках матрицы.

Имеется игровое поле размером MxN, где M - кол-во строк, а N - кол-во столбцов. Для примера, возьмем квадратное поле 8х8. Пусть мы делаем игру "Лабиринт", и матрица первого уровня имеет следующий вид:
Код:

1 0 1 1 1 1 1 1
1 0 0 0 1 1 0 1
1 1 1 0 1 0 0 1
1 0 1 0 1 1 0 1
1 0 1 0 0 1 0 1
1 0 1 1 0 1 0 1
1 0 0 0 0 1 0 1
1 1 1 1 2 1 1 1

Единица означает, что на данной клетке находится стена, ноль говорит о том, что по этой клетке можно пройти. Двойка - место, где появляется игрок.

Для начала сохраним приведенную выше матрицу в двоичном формате. Так нам будет удобней с ней работать при загрузке. Рекомендуется написать отдельный парсер, который будет переводить матрицу из удобного для описания вида в вид двоичный (или же, в случае наличия редактора, сделать, чтобы он сохранял файл в двоичном режиме).

Код:

;Parser v0.0.1

; В этой структуре хранится каждая строка матрицы
Type LevelData
        Field DataLine$
End Type

; Ввод имени файла для парсинга
InputFileName$ = Input("Name of the file to parse: ")

; Открываем файл для чтения
InputFile = ReadFile(InputFileName)


; Считываем первую строку, чтобы узнать, сколько стобцов содержит матрица
SingleLine$ = ReadLine(InputFile)
N = 0
For i = 1 To Len(SingleLine)
        If Mid(SingleLine, i, 1) <> " " Then N = N + 1        ; Кроме пробела можно осуществлять проверку и других симолов
Next

; Записываем считанную линию в структуру LevelData
mydata.LevelData = New LevelData
mydata\DataLine = SingleLine

; Пока не достигнут конец файла, считываем каждую строку
M = 1
Repeat
        mydata.LevelData = New LevelData
        SingleLine = ReadLine(InputFile)
        mydata\DataLine = SingleLine
        M = M + 1
Until Eof(InputFile)

; Закрываем файл
CloseFile(InputFile)

; Теперь у нас есть сама матрица, хранящаяся в LevelData
; Ее размеры хранятся в M и N соответственно


; Открываем файл для записи, записываем туда размерность матрицы
OutputFile = WriteFile("Data.txt")
WriteInt OutputFile, M
WriteInt Outputfile, N

; Записываем поэлементно саму матрицу, перебирая все строки в LevelData
For mydata.LevelData = Each LevelData
        For j = 1 To Len(mydata\DataLine)
                token$ = Mid(mydata\DataLine, j, 1)
                If token <> " " Then
                        WriteInt OutputFile, token
                End If
        Next
Next

; Закрываем файл
CloseFile(OutputFile)

Теперь нам нужен загрузчик, который будет считывать двоичные данные и переводить в числовой вид:
Код:

;Loader v0.0.1

; В этой структуре хранится элементы матрицы
Type LevelData
        Field Cell
End Type

; Имя файла для считывания
InputFileName$ = "data.txt"

;Открываем файл
InputFile = ReadFile(InputFileName)

; Считываем размерность
M = ReadInt(InputFile)
N = ReadInt(InputFile)

; Считываем последовательно все элементы
For i = 1 To M
        For j = 1 To N
                mydata.LevelData = New LevelData
                mydata\cell = ReadInt(InputFile)
        Next
Next

; Закрываем файл
CloseFile(InputFile)


; Вывод результата на экран
i = 1
j = 1
For mydata.LevelData = Each LevelData
        Text j * 10, i * 10, mydata\cell
        j = j + 1
        If j > N Then
                i = i + 1
                j = 1
        End If
Next

Вот и все.

Из-за использования типов будет несколько неудобно обеспечить произвольный доступ к элементам матрицы. Если размерность матрицы известна на этапе компиляции, лучше использовать в загрузчике массив. Тогда можно упростить код считывания и вывода результата.

В аттаче исходники парсера, загрузчика и загрузчика с использованием массива.


Часовой пояс GMT +4, время: 09:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot