Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.09;
Скачать: CL | DM;

Вниз

Сохранение в игре   Найти похожие ветки 

 
Asrw   (2003-06-05 21:41) [0]

Подскажите пожалуйста как можно реализовать


 
Плохой человек   (2003-06-05 23:01) [1]

Значит, переменные все всё ранво приёдтся записывать в файл, не знаю, правда, нужно кодировать данные или нет, а вот с интерфейсом можно облегчится - есть компоненты-запоминался свойств компонентов.


 
Asteroid ©   (2003-06-06 01:38) [2]

Не забудь приписать номер версии сохраненного файла и обработку более старых.

охранение можно сделать так: какой-то ID блока, его длина, данные, затем опять ID и т.д. Строки записывать либо как "длина, данные", либо "данные, 0" (имею в виду численный ноль, а не символ). При желании все данные можно поXORить.


 
NailMan ©   (2003-06-06 10:09) [3]

Я в сейве для важных параметров игрока(бабки, кол-во груза и т.д.)намереваюсь сделать еще и контрольную сумму. В случае несовпадения - format c:....шутка, но игроку будет неприятно получить сообщение. Причем в случае взлома, я буду целенамеренно старую CS менять на левую, таким образом откат невозможен, если только не сохранять старую версию целиком. Да! контрольную сумму я закриптую и буду размещать каждый раз в разных секциях.

Ну а сами данные в файлах(не только сейвов) я делаю как обычно: индентификатор(8б char) и сами данные.


 
Omar2002 ©   (2003-06-06 11:36) [4]

Советую создать несколько файлов, характеристики, города, люди и т.д.Сохраняешь все файлы в папочку (в игре это слот). Только не забудь, что лучше сохранять в файлах типа integer.
А в остальном NailMan все правильно сказал.


 
NailMan ©   (2003-06-06 12:32) [5]

To -> Omar2002 ©
Все раскидывать по разным файлам неудобно. Можно для предопределения секций в начало сейва кинуть DWORD со смещением(адресом) нужной секции от начала файла. В случае если тебе нужно
что-то считать в середине файла просто считываешь смещение и fileseek`аешься на него и читаешь далее что нужно. Сейв компактный и его легко переносить при переустановке игры.

Только не забудь, что лучше сохранять в файлах типа integer.
ЧТо подразумевается под "файл типа integer"? С хендлом типа Integer(FileCreate, FileOpen, FileSeek) или file of integer?

ЗЫЖ Почему-то у меня все хендлы стандартных FILE of или TEXTFILE глюкают если превышается некоторое количество хендлов, причем даже не открытых одновременно, и глюкают очень странным способом. Видимо из-за того что эти хэндлы со времен DOSа идут. Поэтому все юзаю через вышепреведенные функции и хендл-integer. Даже сделал аналоги writeln, readln для текстовых скриптов.



 
Omar2002 ©   (2003-06-06 16:45) [6]


> NailMan © (06.06.03 12:32)
> To -> Omar2002 ©
> Все раскидывать по разным файлам неудобно. Можно для предопределения
> секций в начало сейва кинуть DWORD со смещением(адресом)
> нужной секции от начала файла. В случае если тебе нужно
> что-то считать в середине файла просто считываешь смещение
> и fileseek`аешься на него и читаешь далее что нужно. Сейв
> компактный и его легко переносить при переустановке игры.
>


Это надо будет попробовать. :)
Короче говоря, все эти смещения меняются. Например если карта стала больше, или юнитов добавилось. Хотя можно все это сохранять в начале файла.Но иногда глючит что-то с длинными файлами, толи винда, толи делфак.


> Только не забудь, что лучше сохранять в файлах типа integer.
> ЧТо подразумевается под "файл типа integer"? С хендлом типа
> Integer(FileCreate, FileOpen, FileSeek) или file of integer?

Я подразумеваю file of integer в нем самый маленький обьем получается(при больших значения).

> ЗЫЖ Почему-то у меня все хендлы стандартных FILE of или
> TEXTFILE глюкают если превышается некоторое количество хендлов,
> причем даже не открытых одновременно, и глюкают очень странным
> способом. Видимо из-за того что эти хэндлы со времен DOSа
> идут. Поэтому все юзаю через вышепреведенные функции и хендл-integer.
> Даже сделал аналоги writeln, readln для текстовых скриптов.



 
NailMan ©   (2003-06-06 18:02) [7]

To -> Omar2002 ©
Короче говоря, все эти смещения меняются. Например если карта стала больше, или юнитов добавилось. Хотя можно все это сохранять в начале файла.
Все смещения надо хранить сразу после заголовка, после смещений секций идут уже данные.

Но иногда глючит что-то с длинными файлами, толи винда, толи делфак.
Я подразумеваю file of integer в нем самый маленький обьем получается(при больших значения).

Вот поэтому и глючит.

Я когда с паскаля на дельфю переходил тоже ипользовал всякие File of, и это рано или поздно непонятным образом глюкало, поэтому перешел на мастдайные хэндлы - integer используя FileCreate, FileOpen, FileClose, FileRead, FileWrite, аналогичные BlockRead/blockWrite для досовых хэндлов file of, и дающие богатые возможности по работе с файлами типа одновременного read/write и всякими шарами на файл. Сам уже написал функции readln, writeln для строковых дел и после этого ни одного глюка не замечал.

Кстате если ты используешь File of зачем делаешь типа integer? Гораздо проще использовать просто file и blockread/blockwrite?


 
Asrw   (2003-06-06 20:48) [8]

Спасибо всем


 
Omar2002 ©   (2003-06-07 17:29) [9]


> NailMan © (06.06.03 18:02)

Слушай, скинь ссылочку где можно посмотреть про енти хэндлы.
Спасибо заранее. pls


 
NailMan ©   (2003-06-09 10:18) [10]

Дык смотри в дельфевском хелпе, там все популярно и подробно написано, с примерами.

FileCreate - создать новый файл, возвращает хэндл
FileOpen - открыть существующий файл. По умолчанию зашарен, тоесть доступа левым приложениям нет. Можно флагами открыть как чтение, запись, чтение/запись и расшарить как угодно. Возвращает хэндл.

В обеих функциях если после выполнения хэндл =-1, то файл не создался или не открылся. Фактически это аналогично assignfile/reset и ioresult.

FileRead - считывает буфер из файла, возвращает число считанных байт.

FileWrite - записывает буфер в файл, возвращает число записанных байт.

это аналоги blockread/blockwrite.

краткий пример, на read/write, простая перекачка из одного файла в другой

var p:Pointer;
nread:integer;
f,fg:integer;

//предполагаем что оба файла открыты
getmem(p,262144);
repeat
nread:=fileread(f,p^,262144);
filewrite(fg,p^,nread);
until (nread=0) or (nread<>262144);
freemem(p);

//закрываем файлы
буфер в данных функциях абсолютно любая переменная.

FileSeek - перейти на позицию в файле.
флаг имеет значения:
0 - перейти на позицию от начала файла
1 - перейти на позицию от текущей позиции файлового курсора
2 - перейти на позицию от конца файла
функция возвращает текущую позицию файлового курсора.

обычно ее применяют для позиционирования, но можно с помощю нее узнать размер файла:

var
( f,0,1) [10]
Дык смотри в дельфевском хелпе, там все популярно и подробно написано, с примерами.

FileCreate - создать новый файл, возвращает хэндл
FileOpen - открыть существующий файл. По умолчанию зашарен, тоесть доступа левым приложениям нет. Можно флагами открыть как чтение, запись, чтение/запись и расшарить как угодно. Возвращает хэндл.

В обеих функциях если после выполнения хэндл =-1, то файл не создался или не открылся. Фактически это аналогично assignfile/reset и ioresult.

FileRead - считывает буфер из файла, возвращает число считанных байт.

FileWrite - записывает буфер в файл, возвращает число записанных байт.

это аналоги blockread/blockwrite.

краткий пример, на read/write, простая перекачка из одного файла в другой

var p:Pointer;
nread:integer;
f,fg:integer;

//предполагаем что оба файла открыты
getmem(p,262144);
repeat
nread:=fileread(f,p^,262144);
filewrite(fg,p^,nread);
until (nread=0) or (nread<>262144);
freemem(p);

//закрываем файлы
буфер в данных функциях абсолютно любая переменная.

FileSeek - перейти на позицию в файле.
флаг имеет значения:
0 - перейти на позицию от начала файла
1 - перейти на позицию от текущей позиции файлового курсора
2 - перейти на позицию от конца файла
функция возвращает текущую позицию файлового курсора.

обычно ее применяют для позиционирования, но можно с помощю нее узнать размер файла:

var
fsize,lastp:integer;

lastp:=fileseek(f,0,1);//сохраняем последнее положение файлового курсора
fsize:=fileseek(f,0,2);//переходим на конец файла
fileseek(f,lastp,0); //возвращаемся обратно


Это в общем случае.

Могу привести для букета код функций readln/writeln для использования файлов с хэндлами integer как текстовых файлов(хотя они всегда будут бинарными), но это я могу завтра запостить, так как модуль дома валяется.

ЗЫЖ главное правило - не совмещать файловые функции старого формата с новыми, иначе будут AV или хуже.


 
Omar2002 ©   (2003-06-09 11:54) [11]

Спасябо :) Будем переходить на нивый(для меня формат) :))


 
Asteroid ©   (2003-06-09 19:00) [12]

Если есть желание, можно даже на WinAPI с файлами общаться :)) Я когда-то так и делал, хотя теперь понял, что удобнее дельфийские функции использовать.


 
Omar2002 ©   (2003-06-10 13:27) [13]

Правильно, зачем сложнее когда можно проще.


 
Dabus   (2003-06-18 18:10) [14]

TIniFile. Или с помощью BlockWrite, BlockRead целиком сохраняем или загружаем массив с нашими данными, правда только Char формата. Но думаю 256 вариантов характеристик тебе хватит. :)



Страницы: 1 вся ветка

Текущий архив: 2004.01.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.017 c
4-25664
Dmitry___
2003-11-02 18:10
2004.01.09
Определение имени пользователя...


1-25419
Oleg Barsky
2003-12-24 14:09
2004.01.09
MoveFile в консольном приложении


14-25566
Knight
2003-12-17 11:21
2004.01.09
Поделитесь примером использования функции


1-25371
]eRoR_rrr[
2003-12-25 11:47
2004.01.09
RichEdit


8-25454
Virus
2003-09-09 11:00
2004.01.09
смена фона рабочего стола