Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ

FAQ Туториалы и часто задаваемые вопросы

Ответ
 
Опции темы
Старый 26.04.2007, 19:47   #1
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Загрузка уровня

Во многих 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
Вот и все.

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

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

Последний раз редактировалось alcoSHoLiK, 30.01.2008 в 17:39.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка уровня andriy_lysko 3D-программирование 15 07.03.2010 16:34
Помогите с загрузкой уровня Petrofan 3D-программирование 6 04.10.2008 17:07
загрузка уровня noob 3D-программирование 5 09.05.2007 21:54
Загрузка нового уровня Тарас Шевченко 3D-программирование 3 17.02.2007 12:36
Прокрутка уровня...HELP!!!!!!! xaoc3dgraph Программирование 2 30.01.2007 17:49


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com