Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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]


> Тем более не понятно какого типа Ваша переменная 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.049 c
1-1146169429
delphi-oracle
2006-04-28 00:23
2006.06.04
Как поворачивать скролл


2-1148018581
elfebet
2006-05-19 10:03
2006.06.04
Как програмно перевернуть экран?


2-1148118467
BAngel
2006-05-20 13:47
2006.06.04
Seek


4-1141962670
hawkins
2006-03-10 06:51
2006.06.04
Как подгрузить свою dll в чужой процесс(ы)?


1-1146283663
IKV
2006-04-29 08:07
2006.06.04
CreateOleObject





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский