[spoiler=Как применить привязку предметов в инвентаре(любая версия)] В объекте obj_inv в событии Draw изменить последнюю часть кода вот так (отнимать от координат курсора половину ширины и высоты спрайта предмета):
Код:
Код
if (inv_txt!='') { draw_sprite(inv_spr,image_index,mouse_x-16,mouse_y-16); }
Тогда предметы будут перетаскиваться не за верхний левый угол, а за центр спрайта, при желании можно настроить перетаскивание как Вам нужно.[/spoiler] [spoiler=Перетасивание по принципу "Нажал-перетаскиваешь,еще раз нажал-положил"(на версии 1.0064 не тестировалось)] Можно сделать чтобы предметы перетаскивались не при удержании правой кнопкой а по принципу "нажал один раз - перетаскиваешь, нажал еще раз - положил"
Событие Glob Right Released меняем на событие Glob Right Pressed и в конец добавляем else код из события Right Pressed: Схема такая: Код:
Код
"Код из события Glob Right Released" else "Код из события Right Pressed"
Код
if (inv_txt!='')//если при отпускании правой кнопки мыши мы перетаскивали предмет { if position_meeting(mouse_x,mouse_y,self)//если курсор над инвентарем { /*вычисляем на какой ячейке находится курсор (тут вычисляются не координаты, а как бы элемент массива которому принадлежит ячейка над которой курсор*/ klick_x=floor((mouse_x-x)/slot_width_x); klick_y=floor((mouse_y-y)/slot_height_y);
if (txt[klick_x,klick_y]='')//если ячейка над которой отпустили правую кнопку миыши пустая { txt[klick_x,klick_y]=inv_txt;//записываем в массив имя spr[klick_x,klick_y]=inv_spr;//записываем в массив какой спрайт отображать в нивентаре item[klick_x,klick_y]=inv_item;//Записываем количество предметов, которые мы перетаскивали max_number[klick_x,klick_y]=inv_max_number;//Записываем максимальное количество предметов, которое может быть в одной ячейке
inv_txt='';//показываем что больше ничего не перетаскиваем
txt[inv_item_x,inv_item_y]='';//очищаем переменные для ячейки из которой перетаскивали (удаляем предмет из инвентаря) item[inv_item_x,inv_item_y]=0; max_number[inv_item_x,inv_item_y]=0; } else {//если ячейка над которой отпустили правую кнопку миыши НЕ пустая if (txt[klick_x,klick_y]=inv_txt)//если там такой же предмет, какой мы перетаскиваем { if (inv_max_number=0)//если перетаскиваемые предметы можно складывать в любом количестве в одну ячейку { item[klick_x,klick_y]+=inv_item;//Добавляем все перетаскиваемые предметы в эту ячейку
inv_txt='';//показываем что больше ничего не перетаскиваем
txt[inv_item_x,inv_item_y]='';//очищаем переменные для ячейки из которой перетаскивали (удаляем предмет из инвентаря) item[inv_item_x,inv_item_y]=0; max_number[inv_item_x,inv_item_y]=0; } else { while (item[klick_x,klick_y]<inv_max_number && inv_item>0)/*добавляем предметы по одному в эту ячейку, пока она не зполнится или пока не добавим все перетаскиваемые объекты*/ { item[klick_x,klick_y]+=1;//увеличиваем количество объектов в слоте на один (добавлчем в слот один предмет) inv_item-=1;//Уменьшаем количество перетаскиваемых объектов на один } if (inv_item!=0)/*если остались еще предметы которые мы перетаскиваем (это может произойти если заполнилась ячейка в которую мы перетаскивали предметы)*/ {//Возвращаем оставшиеся предмет в ту ячейку, откуда взяли txt[inv_item_x,inv_item_y]=inv_txt;//записываем в массив имя item[inv_item_x,inv_item_y]=inv_item;//записываем оставшееся количество предметов
inv_txt='';//показываем что больше ничего не перетаскиваем } else {//если после перетаскивания предметов больше не осталось inv_txt='';//показываем что больше ничего не перетаскиваем
txt[inv_item_x,inv_item_y]='';//очищаем переменные для ячейки из которой перетаскивали (удаляем предмет из инвентаря) item[inv_item_x,inv_item_y]=0; max_number[inv_item_x,inv_item_y]=0;
} } } else//если отпустили правую кнопку мышки над предметом. отличающимся от перетаскивания {//Возвращаем предмет в ту ячейку, откуда взяли txt[inv_item_x,inv_item_y]=inv_txt;//записываем в массив имя
inv_txt='';//показываем что больше ничего не перетаскиваем } } } else //если курсор не над инвентарем { repeat(inv_item)//выбрасываем предметы (выбрасываем столько предметов, сколько находилось в ячейке) { instance_create(obj_hero.x-16,obj_hero.y+16,inv_name_obj); } inv_txt='';//показываем что больше ничего не перетаскиваем
txt[inv_item_x,inv_item_y]='';//очищаем переменные для ячейки из которой перетаскивали (удаляем предмет из инвентаря) item[inv_item_x,inv_item_y]=0; max_number[inv_item_x,inv_item_y]=0; } } else { if (visible) { if (position_meeting(mouse_x,mouse_y,self))//если курсор над инвентарем) { /*вычисляем на какой ячейке находится курсор (тут вычисляются не координаты, а как бы элемент массива которому принадлежит ячейка над которой курсор*/ klick_x=floor((mouse_x-x)/slot_width_x); klick_y=floor((mouse_y-y)/slot_height_y);
if (keyboard_check(vk_shift))//Если зажата клавиша Shift { if (txt[klick_x,klick_y]!='')//елси в слоте, над которым находится курсор, что-то есть { instance_create(obj_hero.x,obj_hero.y+32,name_obj[klick_x,klick_y]);//создаем этот объект чуть ниже игрока 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; } } } else {//если не нажата клавиша Shift if (txt[klick_x,klick_y]!='')//елси в слоте, над которым находится курсор, что-то есть {//записываем все данные из этого слота в переменные для перетаскивания inv_item_x=klick_x; inv_item_y=klick_y; inv_txt=txt[klick_x,klick_y]; inv_item=item[klick_x,klick_y]; 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];
txt[klick_x,klick_y]='empty';/*помечаем эту ячейку "пусто", но в нее пока что ничего положить нельзя будет. Если переменная txt[] будет равна 'empty', то предмет в этой ячейке рисоваться не будет, хотя фактически он будет там находиться.*/ } } } } }
Здесь в код из события Right Pressed добавлена еще одна проверка "находится ли курсор над инвентарем Код:
Код
if (position_meeting(mouse_x,mouse_y,self))
Возможно я здесь еще что-то менял. И, возможно, комментарии не везде соответствуют тому что на самом деле...