[spoiler=Как сделать,что бы в инвентаре отображались уменьшенные спрайты объектов(для любой версии)] Можно легко сделать чтобы в инвентаре для каждого предмета отображался не его спрайт, а какой-то другой. Например у нас есть предмет "корова" - спрайт в несколько раз больше чем ячейка инвентаря, а нам нужно чтобы в инвентаре отображался маленький спрайт. Для этого у каждого объекта "предмета" добавляем в событие Create строчку с переменной, в которую записываем индекс спрайта, который должен отображаться в инвентаре: Код:
У объекта - родителя для всех предметов в событии столкновения заменить строки (их две одинаковые, 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]
Код
with (obj_inv)//выполняем код для объекта obj_inv { for (slot_y=0; slot_y<inv_height_y; slot_y+=1)//выбираем строку инвентаря для проверки { for (slot_x=0; slot_x<inv_width_x; slot_x+=1)//проверяем все ячейки в этой строке, а потом опять выполнится сторка выше и мы перейдем к следующепй строке инвентаря { txt[slot_x,slot_y]='';//очищаем переменные для этой ячейки (удаляем предмет из инвентаря) item[slot_x,slot_y]=0; max_number[slot_x,slot_y]=0; } } }
[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=''; } }