Форум: "Игры";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизСохранение в игре Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.011 c