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

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

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

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

Ответ
 
Опции темы
Старый 14.06.2006, 20:46   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 03.09.2005
Сообщений: 14,014
Написано 6,795 полезных сообщений
(для 20,916 пользователей)
Сообщение 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)
Старый 15.06.2006, 06:46   #2
ZanoZa
Элита
 
Регистрация: 02.10.2005
Сообщений: 1,789
Написано 132 полезных сообщений
(для 252 пользователей)
Спасибо! я думаю многим это понадобится
(Offline)
 
Ответить с цитированием
Старый 10.04.2009, 05:45   #3
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,888
Написано 1,183 полезных сообщений
(для 3,292 пользователей)
Ответ: LOAD-SAVE

А как сохранить модифицированый Terrain?
(Offline)
 
Ответить с цитированием
Старый 10.04.2009, 13:04   #4
MiXaeL
Бывалый
 
Аватар для MiXaeL
 
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений
(для 267 пользователей)
Ответ: LOAD-SAVE

в BMP удобнее всего в качестве карты высот.
(Offline)
 
Ответить с цитированием
Старый 10.04.2009, 14:04   #5
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,888
Написано 1,183 полезных сообщений
(для 3,292 пользователей)
Ответ: LOAD-SAVE

Michael, мне в приципе все равно во что сохранять. Я просто че то не могу понять как модифицированый в Блитзе Terrain сохранить.
(Offline)
 
Ответить с цитированием
Старый 10.04.2009, 14:13   #6
MiXaeL
Бывалый
 
Аватар для MiXaeL
 
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений
(для 267 пользователей)
Ответ: LOAD-SAVE

Ну как, берешь цикл по x, в нем цикл по y и записываешь высоту каждой точки сетки. Хочешь в трехмерный массив, хочешь в картинку сразу.
В карту высот удобней тем, что можно прямо сразу и загружать из картинки терраин. Если будешь так делать, то сначала найду самую высокую точку терраина и рисуй точки цветом RGB: [255/MaxHeight*TerrainZ(...),--//--,--//--]
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nex (10.04.2009)
Старый 10.04.2009, 14:40   #7
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,888
Написано 1,183 полезных сообщений
(для 3,292 пользователей)
Ответ: LOAD-SAVE

А терраин получается состоит из большого количества точек? Как их по отдельности проверять?
(Offline)
 
Ответить с цитированием
Старый 10.04.2009, 14:44   #8
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,012 пользователей)
Ответ: LOAD-SAVE

помойму это пригоlится, там avel писал:
http://forum.boolean.name/showthread...hlight=terrain
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nex (11.04.2009)
Старый 11.04.2009, 09:14   #9
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,888
Написано 1,183 полезных сообщений
(для 3,292 пользователей)
Ответ: LOAD-SAVE

IGR, Че то я ничего не понял... =)
(Offline)
 
Ответить с цитированием
Старый 11.04.2009, 09:39   #10
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,012 пользователей)
Ответ: LOAD-SAVE

SkySream, эм... что ты непонял ?? как работает код ??
(Offline)
 
Ответить с цитированием
Старый 11.04.2009, 11:02   #11
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 25.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,407
Написано 5,238 полезных сообщений
(для 15,164 пользователей)
Ответ: LOAD-SAVE

SkySream, сначала уясни для себя что такое террайн, как он устроен, и как с него снимать значения, а уже потом задавай вопросы как это сохранить в файл, иначе не разберёшься.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
moka (11.04.2009), Nex (12.04.2009)
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AddMesh - save texture! ELIAS 3D-программирование 9 23.03.2009 12:45
Загрузка --\--load Petrofan 2D-программирование 15 31.01.2009 18:38
Alpha in 3d if not load Texture -=SCiP=- 3D-программирование 9 29.09.2007 22:26


Часовой пояс GMT +1, время: 03:13.


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