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

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

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

Главная » Статьи » Игровые алгоритмы

Как сделать инвентарь и слоты одежды для персонажа?

Как сделать инвентарь и слоты одежды для персонажа?

 


Разрабатывая игры, в особенности РПГ, возникает необходимость создания рюкзака для артефактов найденных в игровом мире, а также некоторые артефакты и оружие должны иметь возможность надевания на персонажа. Появляется куча вопросов, а как же это все запрограммировать на делфи?

 

Все очень легко и просто. Инвентарь представляет собой набор ячеек, пронумерованных и связанных друг с другом. Слоты для одежды персонажа также представляют собой набор ячеек, но не связанных между собой. В любой игре любые наборы чего-либо реализуются в виде массивов.

 

Массив – это как раз и есть набор отдельных ячеек. А тип этих ячеек определяет тип хранимой информации:

 

·                  String – текстовая информация.

·                  Integer – хранятся целые числа.

·                  Char – в одной ячейке может быть лишь один символ.

·                  Real – хранит дробные числа.

 

Итак, мы разобрались, что данные мы будем хранить в массивах. Теперь определимся с типом данных и размером массивов. Допустим у нашего героя находится рюкзак (инвентарь), рассчитанный на 5 ячеек. Значит и наш массив будет также рассчитан на 5 ячеек. Нумеровать ячейки мы будем с нуля. Информацию мы будем хранить целочисленную. Каждая цифра будет показывать номер вещи, которая лежит в ячейке. Если ячейка пуста – в ячейке хранится цифра ноль.

 

Поэтому первым делом объявляем наш массив для инвентаря:

 

Var

Inventar:array[0..4] of integer;

I:integer;

 

Переменная I необходима, чтобы в цикле обнулить наш массив, так как он пустой. Можно делать это без цикла, но зачем писать больше строчек кода. Обнуляем наш инвентарь:

 

For i:=0 to 4 do

Inventar[i]:=0;

 

Как же теперь добавлять предметы в рюкзак (инвентарь) героя? Заполнение должно происходить при торговле когда мы покупаем артефакты, при нахождении артефактов (вещей) или при других вариантах. Мы рассмотрим вариант когда герой наступает на артефакт и он попадает в наш инвентарь.

 

Допустим у нас имеется массив карты Map[I,j]  и массив артефактов Arts[I,j]. Тогда при движении персонажа мы в массиве Map проверяем может ли герой наступить на следующую ячейку, а в массиве Arts проверяем не находится ли в следующей ячейке какого-нибудь артефакта.

 

Например у нас есть на карте ячейки:

 

0 - вода

1 – земля

2 – трава

 

Наш герой не может ходить по воде (к примеру). Значит при движении делаем следующую проверку:

 

If Map[x,y]>0 then

Begin

Player.X:=x;

Player.y:=y;

End;

 

В нашем случае x и y – это координаты клеточки, на которую хочет стать наш персонаж. Если в массиве карты с координатами х и у содержится цифра больше нуля (а значит там нет воды) – передвигаем героя в нужную клетку.

 

А теперь сразу после проверки на воду, делаем проверку на артефакты (вещи):

 

If Arts[x,y]>0 then

Begin

  

   For i:=0 to 4 do

    

     If (Inventar[i]=0) and (Arts[x,y]>0) then

     begin

     Inventar[i]:=Arts[x,y];

     Arts[x,y]:=0;

     End;

 

   End;

 

End;

 

В нашем случае если в массиве с вещами оказывается какая-либо вещь (массив содержит цифру больше нуля) – номер этой вещи присваиваем в первую свободную ячейку, а клеточку массива вещей обнуляем, чтобы предмет пропал с карты.

 

А что делать если в каждой ячейке может храниться несколько вещей одного типа, например 3 лука или 10 стрел, или 2 золотых монеты. В таком случае наш массив инвентаря должен быть двухмерным. То есть должен содержать два уровня. Первый (верхний уровень) у нас будет работать также как и раньше – будет содержать номера вещей, а второй уровень (нижний) будет содержать количество предметов. Поэтому массив инвентаря будет выглядеть так:

 

Var

Inventar:array[0..4, 1..2] of integer;

 

Теперь первая цифра означает номер ячейки, а вторая номер уровня. Например:

 

Inventar[1,1] – отображает номер вещи если она есть

Inventar[1,2] – отображает количество вещей

 

Теперь проверка на артефакты также изменится следующим образом:

 

If Arts[x,y]>0 then

Begin

  

   For i:=0 to 4 do

    

     If (Inventar[I,1]=0) and (Arts[x,y]>0) then

     begin

     Inventar[I,1]:=Arts[x,y];

     Inventar[I,2]:=1;

     Arts[x,y]:=0;

     End;

 

     If (Inventar[I,1]= Arts[x,y]) and (Arts[x,y]>0) then

     begin

     Inventar[I,1]:=Arts[x,y];

     Inventar[I,2]:= Inventar[I,2]+1;

     Arts[x,y]:=0;

     End;

 

 

 

   End;

 

End;

 

Как видно из выше приведенного кода теперь кроме номера вещи в верхний уровень, добавляется и количество в нижний уровень. И довилась еще одна проверка. Первая проверка проверяет если есть артефакт и инвентарь пуст то доавляем артефакт в инвентарь. А вторая проверка проверяет, если слот в инвентаре уже содержит один из таких вещей, то такую вещь также посещает в этот слот, и увеличиваем количество на единицу.

 

На этом предлагаю закончить нашу работу с инвентарем. Главное Вы поняли смысл работы с ним. Останется только выводить графику самого инвентаря и вещей, находящихся в нем. Но как это сделать мы уже говорили в предыдущих статьях.

 

Следующий вопрос, волнующий нас – это как вещи с инвентаря одевать в слоты одежды на персонажа? Для начала также создадим массив для слотов одежды:

 

Var

Dress:array[0..4]of integer;

 

Как видно из кода выше, мы имеем лишь четыре слота для одежды. Это лишь для примера. Условимся, что:

 

·                  Первый слот – головные уборы

·                  Второй слот – нагрудники

·                  Третий слот – обувь

·                  Четвертый – оружие в руке

 

Также Вы заметили, что массив одномерный. Это потому что нам нужно знать лишь номер артефакта, а его количество и так не может быть больше единицы. Оно или надето или его нет вообще. Хотя возможны случаи если нужно отображать время до поломки оружия или нагрудника или степень поломки, также можно отображать харктеристики одежды типа анти-магия, защита и так далее. Для этого мы просто можем добавить дополнительные уровни в массив и все. Но мы не будем так углубляться.

 

В начале наш массив также должен быть обнулен, так как одежды нет на герое. Затем, чтобы одеть одежу нам нужно кликнуть по картинке одежды в рюкзаке и сделать проверку может ли данная вещь быть надета на персонажа, если да, то в какой слот для одежды и не занят ли он?

 

Условимся, что номера 1-20 – это головные уборы, 21-30 – нагрудники, 31-40 – обувь, 41-60 – это оружие, 61-100 – другие вещи. Допустим, что мы знаем по какому слоту инвентаря кликнул игрок (например по слоту 2), тогда проверка будет следующая:

 

If (Inventar[2]>0) and (Inventar[2]<21) and (Dress[0]=0) then

begin

Dress[0]:=Inventar[2];

Inventar[2,1]:=0;

End;

 

Эта проверка сделана для головных уборов. В нашем случае мы сразу одеваем предмет и обнуляем ячейку инвентаря даже если там таких предметов несколько. Следующая проверка для нагрудников:

 

If (Inventar[2]>20) and (Inventar[2]<31) and (Dress[1]=0) then

begin

Dress[0]:=Inventar[2];

Inventar[2,2]:= Inventar[2,2]-1;

  If Inventar[2,2]=0 then Inventar[2,1]:=0;

End;

 

Для нагрудников проверка сделана более правильно. Сначала мы одеваем артефакт, затем в ячейке с артефактом уменьшаем количество предметов на единицу. Затем проверяем если предметов там уже нет, то есть храниться ноль – удалям предмет из инвентаря вообще. Таким же образом делаем и для других вещей.

 

Еще одетые предметы могут добавлять какие-то характеристики персонажу. В таком случае при одевании нужно сделать проверку на номер вещи и определить что она добавит. Рассмотрим  подобный вариант с оружием в реку. Допустим что мы знаем, что оружие с номером 61 добавляет силу +5. Тогда пишем так:

 

If (Inventar[2]>20) and (Inventar[2]<31) and (Dress[3]=0) then

begin

if Inventar[2]=61 then Personazh.Sila:= Personazh.Sila+5;

Dress[0]:=Inventar[3];

Inventar[2,2]:= Inventar[2,2]-1;

  If Inventar[2,2]=0 then Inventar[2,1]:=0;

End;

 

Еще очень важный аспект – не забывайте при снятии артефактов уменьшать характеристики персонажа, которые они добавляли ему. Иначе можно будет просто много раз одевать предмет и до бесконечности прокачивать главного героя.

 

На этом у меня все. Я конечно же не смог поговорить и показать все, что можно сделать. Но зато Вы уже будете иметь преставление о том как сделать инвентарь для персонажа, как с ним работать, как сделать слоты для одежды и как их одевать на персонажа артефакты из рюкзака. Все спасибо за внимание и удачи в создании игр на делфи!

 

           Источник: delgame.at.ua
Категория: Игровые алгоритмы | Добавил: Armageddets (27.08.2013) | Автор: Как сделать инвентарь и слоты одежд
Просмотров: 2820 | Рейтинг: 5.0/3
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Оцените мой сайт
Всего ответов: 103
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

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