Тема: LOAD-SAVE
Показать сообщение отдельно
Старый 15.06.2006, 00:46   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Сообщение LOAD-SAVE

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=загрузить
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 6 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
Arton (10.05.2010), Mhyhr (02.06.2009), Nex (16.07.2010), soneek (13.11.2009), St.AnGer (13.06.2009), Yalenz (10.04.2009)