Форум: "Игры";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
ВнизСохранение игры Найти похожие ветки
← →
Hater (2004-05-20 07:45) [0]Я создаю игру - текстовый квест. У героя будет несколько характеристик. Как запрограммиравать сохранение? Помогите пожалуйста!
← →
маг Гыр © (2004-05-20 08:03) [1]Создай переменную счётчик (N), к которой каждый раз при правильном ответе будет присваиваться N:=N+1; (при сохранении - записывай в файл эту переменную)
← →
kas-t (2004-05-20 08:24) [2]Если хочешь сохранять все значения переменных в файл, то тебе нужно копать в сторону IniFiles. Они просты и удобны в использовании.
← →
cyborg © (2004-05-20 08:50) [3]Ответь на вопрос:
Умеешь ли ты работать с файлами?
ответ нет - читай справки, примеры и всё поймёшь
ответ да - ты врёшь, так, как твой ответ "нет", иначе бы такой вопрос не задавал ;)
Если всётаки умеешь работать с файлами, но не знаешь чего туда писать :), скажи чего нужно записать, подскажем как.
← →
Hater (2004-05-20 19:07) [4]Работать как, ассигны там всякие. Это? Умею, но не на профуровне. А писать действительно незнаю...
← →
cyborg © (2004-05-20 19:19) [5]Не знал, что есть профуровень писания в файл :).
Так что писать то нужно, перечисляй?
← →
Sanek_metaller © (2004-05-20 19:47) [6]Юзай ини,или реестр,гораздо легче чем файлы...
← →
wiz © (2004-05-20 20:24) [7]2 Sanek_metaller:
Вот после таких заявлений "Юзай ини" и получаются сохранение/загрузка по пол-часа.
А про реестр я вообще молчу, ибо игрушка мало того, что засоряет реестр (созданный для других целей), но еще и перестаёт обладать переносимостью. А (например) мне иногда хочется перетащить сэйв с компьютера на фирме на домашний комп и обратно.
2 Hater:
Самый простой (пусть кто-нибудь придумает проще для статических структур) способ в следующем:
type
TPlayerStats = record
Intelligent:integer;
Experience:integer;
...
end;
var
PlayerStats:TPlayerStats;
...
procedure SaveHero(filename:string);
var
f:file of TPlayerStats;
begin
assignfile(f,filename);
rewrite(f);
write(f,PlayerStats);
closefile(f);
end;
Это не самый лучший способ, но с него можно стартовать.
---
...блондинка за рулём, все равно что обезьяна с гранатой...
← →
WinPopka (2004-05-20 20:35) [8]wiz, тогда в процедуре какой надо все сохранить надо к этому например intelegment`y приравнять переменую временную в которой этот элемент сидит?
типа int:=intelgment; а дальше сохранять уже можно.Или напрямую указывать в качестве переменных вот те строки из класса? а в файл автоматом друг за другом все сохранит?
← →
wiz © (2004-05-20 21:59) [9]2 WinPopka: можно и первым способом, но второй imho менее геморройный.
Я имел ввиду, если в проекте все параметры героя собраны в одну запись (record), то записать её в файл - пять строк кода. Загрузить - еще пять. Если не собраны, то лучше (imho) собрать.
А если там уже сделано всё через ООП ( TPlayerStats = class (TObject) ), то вопросов таких задаваться не должно (т.к. понять ООП imho чуток труднее, чем вывод в файл всяцих там байтиков)
---
...превратился в Красный Космический Гонобобель и ушуршал...
← →
kas-t (2004-05-20 23:28) [10]А что ini так долго читаются? Мне кажется, на прочтение пяти (и более) строк из ini потребуется не больше времени, чем приведенным Wiz примером. Только вот с ini проще работать.
Зы: Ну разве что может не пойти, потому что ini будет просто отредактировать ручками... :)
← →
wiz © (2004-05-21 05:01) [11]2 kas-t: вначале их пять, затем 10, потом пол-мега... А ini"шник это текстовая инфа, поэтому ты будешь тратить время на перевод string -> int/float.
---
...здесь был Красный Космический Гонобобель
← →
Hater (2004-05-21 07:55) [12]to cyborg:
Писать нужно жизнь - она будет уменьшатся после встречь с гопниками и тд.;/;
Ну, сохранение позиции я уже знаю как (через переменную плюс число);
Писать ещё некоторые вещи - типа артефактов: например, без калош низзя перейти огромное болото итд. итп;
.... ну на первых порах и всё. Разве что из-за красоты можно добавить отношение всяких людишек.
← →
cyborg © (2004-05-21 09:13) [13][12] Hater (21.05.04 07:55)
А теперь напиши как ты видишь написание кода под это дело, глядишь и сам понимать начнёшь.
← →
Hater (2004-05-22 12:22) [14]Ещё одно. Как сделать, чтоб кнопка каждый раз производила разные действия. Т.е я имею ввиду то, что на форме есь Эдит1 и кнопка Батон1. В поле Мемо1 выводится текст квеста. Как по нажатию кнопки изменять текст квеста? И изменять хар-ки персонажа. При разном варианте разные изменения. И так много раз. Теоретически, я догадываюсь как это сделать, но мне нужен авторитетный совет.
ЗЫ: Спасибо вам всем за советы. Огромное.
← →
cyborg (2004-05-22 15:45) [15]
> Как по нажатию кнопки изменять текст квеста? И изменять
> хар-ки персонажа.
Ты что, издеваешься? Вперёд за учебники по программированию, про игры забудь!
← →
Hater (2004-05-23 07:08) [16]Да нет, я знаю как. Просто... ну как же это обьяснить. Многократно. Я пытаюсь делать это в кейсах, но выходит как матрёшка - слишком громоздко. Может, можно как-то проще :(((
← →
cyborg (2004-05-23 08:51) [17]Пока не покажешь как ты делаешь и не объяснишь как хотелось бы, то тебе трудно помочь. Показывай проблемные куски. Не нужно только все модули кидать, только конкретные участки кода.
← →
kas-t (2004-05-23 10:42) [18]to wiz: Хочу тебя удивить... Из ini можно сразу читать integer, без всяких последующих переводов:
expa:=MyIni.ReadInteger("save","expa",0);
← →
Sapersky (2004-05-23 11:00) [19]А что ini так долго читаются?
Читаются - не очень долго. Вот пишутся - очень, при большом кол-ве параметров лучше писать вручную, через StringList.
Хотя параметры игрока лучше писать в бинарном виде, записями, как тут и советовали.
Из ini можно сразу читать integer, без всяких последующих переводов:
expa:=MyIni.ReadInteger("save","expa",0);
Внутри всё равно выполняется преобразование.
А если там уже сделано всё через ООП ( TPlayerStats = class (TObject) )
Тогда ещё можно писать RTTI - хоть в бинарном, хоть в текстовом виде. Хотя это тоже не очень быстро, скорее всего.
← →
asm (2004-05-23 11:48) [20]на нажатие Button1
begin
ChangeAll(p1, p2, ...); // все меняет
end;
procedure ChangeAll(p1, p2, ...);
begin
ChangeText(..); // меняет текст в мемо
ChangeDescr(..); // меняет характеристики
end;
а дальше, чтобы без кейсов, текст можно читать из файла, определяя смещение по параметру какому-нибудь. или брать из массива, номер элемента также по параметру определяя.
примерно то же c характеристиками. как именно, сложно сказать, ничего не зная.
← →
wiz © (2004-05-23 12:03) [21]2 kas-t: см post [19]... и сам подумай что сказал.
2 Sapersky: про ООП я только имел ввиду, что если TPlayerStats = class (TObject), то нельзя сделать f:file of TPlayerStats; придётся делать всё ручками (через указатель+смещение). Что я обычно и делаю.
---
...здесь был Красный Космический Гонобобель
← →
хм © (2004-05-23 12:17) [22]>2 Sapersky: про ООП я только имел ввиду, что если TPlayerStats >= class (TObject), то нельзя сделать f:file of TPlayerStats; >придётся делать всё ручками (через указатель+смещение). Что я >обычно и делаю.
Только надо добавить, что данный способ не подходит для объектов с полями-указателями и длинными строками.
← →
wiz © (2004-05-23 12:29) [23]2 хм: ну я вроде сказал, что это для статических структур...
← →
Ландграф Павел © (2004-05-23 13:37) [24]Н-да.. а начиналось как смотрю все с проблемы сохранения:) а зачем ты делаешь сохранение, вот мне интересно, если еще как акацца ничего вообще ненакодино?!
← →
TransparentGhost (2004-05-24 10:34) [25]Vse peremennije, kotorije nuzhno sohranit" ob"javljajesh podrjad, a pri sohranenii cherez WriteBlock s ukazanijem adresa pervoj peremennoj i kol-vo - obshij razmer vseh peremennih kotorije nuzhno sohranit". Tochno tak zhe i vizivat" cherez BlockRead.
Takim obrazom mozhno obojtis" i bez "Record". Hotja smisl tot zhe.
← →
Onanim (2004-05-24 11:38) [26]В ОРЕШНИК ЕГО!!!
← →
TransparentGhost (2004-05-24 11:40) [27]V ternovnik :o)
← →
Дм (2004-05-25 09:06) [28]Удалено модератором
← →
cdadmitriy © (2004-05-27 12:14) [29]Можно исползовать
Var Ini:TMemIniFile; Begin
Ini:=TMemIniFile.Create (CurProgDir+"\"+NameIniFileParam);
With CommP do Begin
Ini.EraseSection(SectionEcrParam);
Ini.WriteInteger(SectionEcrParam,"Rsn1",ECR.Rsn1); Ini.WriteInteger(SectionEcrParam,"Rsn2",ECR.Rsn2);
Ini.WriteInteger(SectionEcrParam,"Tsn1",ECR.Tsn1); Ini.WriteInteger(SectionEcrParam,"Tsn2",ECR.Tsn2);
End;
Ini.UpdateFile; Ini.Free;
НО при больших ( размер ) данных скорость записи чтения не годится
я исползую BLOB поля в DB Paradox
← →
Подкрадуха © (2004-05-29 17:28) [30][4]...
Несмотря на ухмылки и насмешки других, я понял, что ты имел ввиду, говоря про профуровень.
Сам пытался сделать всё "на профуровне" - хотел даже начать со своего абстрактного класса и выписать героя с нуля, подумывал о своей серверной игровой и клиентской компоненте =) Но жизнь оказалась проще... И чем больше ты раздумываешь над красотой - тем меньше напишешь кода. Тогда, плюнув на всё, я взялся за старые добрые записи.
Вот что получилось...
Но сначала немного о том как это работает...
С клиента приходит на сервер запрос, сервер анализирует его и возвращает параметры героя на данный момент или ошибку.
Итак...
////////////////////////////////////////
// используется старый TServerSocket //
////////////////////////////////////////
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp;
type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Analizator;
{$R *.dfm}
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.SendText(CheckCommand(Socket.ReceiveText));
end;
end.
Теперь сам файл Analizator.pas...
unit Analizator;
interface
uses
Windows, Classes;
type
THero = record
ch00: PChar; //ник
ch01: Cardinal; //цифровая ссылка на ник (unixtimestamp)
ch02: Real; //склонность
// 0 - нет склонности
// 0.5 - нейтрал
// 1-1.99 - Белое Братсво
// 2 - хаос
// 3 - Тёмное братство
// 4 - Серое Братство (зарезервировано)
// 99 - Истинный Хаос
// 100 - Ангел
ch03: Byte; //знак зодиака (от 1 до 12)
ch04: Integer; //клан
ch05: Byte; //уровень чара
ch06: Integer; //количество НР на момент последнего доступа к инфе
// ...и ещё около 70 параметров...
end;
procedure SaveHero(h: THero);
function ReadHero(name: String): THero;
function CheckCommand(cmd: String): String;
function HeroNew(nick: PChar; email: PChar; psw: PChar; realname: PChar; birtday: PChar; sex: PChar;
realcity: PChar; icq: PChar; homepage: PChar; deviz: PChar; color: PChar; hobby: PChar): String;
implementation
procedure SaveHero(h: THero);
var
f: file of THero;
begin
assignfile(f, h.ch00 +".txt");
rewrite(f);
write(f, h);
closefile(f);
end;
function ReadHero(name: String): THero;
var
f: file of THero;
h: THero;
begin
assignfile(f, name +".txt");
reset(f);
read(f, h);
closefile(f);
Result := h;
end;
function CheckCommand(cmd: String): String;
var
str: String;
sl: TStringList;
begin
sl := TStringList.Create;
sl.SetText(PChar(cmd));
str := sl.Strings[0];
if str = "/register" then Result := HeroNew(PChar(sl.Strings[1]), PChar(sl.Strings[2]), PChar(sl.Strings[3]),
PChar(sl.Strings[4]), PChar(sl.Strings[5]), PChar(sl.Strings[6]),
PChar(sl.Strings[7]), PChar(sl.Strings[8]), PChar(sl.Strings[9]),
PChar(sl.Strings[10]), PChar(sl.Strings[11]), PChar(sl.Strings[12]));
if str = "/join" then Result := "ERR000" //ERR000 - значит, такой команды пока не существует в игре,
//после её отправки сервером - сервер отключает клиента
else Result := "ERR000";
sl.Free;
end;
function HeroNew(nick: PChar; email: PChar; psw: PChar; realname: PChar; birtday: PChar; sex: PChar;
realcity: PChar; icq: PChar; homepage: PChar; deviz: PChar; color: PChar; hobby: PChar): String;
// создание героя,
// вместо "/register Nick Email Psw RealName Birtday Sex RealCity ICQ Homepage Deviz Color Hobby"
// вместо пробелов использовать #10#13 (TStringList!!!)
var
h: THero;
begin
with h do
begin
ch00 := nick;
ch01 := GetTickCount; // неправильно, но пока сойдет и так
// ...тут опять очень много полей, заполняемых на основе полученных данных
end;
SaveHero(h);
Result := "список всех полей героя через #10#13, типа как для стринглиста";
end;
end.
Ну вот вроде и всё, всё лишнее вроде бы поудалял.
З.Ы. Это фрагмент был из игры "Combats Offline", по мотивам Великого Бойцовского Клуба ;-)
Удачи!
← →
имя (2004-05-31 10:39) [31]Удалено модератором
← →
$HUR!K (2004-06-14 06:43) [32]Млин! Шоб я так жил!
Только начинающий программер озадаченно почесал макушку - так сразу вокруг него консилиум из десятка бородатых хацкеров :)
А на счет сейвгейма для новичка - по-мойму проще так:
procedure save;
var
f:textfile;
begin
assignfile(f,"save"); rewrite(f);
save(f,live);
save(f,bax);
save(f,condoms);
save(f,hrenznaetchto);
closefile(f);
end;
← →
Evgeniy_K (2004-06-14 10:48) [33]Ини - лажа, не верь им, он не может быть тяжелее 64 Кб. Если хочешь сохранять игру, то работай с файлами:
var
f: TextFile;
AssignFile(f, "<FileName>");// <FileName> - имя файла
Reset(f);// - открыть файл на чтение
Rewrite(f);// - перезаписать файл
Append(f);// - дописать в файл с конца
CloseFile(f);// - закрыть файл
Писать в файл:
writeln(f, VARIABLE);// - где VARIABLE - переменная или значение
Читать из файла:
readlnln(f, VARIABLE);// - где VARIABLE - переменная
//"ln" - переходить или нет на след. строку
Учи ObjectPascal!
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.032 c