LSD - LOAD|SAVE|DELETE
Довольно частый вопрос на форумах.
Почему-то многие начинающие считают, что сохранение - это какой-то полумистический процесс, доступный только гуру,
и, сводящийся, как минимум, чуть ли не к дампу памяти процесса (стереотип сродни тому, что фидео-файл - это видео,
музыкальный - это музыка; т.е. человек не воспринимает, что ВСЁ ЭТО - всего лишь байты и, при определённом раслкаде,
один и тот же файл может быть и видео и текстом - зависит от метода обработки). Возможно это связано со зрелищностью
программирования игр;думаю, если бы всё сводилось к какой-нибудь школьной задачке типа: сохраните числа, введёные с
клавиатуры - вопросов бы поубавилось. Так в чём же дело? Не стоит забывать, что всё в игровом мире описывается
структурами данных, т.е., в конечном счёте, числами - можно сказать - Matrix =)
Думаю, из вышеприведённых выкладок нетрудно умозаключить следующее: никакие сверх-хитрые приёмы мы юзать не будем,
достаточно лишь сохранить параметры (характеристики,обобщённые координаты/силы, etc) в файл.
TEST
Напишем примитивненькую прогу для теста:
Graphics 800,600,32,2
SetBuffer BackBuffer()
Const R=60
Type Sphere2D
Field x
Field y
End Type
Function createSphere2D.Sphere2D(x,y)
S.Sphere2D=New Sphere2D
S\x=x
S\y=y
Return S
End Function
Function DrawALLSphere2D()
For S.Sphere2D=Each Sphere2D
Oval S\x-R,S\y-R,R*2,R*2
Next
End Function
While Not KeyHit(1)
If MouseHit(1)
CreateSphere2D(MouseX(),MouseY())
EndIf
DrawALLSphere2D()
Flip
Wend
End
Запустите её и покликайте левым ухом мыша по экрану. В месте долбления будет появляться круг...
Вот сейчас задумался над названием типа Sphere2D... Бавает и хуже...
SAVE
Наша цель - запечатлеть всю эту красоту из кружочков для потомков.
Создадим специальную функцию.
Function SaveLevel(name$)
File=WriteFile(name$+".txt")
End Function
name$ -какое-то произвольное имя сохранялки. Имя для файла с этой сохранялкой, вы,конечно, можете придумать любое
(например, чтобы легче пропарсить какие-нибудь парметры (дата/имя_игрока/etc),вынести их в имя файла), но в данном
примере оно будет тупо повторять имя сохранялки. И иметь расширение TXT (с расширением те же особенности, что и с
первой частью имени - может быть любым, зависит от конкретики задачи).
Function SaveLevel(name$)
File=WriteFile(name$+".txt")
For S.Sphere2D=Each Sphere2D
Next
CloseFile(File)
End Function
Вот здесь и появляется проблема - вычлинения необходимого минимума информации. Но с этим, боюсь, вам придёться
разбираться самолично.
Здесь же - очевидно, что нам необходимы координаты сфер.
Function SaveLevel(name$)
File=WriteFile(name$+".txt")
For S.Sphere2D=Each Sphere2D
WriteInt(File,S\x)
WriteInt(File,S\y)
Next
CloseFile(File)
End Function
Каким образом сохранять число - строкой или 4-мя байтами - также зависит от кокнретики задачи.
Зесь мы пойдём по пути минимального расхода дискового пространства.
While Not KeyHit(1)
If MouseHit(1)
CreateSphere2D(MouseX(),MouseY())
EndIf
If MouseHit(2)
Savelevel("1")
EndIf
DrawALLSphere2D()
Flip
Wend
Собственно, можно уже тестить: понатыркать кружочков и нажать правую кнопку мыши. После чего, в папке с прогой
появиться файл 1.txt, содержащий необходимую информацию.
LOAD
Теперь займёмся загрузкой "уровня".
Function LoadLevel(name$)
file=ReadFile(name$+".txt")
CloseFile(file)
End Function
Одна из распространённых ошибок - люди забывают очистить игровой мир, перед его загрузкой, в результате чего
получают 2ух главных героев,двойное кол-во монстров и т.п.
Function LoadLevel(name$)
Delete Each Sphere2D
file=ReadFile(name$+".txt")
CloseFile(file)
End Function
Организуем цикл чтения и создания объектов.
Function LoadLevel(name$)
Delete Each Sphere2D
file=ReadFile(name$+".txt")
While Not Eof(File)
a=ReadInt(file)
b=ReadInt(file)
CreateSphere2D(a,b)
Wend
CloseFile(file)
End Function
ВАЖНО: всегда контролируйте себя - если вы для объектов сохраняли сначал х а затем y, то и грузить их надо в том же
порядке. И ещё: чтобы не запутаться в порядке загрузки и передачи загруженного в функции, лучше конструкции типа:
CreateSphere2D(ReadInt(file),ReadInt(file))
заменять на:
a=ReadInt(file)
b=ReadInt(file)
CreateSphere2D(a,b)
Немного модифицируем прогу:
Graphics 800,600,32,2
SetBuffer BackBuffer()
Const R=60
Type Sphere2D
Field x
Field y
End Type
Function createSphere2D.Sphere2D(x,y)
S.Sphere2D=New Sphere2D
S\x=x
S\y=y
Return S
End Function
Function DrawALLSphere2D()
For S.Sphere2D=Each Sphere2D
Oval S\x-R,S\y-R,R*2,R*2
Next
End Function
Function SaveLevel(name$)
File=WriteFile(name$+".txt")
For S.Sphere2D=Each Sphere2D
WriteInt(File,S\x)
WriteInt(File,S\y)
Next
CloseFile(File)
End Function
Function LoadLevel(name$)
Delete Each Sphere2D
file=ReadFile(name$+".txt")
While Not Eof(File)
a=ReadInt(file)
b=ReadInt(file)
CreateSphere2D(a,b)
Wend
CloseFile(file)
End Function
While Not KeyHit(1)
If MouseHit(1)
CreateSphere2D(MouseX(),MouseY())
EndIf
If KeyHit(64) Savelevel("1")
If KeyHit(65) Loadlevel("1"):Cls
DrawALLSphere2D()
Flip
Wend
End
Вот и всё -
F6=сохранить
F7=загрузить