Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.012 c
14-25598
IronHawk
2003-11-27 16:31
2004.01.09
Какой форматировщик кода проги выбрать для Delphi & C++ Builder ?


14-25506
Gorlum
2003-12-16 16:44
2004.01.09
Расширение у файлов OutlookExpress


3-25185
malamba
2003-12-08 17:37
2004.01.09
программа должна работать на другом ПК. Но не хочет


1-25370
Sandman25
2003-12-25 11:27
2004.01.09
Инфо по RTTI


3-25240
GameBoy
2003-12-10 22:49
2004.01.09
Эксклюзивный режим





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский