Меню сайта
Форма входа

Категории раздела
Уроки по созданию игр [38]
Программирование игр разной сложности
Игровые алгоритмы [24]
Алгоритмы, которые уже реализованы для разных жанров игр
Графика [5]
Учимся работать с графикой в Делфи
Мультимедиа [3]
Работа с мультимедийными возможностями Делфи
Другие статьи [18]
Статьи не вошедшие не в один из разделов
Ошибки [4]
Всевозможные ошибки и пути их решения
Четверг, 16.05.2024, 20:13
Приветствую Вас Гость

Статьи по программированию

Главная » Статьи » Уроки по созданию игр

Урок 27. Магические предметы

Урок 27. Магические предметы

Магические предметы.
Научим персонажа-мага владеть магическими предметами. Для большего интереса магия  для использования будет доступна только классу магов. Предметы будут для существующих заклинаний, только для их использования не потребуегся манны. Пусть также некоторые предметы будут представлять собой магические жезлы, отличающиеся "многозарядностью" - возможностью неоднократного использования заклинаний. То есть если пузырек с волшебной жидкостью может быть использован только раз, то жезл исцеления позволит выполнить такую процедуру раз пять или более раз.
Для реализации этой концепции введем новый тип предметов - "магический предмет".

Туре TGameItemType=(itemHandWeapon,   itemArmor, ItemAmmo, ItemRangedWeapon, itemMagik,    itemNone);

Const HasItemTypes=7;
ItemTypes:array [1..MaxItemTypes] of TGameltem =
(


…:=ItemMagik;
…MagikItem;
Const=(0, 0, 0, 0, 0,  0, 0, 0   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) ;
Reals:.   (0, 0, 0?0, 0, 0, 0, 0, 0, 0, 0, 0, 0, .0, 0, 0, 0, 0,-0, 0) )
) ;

А сейчас мы попробуем вместить в одну запись массива ItemTypes описане целой группы игровых предметов. Для этого можно воспользоваться свойством hits, трактуя его разные элементы как различные смысловые описатели (своеобразный встроенный микроязык программирования). 11усть первый элемент этого массива Ints будет в свою очередь обозначать подтип-идентификатор конкретного магического предмета. Вот какими могут быть его значения (оформляем их в виде констант):

const
mintStorm =   1;
mintHealing  =   2;
mintStormStf =  3;
mintHealingStf  =   4;
mintMax  =   4;

Чтобы стало понятнее, что же эти константы обозначают, введем в модуле Texts их описание:

mintMax  =   4;
MagikltemsName: array[1..mintMax] of string[40] =
(
'Кристалл  вызова Огненного Шторма','Зелье Лечения',
'Жезл Огненного Шторма' , '   Посох Исцеления '
);

Константа mintMax - это общее число подтипов магических предметов. Первые два элемента - это разовые версии заклинаний, два последних - миогозарядные. Будем указывать их непосредственно в момент генерации предметов на карте. Кроме того, надо определить, какие элементы (какие индексы) массива Ints какую информацию хранят:

intMagikType = 1;
intMagikNum =  2;

Первый элемент массива - идентификатор подтипа предмета, второй - число зарядов. Все магические предметы будем обозначать новым символом ';':

const ItemRecords:   array[TGameltemType]   of  TTileRecord =
(
(C:    '    +    '    ;    Clr:LightCyan),
(C:    '    [    '    ;    Clr:LightGreen),
(C:    *    |    '    ;    Clr:LightCyan),
(C:    '    {    '    ;    Clr:LightGreen),
(C:    '    ;    '    ;    Clr:LightCyan),
(C:    '    '    ;    Clr:Black)
);

Создание магического предмета будет происходить в процедуре генерации карты

if n   <= Maxltems   then begin
Items[n]    :=  ItemTypes[random(MaxItemTypes)+1] ;
Items[n].x   := x;
Items[n].у   :=   у;

if   Items[n].ID =  7   then
begin
Items[n].Ints[intMagikType] := random(mintMax)+1;
case Items[n].Ints[intMagikType] of
mintStormStf : Items[n].Ints[intMagikNum] : = 5;
mintHealingStf: Items[n].Ints[IntMagikNum] := 10;
else Items [n] . Ints [intMagikNum]:=1;
end;
end;

То есть если тип предмета - магический (ID=7), то его подтип формируется случайно, а затем определяется число "зарядов" - от 5 до 10 для жезлов и посохов, и единица для новых предметов.
Кроме того, нам надо будет уточнить функцию GetllemNamе для нового типа магических предметов, так как одно словосочетание "Магический предмет" будет совершенно информативно. Показывать станем название подтипа предмета из массива MagikltemsName, дополняя его оставшимся числом "зарядов" заклинания - числом попыток его использования:

function  GetltemName (Itm:   TGameltem) :   string;
begin
сase   Itm.IType  of
itemAmmo:   GetltemName   :=   
Itm.Name   +   '    (    ' . nLToStr(Itm.Ints[intAmmo])+   '    )    '    ;
itemRangedWeapon:GetltemName:=
Itm.Name  + 1    (    '   +IntToStr(Itm.Ints[intRangedAmmo])+ ' )';
itemMagik:   
begin
CotltemName:= MagikltemsName[Itm.Ints[intMagikType]] +
' ('   +IntToStr(Itm.Ints[intMagikNum])+   '    ) ';
end;
else  
GetltemName   :=   Itm.Name
end;
еnd;

Теперь нам надо научиться предмет использовать. Пусть он "используется", когда мы выбираем его в инвентаре. Для этого дополним процедуру ShowHeroItems по работе с ни и гарем строчкой вызова пока несуществующей функции UseMagikltem, которая "попробует" предмет на магичность и лишь в противном случае передаст управление ныне:

if   n   >   0   then
begin
If Heroes[CurHero].Items[n].IType = itemAmmo then
begin
if Heroes[CurHero].Slots[slotHands].IType = itemRangedWeapon then
begin
Heroes[CurHero].Slots[slotHands].Ints[intRangedAmmo]:=
Heroes[CurHero].Slots[slotHands].Ints[intRangedAmmo]+
 Heroes[CurHero].Items[n].Ints[intAmmo];
Heroes[CurHero].Items[n].IType := itemNone;
End;
end
else
if not UseMagikltem(n) then
begin
S := GetFreeSlot(Heroes[CurHero],Heroes[CurHero].Items[nj);
if s > 0 then
begin
Heroes[CurHero].Slots[s]:=Heroes[CurHero].Items[n];
Heroes[CurHero].Items[n].IType:= itemNone;
end;
end;   

Эту функцию, к интерфейсу уже напрямую не привязанную, реализуем в модуле Magik.

function UseMagikItem(ni: Integer): Boolean;
begin
UseMagikltem := false;
if Heroes[CurHero].Items[ni].IType <> itemMagik then Exit;
end;

Далее просто вызовем соответствующее заклинание, только не затрагивая запас маны, после чего понизим число "зарядов" предмета. Сейчас заклинания у нас встроены в процедуру ThrowSpell, и по необходимости выделим их в отдельные подпрограммы:

procedure  ThrowSpell;
var   n:   Integer;
begin
case  n  of
splFireStorm:
MakeFireStorm;
splSelfHealing: MakeHealing;
end;

Новые процедуры:

procedure MakeFireStorm; var n,x,у,dam: Integer;
f: Boolean;
begin
f := false;
for x := Heroes[CurHero].x-1 to Heroes[CurHero].x+1 do
for у := Heroes[CurHero].y-1 to Heroes[CurHero].y+1 do
begin
n := IsMonsterOnTile(x,y); if n > 0 then
begin
dam := random(4)+l;
HeroAttackFin(Heroes[CurHero],n,dam);
f := true;
end;
end;
if f then
MonstersStep;
end;

procedure  MakeHealing;
begin
dec(Heroes[CurHero].Mana); IncHP(Heroes[CurHero],   +1);
Showlnfo(STR_SELFHEALING);

end;

Просто выделена часть, ответственная-за реализацию огненного шторма и исцеления. Ее мы будем вызывать при выборе соответствующего предмета:

case Heroes[CurHero].Items [ni].Ints[intMagikType] of
mintStorm,   mintStormStf:
begin
MakeFireStorm;
mintHiling,   mintHealingStf:
begin
MakeHealing;
End;
End;


Надо будет снизить число использований предмета и в ряде случаев - удалить предмет из инвентаря:

…Heroes[CurHero] . Items Lni] . Ints [intMagikNum] ) ;
Heroes[CurHero].Items[ni].Ints[intMagikNum]<=0   then
Heroes[CurHero].Items[ni].IType:=itemNone;

Эту часть механизма игры, ответственную за магию, будем считать законченной. Что далее? Торговля!

 

Источник: delgame.at.ua

Категория: Уроки по созданию игр | Добавил: Armageddets (07.04.2014) | Автор: Урок 27. Магические предметы
Просмотров: 1060 | Теги: программирование игр, паскаль, магические предметы, программирование, магия, создание рпг игры на делфи | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Какие уроки по созданию игр Вам удобнее?
Всего ответов: 141
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0