Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.079 c
3-40818
Man
2003-10-25 15:47
2003.11.13
Как в SQL выгребсти записи с n1 по n2


3-40833
___Nikolay
2003-10-21 11:21
2003.11.13
Почему-то виснет....................................


4-42219
Пубертанец
2003-09-02 17:39
2003.11.13
2 вопроса


1-41586
Василиск
2003-10-27 11:37
2003.11.13
Delphi и Excel (проблема с последним)


1-41684
Peter
2003-10-24 13:58
2003.11.13
Файлы





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