Четверг, 28 Марта 2024, 17:05

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Ресурсы и Примеры игр » Исходники и примеры » Пример инвентаря Часть 3 (На Game Maker 8)
Пример инвентаря Часть 3
DataTravel23Дата: Четверг, 28 Марта 2013, 14:43 | Сообщение # 1
частый гость
Сейчас нет на сайте
[spoiler=Как сделать,что бы в инвентаре отображались уменьшенные спрайты объектов(для любой версии)]
Можно легко сделать чтобы в инвентаре для каждого предмета отображался не его спрайт, а какой-то другой. Например у нас есть предмет "корова" - спрайт в несколько раз больше чем ячейка инвентаря, а нам нужно чтобы в инвентаре отображался маленький спрайт. Для этого у каждого объекта "предмета" добавляем в событие Create строчку с переменной, в которую записываем индекс спрайта, который должен отображаться в инвентаре:
Код:
Код
sprite_mini = индекс_спрайта_который_будет_отображаться_для_этого_предмета_в_инвентаре;


У объекта - родителя для всех предметов в событии столкновения заменить строки (их две одинаковые, 8 и 28):
Код:
Код
other.spr[other.slot_x,other.slot_y]=sprite_index;//записываем в массив какой спрайт отображать в нивентаре

на это:
Код:
Код
other.spr[other.slot_x,other.slot_y]=sprite_mini;//записываем в массив какой спрайт отображать в нивентаре


Переменную sprite_mini можете назвать как вам наравится[/spoiler]
[spoiler=Как добавить крафт(версия 1.0064,но для версии 1.0024 аналогично)]
Во вложении есть пример Пример_инвентаря_Dva_Kota_Bodimir_Alexis_1.0064_rpg_mod + equipment + craft_1.0002 - это пример инвентаря с крафтом (все комментарии в скрипте scr_craft). Крафт очень примитивный. Если в одной ячейке нет достаточного количества предметов для крафта (они разложены по нескольким ячейкам) - не сработает.
Добавил скрипт scr_craft - код там почти такой же, но использовать скрипт проще. Формат скрипта:
scr_craft(объект_который_будет_создан_при_крафте,первый_ингредиент,количество_первого_ингредиента, второй_ингредиент, количество_второго_ингредиента). Можно легко сделать больше ингредиентов, добавив еще пару аргументов в скрипт и увеличив значение переменной n.
В примере использование скрипта стоит в событии нажатия клавиши "F" у основного инвентаря.
Код
//Максимальное число ингредиентов для крафта в этом примере скрипта - 2.
//если нужно увеличить/уменьшить количество ингредиентов - добавьет/уберите пару аргументов (массивы craft_name[] и craft_number[])

//Если какой-то ингридиент не нужен - вместо аргументов 1 или 3 должена быть произвольная строка, не совпадающую ни с одним из названий предметов (не пустая строка и не пробел!)

//argument0 - то что должно получиться
craft_name[0] = argument1; //ингридиент 0  
craft_number[0] = argument2; //необходимое количество ингридиента 0
craft_name[1] = argument3; //ингридиент 1
craft_number[1] = argument4; //необходимое количество ингридиента 1

craft[0]=false;//нашли ли мы нужное количество ингридиента 0
craft[1]=false;//нашли ли мы нужное количество ингридиента 1

n = 2; //максимельное количество ингредиентов

     for (slot_y=0; slot_y<inv_height_y; slot_y+=1)//выбираем строку инвентаря для проверки
         {
         for (slot_x=0; slot_x<inv_width_x; slot_x+=1)//проверяем все ячейки в этой строке, а потом опять выполнится сторка выше и мы перейдем к следующепй строке инвентаря  
             {
             for(i = 0; i < n; i += 1)//сравниваем предмет в этой ячейке со всеми ингридиентами
                 {
                 if (craft_name[i] = txt[slot_x,slot_y])
                     {
                     if (item[slot_x,slot_y]>=craft_number[i] and !craft[i])//если предметов достаточное количество и мы еще не находили этот предмет
                         {
                         craft[i]=true;
                         craft_x[i]= slot_x;
                         craft_y[i]= slot_y;
                         }
                     }
                 }
             }
         }

//Теперь смотрим все ли ингридиенты для крафта у нас есть:
if (craft[0] and craft[1])
     {
     for(i = 0; i < n; i += 1)//здесь n - максимальное число ингредиентов для крафта
         {
         if (item[craft_x[i],craft_y[i]] > craft_number[i])//если в ячейке предметов больше, чем нужно для крафта
             {
             item[craft_x[i],craft_y[i]] -= craft_number[i];//удаляем нужное количество предметов из ячейки (просто уменьшаем количество)
             }
         else//если в ячейки предметов столько, сколсько нужно для крафта
             {//очищаем переменные для ячейки из которой перетаскивали (удаляем предмет из инвентаря)
             txt[craft_x[i],craft_y[i]]='';
             item[craft_x[i],craft_y[i]]=0;
             max_number[craft_x[i],craft_y[i]]=0;
             }
         }
     //здесь код того что должно произойти (созлдание нового предмета)
     instance_create(obj_hero.x-16,obj_hero.y+16,argument0);
     //предмет создается ниже игрока. Можно создавать предмет сразу в координатах игрока, тогда он сразу будет попадать в инвентарь (если там есть место)
     }
[/spoiler]

[spoiler=Как назначить горячие клавиши слотов(Для версии 1.0064, для 1.0028 аналогично)]Для более ранних версия (где один инвентарь) достаточно скопировать код из события нажатия левой клавиши мышки в события нажатия горячей клавиши для слота.

В переменные klick_x и klick_y мы записываем координаты ячейки для использования. Если нужно чтобы горячие клавиши действовали и при свернутом инвентаре - уберите проверку visible в перовй строке.
Код:
Код
//Использование предмета.
/*вычисляем на какой ячейке находится курсор (тут вычисляются не координаты, а как бы элемент массива которому принадлежит
ячейка над которой курсор*/
if (visible and inv_txt='' and obj_inv_weapon.inv_txt='' )
     {
     klick_x=0;//координаты ячейки для использования предмета
     klick_y=0;

     if (txt[klick_x,klick_y]!='')//елси в слоте, над которым сейчас находится курсор, что-то есть
         {
         with (obj_inv_weapon)
             {//задаем координаты ячеек в которые можно переместить данный предмет. Сначала -1, это означает что перемещать нельзя, дальше зададим реальные координаты
             //количество пар переменных = максимальное количество слотов для данного типа предмета
             //в нашем примере максимальное количество слотов для одного типа предметов 2 (это два оружия и два кольца)
             //Вы можете сделать больше одинаковых ячеек, добавив еще пары переменных здесь и в коде ниже
             n_x_1 = -1;
             n_y_1 = -1;
             n_x_2 = -1;
             n_y_2 = -1;
          
             switch (other.item_type[other.klick_x,other.klick_y])//Выбираем в зависимости от типа предмета какое действие выполнить
                 {//типр предмета: 0 - обычный предмет, 1 - оружие, 2 - шлем, 3 - броня, 4 - обувь, 5 - перчатки, 6 - амулет, 7 - кольца
                 case 0: execute_string(other.act_on[other.klick_x,other.klick_y]); break;//для обычных предметов типа 0 просто выполняем тот код, который в них записан
                 //дальше идет определение координат ячеек, в которые можно переместить предметы, которые игрок моежет надевать
                 //если переменные n_x_2 и n_y_2 здесь не определены, значит из значение -1 и для этого типа предметов предназначен только один слот
                 case 1: n_x_1 = 0;
                         n_y_1 = 1;
                         n_x_2 = 2;
                         n_y_2 = 1;
                         break;
                 case 2: n_x_1 = 1;
                         n_y_1 = 0;
                         break;
                 case 3: n_x_1 = 1;
                         n_y_1 = 1;
                         break;
                 case 4: n_x_1 = 1;
                         n_y_1 = 2;
                         break;
                 case 5: n_x_1 = 0;
                         n_y_1 = 0;
                         break;
                 case 6: n_x_1 = 2;
                         n_y_1 = 0;
                         break;
                 case 7: n_x_1 = 0;
                         n_y_1 = 2;
                         n_x_2 = 2;
                         n_y_2 = 2;
                         break;
                 }
             }
              
         if (obj_inv_weapon.n_x_1 != -1) //Если этот предмет можно надеть (для тех типов предметов, которе надеть нельзя эта переменная была определена выше как -1)
             {
             //записываем все данные из этого слота в переменные для перетаскивания
             inv_item_x=klick_x;
             inv_item_y=klick_y;
             inv_txt=txt[klick_x,klick_y];
             inv_item=1;
             inv_spr=spr[klick_x,klick_y];
             inv_max_number=max_number[klick_x,klick_y];
             inv_name_obj=name_obj[klick_x,klick_y];
             inv_act_on = act_on[klick_x,klick_y];//записываем код, выполняемый при использовании
             inv_act_off = act_off[klick_x,klick_y];//записываем параметры для надеваемых предметов
             inv_item_type = item_type[klick_x,klick_y];//записываем тип предмета
                    
             with (obj_inv_weapon)//выполняем код для объекта obj_inv_weapon.
                 {
                 if (txt[n_x_1,n_y_1]='')//Если первая ячейка свободна перемещаем в нее предмет (для оружия это будет слот правой руки)
                     {
                     txt[n_x_1,n_y_1]=other.inv_txt;//записываем в массив имя  
                     spr[n_x_1,n_y_1]=other.inv_spr;//записываем в массив какой спрайт отображать в нивентаре
                     item[n_x_1,n_y_1]=other.inv_item;//увеличиваем кол-во предментов на 1
                     name_obj[n_x_1,n_y_1]=other.inv_name_obj;//записываем имя объекта
                     max_number[n_x_1,n_y_1]=other.inv_max_number;//записываем максимальное количество предметов в слоте  
                     act_on[n_x_1,n_y_1] = other.inv_act_on;//записываем код, выполняемый при использовании
                     act_off[n_x_1,n_y_1] = other.inv_act_off;//записываем параметры для надеваемых предметов
                     item_type[n_x_1,n_y_1] = other.inv_item_type;//записываем тип предмета
                     r_weap = true;//эта переменная будет использоваться для определения в какой руке оружие: true - в правой, false - в левой (только для оружия)
                     execute_string(act_on[n_x_1,n_y_1]);//выполняем то, что должно произойти когда надеваем предмет
                     }
                 else//иначе, если япервая ячейка этого типа занята проверяем вторую ячейку этого типа (если она есть)
                     {//если в Вашем инвентаре предусмотрено больше 2-х ячеек одного типа, добавьте здесь блок кода приведенный выше  (строки 70-82) подставив другие переменные вместо n_x_1 и n_y_1. Код ниже - проверка последнего слота этого типа
                     if (n_x_2 != -1)//Если есть еще одна ячейка для этого типа предметов
                         {
                         if (txt[n_x_2,n_y_2]='')//Если вторая ячейка свободна перемещаем в нее предмет
                             {
                             txt[n_x_2,n_y_2]=other.inv_txt;//записываем в массив имя  
                             spr[n_x_2,n_y_2]=other.inv_spr;//записываем в массив какой спрайт отображать в нивентаре
                             item[n_x_2,n_y_2]=other.inv_item;//увеличиваем кол-во предментов на 1
                             name_obj[n_x_2,n_y_2]=other.inv_name_obj;//записываем имя объекта
                             max_number[n_x_2,n_y_2]=other.inv_max_number;//записываем максимальное количество предметов в слоте
                             act_on[n_x_2,n_y_2] = other.inv_act_on;//записываем код, выполняемый при использовании
                             act_off[n_x_2,n_y_2] = other.inv_act_off;//записываем параметры для надеваемых предметов
                             item_type[n_x_2,n_y_2] = other.inv_item_type;//записываем тип предмета
                             r_weap = false;//эта переменная будет использоваться для определения в какой руке оружие: true - в правой, false - в левой
                             execute_string(act_on[n_x_2,n_y_2]);//выполняем то, что должно произойти когда надеваем предмет
                    
                             other.txt[other.klick_x,other.klick_y]='';//очищаем переменные для этой ячейки (удаляем предмет из инвентаря)
                             other.max_number[other.klick_x,other.klick_y]=0;
                             other.item[other.klick_x,other.klick_y]=0;
                             other.inv_txt='';
                             exit;//!Заканчиваем выполнение кода!
                             }
                         }
                     //Если все ячейки для этого типа предметов заняты
                     //Сначала перемещаем предмет из первого слота в инвентарь (на место того предмета, которое будем перемещать в первый слот)
                     other.txt[other.klick_x,other.klick_y] = txt[n_x_1,n_y_1];//записываем в массив имя  
                     other.spr[other.klick_x,other.klick_y] = spr[n_x_1,n_y_1];//записываем в массив какой спрайт отображать в нивентаре
                     other.item[other.klick_x,other.klick_y] = item[n_x_1,n_y_1];//увеличиваем кол-во предментов на 1
                     other.name_obj[other.klick_x,other.klick_y] = name_obj[n_x_1,n_y_1];//записываем имя объекта
                     other.max_number[other.klick_x,other.klick_y] = max_number[n_x_1,n_y_1];//записываем максимальное количество предметов в слоте  
                     other.act_on[other.klick_x,other.klick_y] = act_on[n_x_1,n_y_1];//записываем код, выполняемый при использовании
                     other.act_off[other.klick_x,other.klick_y] = act_off[n_x_1,n_y_1];//записываем параметры для надеваемых предметов
                     other.item_type[other.klick_x,other.klick_y] = item_type[n_x_1,n_y_1];//записываем тип предмета
                     r_weap = true;//эта переменная будет использоваться для определения в какой руке оружие: true - в правой, false - в левой (только для оружейных слотов)
                     execute_string(act_off[n_x_1,n_y_1]);//выполняем то, что должно произойти когда снимаем предмет
                     //Потом перемещаем выбранный предмет в первый слот
                     txt[n_x_1,n_y_1]=other.inv_txt;//записываем в массив имя  
                     spr[n_x_1,n_y_1]=other.inv_spr;//записываем в массив какой спрайт отображать в нивентаре
                     item[n_x_1,n_y_1]=other.inv_item;//увеличиваем кол-во предментов на 1
                     name_obj[n_x_1,n_y_1]=other.inv_name_obj;//записываем имя объекта
                     max_number[n_x_1,n_y_1]=other.inv_max_number;//записываем максимальное количество предметов в слоте  
                     act_on[n_x_1,n_y_1] = other.inv_act_on;//записываем код, выполняемый при использовании
                     act_off[n_x_1,n_y_1] = other.inv_act_off;//записываем параметры для надеваемых предметов
                     item_type[n_x_1,n_y_1] = other.inv_item_type;//записываем тип предмета
                     execute_string(act_on[n_x_1,n_y_1]);//выполняем то, что должно произойти когда надеваем предмет
                      
                     other.inv_txt='';//мы ничего не перетаскиваем
                     exit;//!Заканчиваем выполнение кода!
                     }
                 }
              }
         //эта часть кода выполняется для всех типов предметов:
         item[klick_x,klick_y]-=1;//Уменьшаем количество предметов в слоте на 1
         if (item[klick_x,klick_y]=0)//если предметов больше не осталось,  
             {
             txt[klick_x,klick_y]='';//очищаем переменные для этой ячейки (удаляем предмет из инвентаря)
             max_number[klick_x,klick_y]=0;
             }
         inv_txt='';
         }
     }
[/spoiler]
Форум игроделов » Ресурсы и Примеры игр » Исходники и примеры » Пример инвентаря Часть 3 (На Game Maker 8)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг