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

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

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

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

Урок 25. Магия – начинаем


Урок 25. Магия
– начинаем



 



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



Добавим персонажу две новые характеристики - по аналогии
с уровнем здоровья, Ма
nа и МахМаnа:



 



type  THero
=  record



Chars   :   array[1..MaxChars]   of  
Integer;



Skills:   array[1..MaxSkills]   of 
Integer;



Items   :   array[1..MaxHeroIterns]   of TGameltem;



Slots   :   array[1..MaxSlots]   of TGameltem;



x,y,



HP,   MaxHP,



Mana, MaxMana,



EXP,MaxExp,



level,   VisLong:  
Integer;



Class,   Race:  
Integer;



Name:   String[20];



end;



 



Магия должна формироваться и расти вместе с
показателями здоровья, хотя для некоторых характеристик (в нашем случае - для
класса воина) способность к магии должна быть запрещена, так требуют
классические ролевые системы. А у стрелка она должна быть развита. В ходе анализа
соответствующего кода мы выясним, что у нас пока не реализована магия и здоровье
для персонажей разных классов. Для уровня здоровья задействован один из
HP_Level_Table, в котором нет дополнительного деления на классы
(впрочем, он создан когда о классах мы еще не задумывались). Давайте такое дополнение
введем:



 



Const Hplevel_Table:   array



[classWarrior..classMage, 0..MaxPlayerLevel]   of 
Integer  =



(



(10, 20,   30,   50,    80,   
130,   210,   340),



(6, 12,  20,  
30,   50,    100,   
150,   250),



(3,  7,  10,  15,   30,   
50,    100,    175)



);



 



Также заполним модуль Tables и массивом уровней маны в
зависимости от классов:



 



Const ManaLevel_Table:   array



[CassWarrior..classMage,
0..MaxPlayerLevel] of Integer =



(



(0, 0, 0, 0, 0, 0, 0, 0),



(0, 7,  10, 25, 30,
50, 100, 175),



(0, 12,  20, 30, 50, 100, 150, 250)



);



 



Поговорим о местах, которые теперь будут
компилироваться с ошибками, нам надо будет реализовать обращение к массиву
уровней здоровья на уточненный вызов с указанием класса и добавить код работы с
уровнем маны. Часть команд из процедуры InitHero заполним
Hp и MaxHP)
перенесем для удобства в конец GenerateHero, так как теперь нужно знать выбранный
класс героя. Тут же разместим инициализацию уровня маны:



 



While Heroes[curHero]   do



begin



MaxHp:=HPLEVEL_TABLE[Class,Level];



HP:=MAXHP;



Mana:=ManaLEVEL_TABLE[Class,Level];



MaxMana:=Mana;



EXP:=0;



MaxExp:=EXP_Level_TABLE[level];



VisLong:=2;



End;



End;



 



Данные направим и откорректируем в процедуре IncXP (модуль
Него):



 



Procedure IncXP(   var   H:   THero;  
axp:   Integer   );



Begin



…Exp,axp);



…:=Str_ADD_EXP   +   IntToStr
(axp));



if H.Exp > H.MaxExp
then



begin



H.Exp := 0;



 



if H.Level < MaxPlayerLevel
then



begin



Showlnfo(STR_NEXTLEVEL);



inc(H.Level);



end;



H.MaxExp := ExpLevel_Table[H.Level];



H.MaxHP := HPLevelJTable[H.Class,H.Level];



H.MaxMana := ManaLevelJTable[H.Class,H.Level];



H.HP := H.MaxHP;



end;



end;



 



Также добавим строку вывода уровня маны в процедуру
динамического отображения информации о герое Show
HeroInfo:



 



procedure   ShowHeroInfo(HeroNum:   Integer);



begin



TextColor( LightGray );



GoToXY(40, 2);



Write(STR_HERO_HP,Heroes[HeroNum].HP, ' / ' ,Heroes[HeroNum].MaxHP);



GoToXY(40, 3);



Write(STR_HERO_MANA,Heroes[HeroNum].Mana, ' / ' ,Heroes[HeroNum].M



axMana);



GoToXY(40, 4);



Write(STR_HERO_XY,Heroes[HeroNum].x, ' , ' ,Heroes[HeroNum].y);



end; Константа STR_HHRO_MANA:



STR_HERO_MANA =  
'   Мана/Макс.Мана:    '   
;



 



Как мана будет расходоваться? Расходоваться она будет
на заклинания. А заклинания -товар штучный, их сложно уложить в прокрустово
ложе описания структуры. Работа заклинания - процесс оригинальный и будет
реализовываться непосредственно в программном коде.



Для демонстрации возможностей магической системы
создадим два заклинания. Первое, назовем его "Огненный шторм", будет
наносить повреждения от 1 до 4 единиц каждому монстру, находящемуся на любой
соседней с героем клеток, а второе - "Самоисцеление", позволит быстро
восстановить собственное здоровье. За счет маны, конечно. По какому принципу будут
вызываться заклинания? В крупных ролевых проектах список доступных герою
заклинаний формируется постепенно. Например, для этого надо пройти обучение в
школе или у какого-нибудь мастера, учителя. Существует также концепция
"метания заклинаний", когда у героя имеется некий универсальный навык
"метания" -выполнения любого заклинания, и если он срабатывает,
персонаж уже выбирает нужное из списка выученных на данный момент. Далее -
создаем заклинание "Огненный шторм".



 



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

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

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