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

Вниз

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

 
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]


> Тем более не понятно какого типа Ваша переменная MapFiles

MapFiles: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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.049 c
3-1144513827
VadimSpb
2006-04-08 20:30
2006.06.04
Экспорт в Excel


4-1142001409
pirate
2006-03-10 17:36
2006.06.04
Работа с буфером обмена


2-1146751850
DAn13
2006-05-04 18:10
2006.06.04
TreeView


15-1146400020
SergP
2006-04-30 16:27
2006.06.04
USB Flash Drive. Количество циклов перезаписи.


3-1144929416
ttt_111
2006-04-13 15:56
2006.06.04
Как сделать поиск в DBgrid?