Форум: "Игры";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
Вниз"Сохранёнки" Найти похожие ветки
← →
MonoLife (2005-10-31 05:14) [0]Добрых суток. Сто лет не занимался играми, но появилось немного времени, нашел свою старую игруху 2003 г, захотелось поковыряться. Вопрос возник такого плана, как лучше создавать пользовательские сохраненки в файл? Содержание: юзер, здоровье, патроны и т.д. и т.п. Какой файл должен быть? Кроме ini тока. Поделитесь, кто что знает.
← →
Antonn © (2005-10-31 06:54) [1]можно типизированый забабахать, типа:
type
Tplayer = record
helth:integer;
Ammo:integer;
Shield:integer;
end;
var M:TMemoryStream; P:Tplayer;
begin
M:=TMemoryStream.create;
try
p.ammo:=4;
M.write(p,sizeof(Tplayer));
m.savetofile("c:\1.txt");
finally
m.free;
end;
end;
← →
MonoLife (2005-10-31 10:01) [2]м...м-дя...для одного юзвера я так и делал :). А если пользователей много и каждый хочет загрузить свою игру и у каждого есть свои сохраненки?
← →
Sniper17 (2005-10-31 12:43) [3]хм... создай разные диры с разными сохранёнками.. какие проблемы-то?
← →
Домовенок © (2005-10-31 13:24) [4]Можно не только разные "диры" создавать, но и просто разные файлы. А еще можно записывать подобным образом типизированные массивы в файл, если хочется сделать все сохранения в одном файле.
← →
MonoLife (2005-10-31 15:14) [5]А еще можно записывать подобным образом типизированные массивы в файл[4]
вот! Чуть по-подробнее можно?.
[3] - Как раз, пока я не задумывался над этой проблемой, я так и делал - файл, записанный, по типу [1] для каждого юзвера.
← →
MonoLife (2005-10-31 15:29) [6]...нашел статейку АП по файлам (типизированные и не...)... сейчас почитаю...не знаю, пока, в моем случае, наверное, пригодится. Задача - записать типизированный массив в файл... также как п.[1] ? К примеру, (см. п 1) Myplayer array of Tplayer? SetLength и т.д... Ага..надо найти инфу по записи и чтению типизированных массивов из файла и в файл...
← →
Fosgen (2005-10-31 23:18) [7]Мда, сталкивался я с такой ситуевиной - неопределенной длины массив не позволяется в типе, используемом для типизированных файлов. Дельфя говорит - размер записи неопределен. Запись позволяется исключительно фиксированной и определенной на момент компиляции длины. Переменной длины массивы можно писать блоками по N-байт в нетипизированные файлы. Читая их соответственно по указателям.
← →
MonoLife (2005-11-01 06:13) [8]Какие еще варианты есть?
← →
Fosgen (2005-11-01 08:01) [9]А какие они могут быть?
Файлы - либо текстовые - см. те же ini.
Либо - типизированные - тогда массивы фиксированной длины.
Либо - нетипизированные - тогда работа с байтовыми блоками, чтение и запись данных из\в память по указателям (организация буферов и т.д.).
Кто-нить знает другие типы файлов? Я - вроде нет. Дельфи - вроде тоже...:)
← →
JUS (2005-11-01 12:56) [10]Можно сщхранять в базу данных ещё, а я вот карту сохраняю в своей игре
ScrMap:array[1..SizeMapX,1..SizeMapY] of word;
...
> AssignFile(MapFiles,"Map0.nlr");
> Rewrite(MapFiles);
> For MapFy:=1 to SizeMapY do
> For MapFx:=1 to SizeMapX do
> Write(MapFiles,ScrMap[MapFx,MapFy]);
> CloseFile(MapFiles);
> end;
← →
JUS (2005-11-01 12:59) [11]Можно сохранять в базу данных ещё, а я вот карту сохраняю в своей игре
ScrMap:array[1..SizeMapX,1..SizeMapY] of word;
...AssignFile(MapFiles,"Map0.nlr");
Rewrite(MapFiles);
For MapFy:=1 to SizeMapY do
For MapFx:=1 to SizeMapX do
Write(MapFiles,ScrMap[MapFx,MapFy]);
CloseFile(MapFiles);
end;
← →
Fosgen (2005-11-01 20:13) [12]Это все равно получается типизированный файл. Запись у него будет все-таки фиксированной длины.
Write(MapFiles,ScrMap[MapFx,MapFy]);
В этой строчке записывается не что-нибудь, а запись размером в одно слово. Так что в данном случае это даже не база данных, а просто нетипизированный файл.
Тем более не понятно какого типа Ваша переменная MapFiles
← →
JUS (2005-11-01 20:22) [13]
> Тем более не понятно какого типа Ваша переменная MapFilesMapFiles:file of word;
А я не говорю что у меня база данных, я говорю что можно ещё сохранять в базу данных, а свой способ сохранения просто привел как вариант.
← →
Кефир87 © (2005-11-01 21:32) [14]Зачем карту то сохранять? Когда можно сохранить только изменения относительно свежезагруженной карты? Т.е. на пример что у того вот персонажа хп 20%, а вон тот рулез был взят 8)
← →
MonoLife (2005-11-02 06:24) [15]Спасибо, конечно, всем... Всё же, как сохранить массив из записей типа Record в файл и как считать его из файла? Ничего не получается :(
← →
MonoLife (2005-11-02 07:46) [16]Вот, для пробы сделал так:
(Обратите внимание на k)
Tplayer = record
helth: Longint;
Ammo: Longint;
NamePl: string[50];
end;
var Pz: array of TPlayer;
const k: integer=60;
{Запись в файл}
...
var MyMem: TMemoryStream;
i,h,a: integer;
z: string[50];
begin
MyMem:=TMemoryStream.create;
setlength(pz,3);
h:=100;
a:=200;
z:="Abracadabra";
try
for i:=0 to 2 do
begin
pz[i].helth:=h;
pz[i].Ammo:=a;
pz[i].zon:=z;
inc(h,10);
inc(a,10);
z:=z+"B";
MyMem.write(pz[i],k);
end;
MyMem.savetofile(ExtractFilePath(Application.ExeName)+ "mysave.txt");
finally
MyMem.free;
end;
end;
{чтение из файла}
...
var MyMem: TMemoryStream;
i: integer;
begin
MyMem:=TMemoryStream.create;
try
setlength(pz,3);
MyMem.LoadFromFile(ExtractFilePath(Application.ExeName)+ "mysave.txt");
for i:=0 to 2 do
MyMem.Read(Pz[i],k);
finally
MyMem.free;
end;
end;
правильно ли все это?
← →
MonoLife (2005-11-02 08:09) [17]Что будет, если в Tplayer - NamePl (zon, ошибочка выше, вместо "zon" читай "NamePl") поставить string, а не string[50], а k=12?
← →
JUS (2005-11-02 15:16) [18]Вроде правильно 8-\
← →
MonoLife (2005-11-02 17:02) [19]По существу, [16] и есть база данных?
← →
JUS (2005-11-02 17:26) [20]Я имел ввиду например Paradox, FoxPro, MSAccess и другие.
> MonoLife (02.11.05 17:02) [19]
> По существу, [16] и есть база данных?
Незнаю, наверное да!
← →
Кефир87 © (2005-11-02 18:22) [21]
> Я имел ввиду например Paradox, FoxPro, MSAccess и другие.
Но ведь это же бред! А потом еще застовлять юзера установить на свой ПК делфи, потому что он лох и у него нет BDE 8)
← →
JUS (2005-11-02 19:28) [22]
> Но ведь это же бред! А потом еще застовлять юзера установить
> на свой ПК делфи, потому что он лох и у него нет BDE 8)
Не надо юзеру ничего устанавливать, зачем!?... или всётаки надо?!8-\
← →
Кефир87 © (2005-11-02 21:42) [23]Ага. BDE (Borland Database Engine). Нужно 8)))
← →
MonoLife (2005-11-03 05:40) [24]вы о чем? причем тут BDE? Просто, я создал типизированный файл с ограниченными записями, это по существу, уже база данных, так думаю... Вообще, комментарий по поводу [16],[17] хотел услышать
← →
Домовенок © (2005-11-03 14:33) [25]Вот: http://www.realcoding.net/article/view/866 - "Моя собственная база данных".
Читаем и не паримся. Никаких BDE не нужно.
← →
JUS (2005-11-03 16:46) [26]
> Домовенок © (03.11.05 14:33) [25]
Опять же запись базы все-таки фиксированной длины. 50
← →
Кефир87 © (2005-11-03 16:49) [27]Да вы чо! База данных это когда есть субд, которая на низком уровне оперирует с данными 8) И что это вдруг теба про БД зашла? Не нужны они тут 8)
← →
MonoLife (2005-11-03 16:59) [28]Ну, хорошо. Пусть мне только кто-нибудь объяснит и скажет, чтО у меня получилось в [16] и правильно ли так делать. И почему нельзя делать [17] (или можно? :))
← →
JUS (2005-11-03 18:01) [29]По моему, если всё работает правильно, значит сделал всё правильно, а каким способом - не важно!
← →
Кефир87 © (2005-11-03 19:32) [30]
> По моему, если всё работает правильно, значит сделал всё
> правильно, а каким способом - не важно!
Что значит правильно? А ведь можно еще сделать быстрее, универсальнее и т.д. Так что я не согласен 8)
← →
MonoLife (2005-11-04 09:00) [31]to Кефир87>> А ведь можно еще сделать быстрее, универсальнее и т.
обоснуй плз. А то про основоную тему ветки по моему забыли
← →
Fosgen (2005-11-04 10:52) [32]Непосредственно по [16]
НЕсколько громоздко получается.
Хотя можно сделать проще:Tplayer = record
helth: Longint;
Ammo: Longint;
NamePl: string[50];
end;
var Pz: array of TPlayer;
{Запись в файл}
...
var
i: integer;
F1: File Of TPlayer;
begin
setlength(pz,3); //хоть (pz,3000)
Assign(F1, "mysave.txt");
Rewrite(F1);
for i:=0 to High(Pz) do
begin
Write(F1, Pz[i]);
end;
Close(F1);
end;
Вроде несколько проще? Создаем типизированный файл. Записи там однозначно будут фиксированной длины - размером в одну единицу массива Pz. После СТАНДАРТНЫМИ процедурами пишем в файл (или читаем из него - без разницы). Все. А использование потов тут необосновано - записи-то фиксированные. А массив - уже готовый буфер данных. Зачем его из одного блока памяти (array) в другой-то (TMemoryStream) закачивать? Базой данных он от этого не становится.
Если требуется файл, поддерживающий переменную длину записи - пользуйтесь либо TMemoryStream (хотя это как-то громоздко...), либо - нетипизированные файлы типа File; File Of Byte;(это если нечетное число байт возможно в записи) File Of Word;(это если число байт кратно длине слова), а после - указатель на начало массива данных, подготовленных к записи в файл и в цикле - двигаем указатель, читаем по байтно\пословно (али еще большими блоками), да пишем опять же стандартно в нетипизированный файл. Только возникнет вопрос - где хранить переменный размер читаемой записи, дабы было его откуда взять при чтении такого файла. А то разбирать - как-то напряжно, где одна запись закончилась, а другая - началась. Читаем - так же - устанавливаем указатель на начало буфера-приемника, двигаем указатель, читаем из нетипизированного файла.
Потом - разбираем что, где...
← →
Fosgen (2005-11-04 11:00) [33]Это к вопросу - "быстрее, универсальнее и т.д."....
ЗАчем Вам вообще БД, если достаточно типизированного файла? Ставие тип = типу вашей переменной (пусть она и запись), да и все дела. Если Вам нужен переменный размер записи - пользуйтесь нетипизированными файлами или TMemoryStream, но заранее придумывайте - как Вы будете "отделять" одну запись от другой...
← →
Fosgen (2005-11-04 11:08) [34]К пункту [17]:
String - уже готовый массив типа Char. И когда он пишется (даже в составе записи) в файл, первым байтом идет количество символов в string"е. Что отсюда следует? Что либо в типе string длина до 255 символов, либо - читайте Help Дельфи по стандартным типам - все узнаете.
← →
MonoLife (2005-11-05 11:24) [35]Вполне исчерпывающие ответы. Спасибо!
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.054 c