Форум: "Игры";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Внизработа над RPG Найти похожие ветки
← →
TButton (2003-04-06 20:52) [0]собсна вопросов возникает куча определенного ответа на них у меня покамест нету.
например
-как реализовать шмотки. создать record в котором собраны все возможные параметры или как-то еще.
-как реализовать разл. воздействие на чара. Например отравление или наркотики (сначала +++ потом ------)
-как лучше реализовать самого чара.
и подобные. если у кого есть мысли - пишите, обсудим.
← →
Плохой человек (2003-04-06 20:58) [1]> как реализовать шмотки. создать record в котором собраны все возможные параметры или как-то еще.
Наверное, record подойдёт вполне.
> как реализовать разл. воздействие на чара. Например отравление или наркотики (сначала +++ потом ------)
Менять технические данные чара из того же record. Всё это лучше сделать в методе чара, или, если не ООП, то функция.
> как лучше реализовать самого чара.
Лучше ООП, т.е. с возможностью наследования, с методами и свойствами объекта. Так правильнее, но кому как.
Это общие принципы, вроде бы они понятны, но когда доходишь до деталей, то начинается самое плохое.
← →
TButton (2003-04-06 21:18) [2]2 Плохой человек
а теперь представь что в один рекорд записаны все возможные параметры шмоток. я попробовал у меня получилось более 25... не то чтоб очень много, но...
вспомнил еще один ньюанс. (чтоб было понятнее представьте себе Фалаут, чтоб не было противно - Фалаут2) есть навыки и книги которые увеличивают... эт стал быть если у меня етих навыков(абилитей, perc"ов) с пол сотни, мне все эти пол сотни прописывать в книге? а если вспомнить что книга - тоже предмет. жуткая картина представляется...
← →
Плохой человек (2003-04-06 22:33) [3]2 TButton:
Да, прописывать. Используя вложенные записи, типа:
type TSpells = record
Magic: TMagic;
Material: TMaterial;
end;
type TSkills = record
Speed: Integer;
Armor: Integer;
Science: Integer;
end;
type TBook = record
Spells: TSpells;
Skills: TSkills;
Other: TOther;
end;
Конечно же, использовать множества, массивы и прочее.
← →
TButton (2003-04-06 22:48) [4]гыыы.... мдаа... а вобщем-то я так и делал...
(!) Идейку мне подкинули: офыормить это все текстом типа инифайла. тогда получается маленький объект
private
info:TStringList;
public
procedure SaveToFile(filename: string);
procedure LoadFromFile(filename: string);
function GetValue(section, name: string): string;
procedure WriteValue(section, name, value: string);
end;
нужно правда еще кой-чо под латать, но в целом идея неплохая...
← →
cyborg (2003-04-07 09:34) [5]Ой... только не делай ты хранение параметров героя и прочих в файлах, это не игра будет, а большой своп-файл, куда не ткнёшь шуршать начнёт.
← →
TButton (2003-04-07 09:57) [6]2 cyborg ©
почему сразу в файлах! в опреативе просто ввиде стринглиста. луд и сэйв шоб грузить и сохранять чара и шмотки.
← →
cyborg (2003-04-07 10:56) [7]Что такое чара? :)
← →
jel (2003-04-07 12:12) [8]Сдается мне, что задача как раз для классического ООП. Например создать класс базовой шмотки у которой есть например вес и картинка и от него наследовать всяческие зелья, оружие, книги. Проще будет, чем универсальную record разрабатывать. А если потом добавить что придется?
← →
mmmh (2003-04-07 20:50) [9]шмотки в принцип просто Создаем ддл с кучей шмоток, и вытаскиваем... например в imagу
2 данные лучше в начале загружать в массив из файла....
по закрытию сохранять.........
Воздействие на чела так
создаем таймер, enabled:=true( после пременения) в нем описываем сначала +++ а потом --- и enabled:=false
Рекорды в принципе не люблю...........
Вообщем когда-то писал подобное
← →
TButton (2003-04-08 01:23) [10]так это еще и таймер создавать? рун-тайм? и обработчик для него тоже рун тайм? я думал примерно так: у зелья есть длительность и сила воздействия, поэтому к чару надо добавлять структурку типа динамического массива с применеными на него зельями (сила воздействия и скока времени осталось)
2 jel ©
т.е. создать класс TThing, а от него все остальные. а инвентарь тогда можно сделать просто в виде массива inv:array of TThing?
← →
jel (2003-04-08 09:21) [11]
> 2 jel ©
> т.е. создать класс TThing, а от него все остальные. а инвентарь
> тогда можно сделать просто в виде массива inv:array of TThing?
Можно массив, а можно и коллекцию - там ведь уже почти все что нужно реализовано. А по поводу зелий всяческих к герою можно привинтить коллекцию модификаторов и для каждого хранить время жизни. Тогда при тиках основного таймера игры это время жизни можно уменьшать и при достижении 0 снимать эффект.
← →
TButton (2003-04-08 09:52) [12]
>к герою можно привинтить коллекцию модификаторов и для каждого
>хранить время жизни. Тогда при тиках основного таймера игры это
>время жизни можно уменьшать и при достижении 0 снимать эффект.
я об этом собсна и говорил
>а можно и коллекцию - там ведь уже почти все что нужно
>реализовано
лучше - массив :). и не важно что кое-что придется переписывать. когда сделал сам:
1. все гораздо понятнее
2. всегда можно модифицировать
← →
TButton (2003-04-09 20:14) [13]и все-таки, реально ли сделать так
type
TThing=object
...
end;
TGun=object(TThing)
( TThing)и все-таки, реально ли сделать так
type
TThing=object
...
end;
TGun=object(TThing)
...
end;
TKey=object(TThing)
...
end;
...
inv:array[1..10] of TThing;
gun1:TGun;
key1:TKey;
...
inv[1]:=key1;
inv[2]:=gun1;
...
← →
TButton (2003-04-12 20:58) [14]попытался воспроизвести эту структуру... не работает. TKey(inv[1]) вызывает Invalid Typecast
← →
Juster~ (2003-04-12 21:34) [15]а я то думал, это я один, дурак, тут по выходным шастаю...
← →
TButton (2003-04-13 00:47) [16]а вот!
← →
TButton (2003-04-13 09:57) [17]и все таки, если есть у кого солюшен данной траблы, пожалста отметьтесь.
← →
TButton (2003-04-14 17:31) [18]А надысь возник еще один вопрос, как всю эту динамическую муть сохранить в файлик? т.е. объек персоонажа включает в себя несколько динамических массивов, но иногда этот объект надо сохранять... а потом еще и загружать... вот...
← →
neuro (2003-04-14 17:54) [19]Вас спасет ООП и сериализация.
← →
cyborg (2003-04-14 18:06) [20]Сделай простую запись. В ней все возможные волшебства, например:
TThing = record
ID ( шапка, кольцо, меч и т.д.)Сделай простую запись. В ней все возможные волшебства, например:
TThing = record
ID : Cardinal; //Идентификационный номер вещи
ThingType : Cardinal; //Тип вещи (шапка, кольцо, меч и т.д.)
Strong : Byte; //Текущее значение поломанности
MaxStrong : Byte; //Максимальное значение крепкости предмета
Ice : Byte; //Холод
Fire : Byte; //Огонь
... и т.д. все возможные магические значения
end;
Если значение, например, холода больше нуля, то эта вещь имеет магию холода. А смотря что за вещь, эта магия используется по назначению, если меч, то наносить повреждение холодом, если щит, то прибавить защиту от холода. Мысль ясна?
← →
TButton (2003-04-15 18:33) [21]2 cyborg ©
Да. спасибо. будем думать.
значит по части шмоток решение "пихать все свойства в один объект" приплюсовать тип и в зависимости от типа выбирать нужные свойства.
А как насчт сохранения динамических массивов? с учетом того что ети массивы - часть сложной структуры?
← →
cyborg (2003-04-15 19:00) [22]По сохранению, в начале пишешь кол-во записей, затем эти записи читаешь.
← →
TButton (2003-04-16 17:47) [23]2 cyborg ©
т.е. я так понял надо писать офигенно сложные процедуры сохранения и загрузки?
← →
cyborg (2003-04-16 20:59) [24]Нет, ты не понял, сложного ничего нет, если знаешь размер данных и их кол-во, из этого следует, что нужно писать размер и кол-во данных в файле, затем уже сами данные.
← →
cyborg (2003-04-16 21:06) [25]Главное, что ты должен понять, что Strings.SaveToFile(); - это не есть программирование, выходов у тебя даже два - либо TFileStream, либо File.
Ничего сложного нет, главное попробуй, а потом само понравится ;).
← →
Dabus (2003-04-17 00:50) [26]Вообще шмотки реально РЕАЛИЗОВАТЬ ЗА БАБКИ.
А как я вижу, во многих играх люди делают обычые таблицы и обычные базы данных. В коих всё и хранят.
← →
TButton (2003-04-17 21:01) [27]2 cyborg ©
нет... ну я может тупой ;), но не до такой же степени, чтоб не знать как файлы сэйвить... я это к тому что процесс будет шибко геморойный... кстати, можно про TFileStream по подробнее...
← →
cyborg (2003-04-17 22:09) [28]
Var
FileStream : TFileStream;
...
FileStream := TFileStream.Create("FileName",fmOpenReadWrite);
FileStream.Seek(Номер позиции откуда читать,soFromBeginning);
FileStream.ReadBuffer(Адрес куда писать,Кол-во читаемых байт);
FileStream.Free;
Набери в Дельфи TFileStream и нажми Ctrl+F1 тебе расскажут.
← →
cyborg (2003-04-17 22:13) [29]Верней адрес куда читать, ошибся, имел ввиду куда данные из файла писать. :)
← →
Плохой человек (2003-04-17 22:38) [30]Да, ещё можно попробовать FormSaver для сохранения вида формы помимо значений переменных.
← →
TButton (2003-04-18 21:34) [31]2 cyborg ©
угумс... значится сперва создаем переменную типа файл, открываем для записи, пишем общую инфу, пишем количество шмоток, перечисляем шмотки, пишем количество модификаторов, перечисляем модификаторы... а какой тип файла должен быть, т.е. file of... или просто file? и вообще это реально в файл писать переменные разных типов? и если да то как (если не затруднит разъяснить, просто раньше не сталкивался с такой проблемой)?
← →
cyborg (2003-04-19 17:30) [32]Для типизованных файлов делаешь file of ..., для файлов в которых много чего хранится делаешь просто File и читаешь BlockRead(), пишешь BlockWrite().
Если у тебя файл из одинаковых данных, то делай типизованный, так удобней, если много чего в файле будет, то нетипизованный.
← →
TButton (2003-04-20 23:45) [33]я заранее прошу не бить меня по голове. это текст процедурки для загрузки персоонажа, если есть предложения по модернизации - пишите...
procedure THeroList.LoadHero(filename: string);
var
f:file;
header:TFileHeader;
hero:THero;
res:integer;
i,n:integer;
begin
if not fileExists(filename) then Exit;
AssignFile(f,filename);
Reset(f,1);
BlockRead(f,header,sizeOf(header),res);
if header.description<>"onLine hero save file" then
begin
CloseFile(f);
Exit;
end;
// loading info
BlockRead(f,hero.info,sizeOf(THeroInfo),res);
// loading wear
BlockRead(f,hero.wear,sizeOf(THeroWear),res);
// loadind inventory
// loading things
BlockRead(f,n,sizeOf(integer),res);
SetLength(hero.things,0);
for i:=1 to n do
begin
SetLength(hero.things,High(hero.things)+2);
BlockRead(f,hero.things[i-1],sizeOf(TThing),res);
end;
// loading potions
BlockRead(f,n,sizeOf(integer),res);
SetLength(hero.potions,0);
for i:=1 to n do
begin
SetLength(hero.potions,High(hero.potions)+2);
BlockRead(f,hero.potions[i-1],sizeOf(TPotion),res);
end;
// loading books
BlockRead(f,n,sizeOf(integer),res);
SetLength(hero.books,0);
for i:=1 to n do
begin
SetLength(hero.books,High(hero.books)+2);
BlockRead(f,hero.books[i-1],sizeOf(TBook),res);
end;
// loading papers
BlockRead(f,n,sizeOf(integer),res);
SetLength(hero.papers,0);
for i:=1 to n do
begin
SetLength(hero.papers,High(hero.papers)+2);
( f,hero.papers[i-1],sizeOf(TPaper)я заранее прошу не бить меня по голове. это текст процедурки для загрузки персоонажа, если есть предложения по модернизации - пишите...
procedure THeroList.LoadHero(filename: string);
var
f:file;
header:TFileHeader;
hero:THero;
res:integer;
i,n:integer;
begin
if not fileExists(filename) then Exit;
AssignFile(f,filename);
Reset(f,1);
BlockRead(f,header,sizeOf(header),res);
if header.description<>"onLine hero save file" then
begin
CloseFile(f);
Exit;
end;
// loading info
BlockRead(f,hero.info,sizeOf(THeroInfo),res);
// loading wear
BlockRead(f,hero.wear,sizeOf(THeroWear),res);
// loadind inventory
// loading things
BlockRead(f,n,sizeOf(integer),res);
SetLength(hero.things,0);
for i:=1 to n do
begin
SetLength(hero.things,High(hero.things)+2);
BlockRead(f,hero.things[i-1],sizeOf(TThing),res);
end;
// loading potions
BlockRead(f,n,sizeOf(integer),res);
SetLength(hero.potions,0);
for i:=1 to n do
begin
SetLength(hero.potions,High(hero.potions)+2);
BlockRead(f,hero.potions[i-1],sizeOf(TPotion),res);
end;
// loading books
BlockRead(f,n,sizeOf(integer),res);
SetLength(hero.books,0);
for i:=1 to n do
begin
SetLength(hero.books,High(hero.books)+2);
BlockRead(f,hero.books[i-1],sizeOf(TBook),res);
end;
// loading papers
BlockRead(f,n,sizeOf(integer),res);
SetLength(hero.papers,0);
for i:=1 to n do
begin
SetLength(hero.papers,High(hero.papers)+2);
BlockRead(f,hero.papers[i-1],sizeOf(TPaper),res);
end;
// loading skills
BlockRead(f,hero.skills,sizeOf(TSkills),res);
// and something else
BlockRead(f,hero.exp,sizeOf(integer),res);
BlockRead(f,hero.resources,sizeOf(TResources),res);
BlockRead(f,hero.online,sizeOf(boolean),res);
BlockRead(f,hero.offLineTime,sizeOf(integer),res);
BlockRead(f,hero.status,sizeOf(integer),res);
BlockRead(f,hero.minutes,sizeOf(integer),res);
CloseFile(f);
end;
← →
cyborg (2003-04-21 09:39) [34]Покажи что такое hero без него непонятно зачем SetLength делается.
Сделай
Try
AssignFile(f,filename);
Reset(f,1);
...
Finally
CloseFile(f);
end;
← →
TButton (2003-04-21 14:49) [35]а Hero:THero ето собсна наш герой и есть...
а try...finaly это обязалово? в смысле я ведь проверяю файл на предмет существования...
← →
cyborg (2003-04-21 17:29) [36]То, что Hero - герой я понял, а вто что такое potions, books и прочие которым ты делаешь SetLength этого я незнаю.
Что значит обязалово, ты на 100% уверен что твой файл не будет испорчен, пустым или неправильно сделанным?
← →
TButton (2003-04-21 18:33) [37]potion зелья
books книги
papers свитки
info ( сила, ловкость...) potion зелья
books книги
papers свитки
info инфа (сила, ловкость...)
wear надетые шмотки
things шмотки в кармане
skills навыки
...вот... помоему все...
а кстати я чот-не помню чтоб диабла чо-то проверяла, когда у меня вирусы по лабудили сэйвы... она помнится молча послала меня в ВЦ и все...
← →
cyborg (2003-04-21 19:11) [38]1) И что, что potion это зелья, мне это ни о чём не говорит, я от тебя уже пол дня жду описание твоего Hero, а ты всё филосовствуешь.
2) Из этого следует, что файл закрывать необязательно?
← →
TButton (2003-04-22 07:14) [39]
unit Hero;
interface
uses things, skills;
type
THeroInfo = record
// характеристики
st:integer; // сила
dx:integer; // ловкость
iq:integer; // ум
en:integer; // endurance - выносливость
lk:integer; // удача
ws:integer; // мудрость
// свойства
hp:integer; // хиты (en+st)
dr:integer; // сопротивление удару (dx)
mn:integer; // mana (ws)
eb:integer; // expirience bonus (iq)
cc:integer; // critical chance (lk)
md:integer; // meele damage (st)
mw:integer; // max weight (st)
ap:integer; // action points (dx)
// persoonal
name:string[32];
blocked:boolean;
end;
THeroWear = record
helm,
amul,
body,
glov,
lhnd,
rhnd,
belt,
boot:TThing;
ring:array[1..6] of TThing;
end;
THero = object
// info
info:THeroInfo;
// wear
wear:THeroWear;
// inventory:
// things
things:array of TThing;
// potions
potions:array of TPotion;
// books
books:array of TBook;
papers:array of TPaper;
// skils
skills:TSkills;
exp:integer;
// resources
resources:TResources;
// additional
online:boolean;
offLineTime:integer; // unLoad hero after 1024 minutes of offLine
status:integer; // status - very usefull thing
minutes:byte; ( перечислены ранее)
unit Hero;
interface
uses things, skills;
type
THeroInfo = record
// характеристики
st:integer; // сила
dx:integer; // ловкость
iq:integer; // ум
en:integer; // endurance - выносливость
lk:integer; // удача
ws:integer; // мудрость
// свойства
hp:integer; // хиты (en+st)
dr:integer; // сопротивление удару (dx)
mn:integer; // mana (ws)
eb:integer; // expirience bonus (iq)
cc:integer; // critical chance (lk)
md:integer; // meele damage (st)
mw:integer; // max weight (st)
ap:integer; // action points (dx)
// persoonal
name:string[32];
blocked:boolean;
end;
THeroWear = record
helm,
amul,
body,
glov,
lhnd,
rhnd,
belt,
boot:TThing;
ring:array[1..6] of TThing;
end;
THero = object
// info
info:THeroInfo;
// wear
wear:THeroWear;
// inventory:
// things
things:array of TThing;
// potions
potions:array of TPotion;
// books
books:array of TBook;
papers:array of TPaper;
// skils
skills:TSkills;
exp:integer;
// resources
resources:TResources;
// additional
online:boolean;
offLineTime:integer; // unLoad hero after 1024 minutes of offLine
status:integer; // status - very usefull thing
minutes:byte; // every 4 minutes add 1 to status
public
end;
implementation
end.
это Hero... думаю достаточно... остальные классы (перечислены ранее) описывают разного рода шмотки...
и еще у меня трабла возникла когда я пытаюсь создать массив героев (pop:array of THero;), а потом присвоить какому-то элементу переменную типа THero - возникает внутренняя ошибка компилятора. насколько я понял это происходит из-за того что THero содержит динамические массивы и прога не знает сколька памяти выделять... вот сижу... мыслю чо мне с этим делать... есть вариант вернуться к истокам, когда на каждый тип шмоток было ограничение по количеству, т.е. размер массива был предопределен...
← →
cyborg (2003-04-22 11:52) [40]В общем вот тебе мой совет, чтобы было меньше мороки делай обычные фиксированные массивы как ты и мыслишь :), всё равно ведь у тебя будет ограничение на носимые предметы.
А для данных неизвестных размеров пользуй GetMem FreeMem New Dispose.
По поводу массива героев, думаю ты обращаешься к пустому массиву поэтому вылетает ошибка ацесвиолатион.
Страницы: 1 2 вся ветка
Форум: "Игры";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.045 c