forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   LOAD-SAVE (http://forum.boolean.name/showthread.php?t=1014)

impersonalis 15.06.2006 00:46

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=загрузить

ZanoZa 15.06.2006 10:46

Спасибо! я думаю многим это понадобится

Nex 10.04.2009 09:45

Ответ: LOAD-SAVE
 
А как сохранить модифицированый Terrain?

MiXaeL 10.04.2009 17:04

Ответ: LOAD-SAVE
 
в BMP удобнее всего в качестве карты высот.

Nex 10.04.2009 18:04

Ответ: LOAD-SAVE
 
Michael, мне в приципе все равно во что сохранять. Я просто че то не могу понять как модифицированый в Блитзе Terrain сохранить. :)

MiXaeL 10.04.2009 18:13

Ответ: LOAD-SAVE
 
Ну как, берешь цикл по x, в нем цикл по y и записываешь высоту каждой точки сетки. Хочешь в трехмерный массив, хочешь в картинку сразу.
В карту высот удобней тем, что можно прямо сразу и загружать из картинки терраин. Если будешь так делать, то сначала найду самую высокую точку терраина и рисуй точки цветом RGB: [255/MaxHeight*TerrainZ(...),--//--,--//--]

Nex 10.04.2009 18:40

Ответ: LOAD-SAVE
 
А терраин получается состоит из большого количества точек? Как их по отдельности проверять?

IGR 10.04.2009 18:44

Ответ: LOAD-SAVE
 
помойму это пригоlится, там avel писал:
http://forum.boolean.name/showthread...hlight=terrain

Nex 11.04.2009 13:14

Ответ: LOAD-SAVE
 
IGR, Че то я ничего не понял... =)

IGR 11.04.2009 13:39

Ответ: LOAD-SAVE
 
SkySream, эм... что ты непонял ?? как работает код ??

ABTOMAT 11.04.2009 15:02

Ответ: LOAD-SAVE
 
SkySream, сначала уясни для себя что такое террайн, как он устроен, и как с него снимать значения, а уже потом задавай вопросы как это сохранить в файл, иначе не разберёшься.


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

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