|
Dva_Kota
|
 |
« Ответ #270 : Декабрь 29, 2012, 02:04:19 » |
|
Reylor, ну, вроде бы, так и нужно... Vulcano 1. Да. 2. Лучше оставить его в событии Draw инвентаря. Переменную тоже задавай в инвентаре (в Create) а изменяй ее значение при нажатии стрелок. 3. Скорее всего не правильно ограничил. Размеры инвентаря задаются в событии Create инвентаря, там и нужно менять размеры инвентаря. 4. Здесь нужно еще немного подправить (я про это забыл, по этому не написал в прошлый раз): Строку draw_sprite(spr[inv_stolb,slot_y],image_index,x+inv_stolb*slot_width_x,y+slot_y*slot_height_y); Нужно изменить так: draw_sprite(spr[inv_stolb,slot_y],image_index,x,y+slot_y*slot_height_y); Строку draw_text_ext(x+inv_stolb*slot_width_x+sprite_get_width(spr[inv_stolb,slot_y]),y+slot_y*slot_height_y,txt[klick_x,klick_y],14,100); Изменить так: draw_text_ext(x+sprite_get_width(spr[inv_stolb,slot_y]),y+slot_y*slot_height_y,txt[klick_x,klick_y],14,100); Иначе будет рисоваться только один столбец (как и нужно), только они будут рисоваться не на одном и том же месте, а каждый следующий столбец будет рисоваться правее.
|
|
|
|
|
Записан
|
|
|
|
Reylor
Пользователь
 
Репутация: 1
Offline
Пол: 
API: Game Maker 8.0 Pro
Деятельность: Чём я занимаюсь в игрострое?... хм. да всем с чем приходится работать. Всего по немногу.
Сообщений: 90
|
 |
« Ответ #271 : Декабрь 29, 2012, 18:36:09 » |
|
Dva_Kota, так я и говорю, прописываю вроде бы правильно. А рисует спрайт в левом верхнем углу.
|
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #272 : Декабрь 30, 2012, 01:43:31 » |
|
это: draw_sprite(spr_sword_red,0,x=obj_inv2,y=obj_inv2)//решил рисовать через draw_sprite заменить на это: draw_sprite(spr_sword_red,0,x.obj_inv2,y.obj_inv2)//решил рисовать через draw_sprite или на это: draw_sprite(spr_sword_red,0,x.obj_inv2+5,y.obj_inv2+5)//решил рисовать через draw_sprite //вместо 5 подобрать число. Или (если в Step или в Draw объект obj_inv2 не перемещается за видом) заменить x.obj_inv2 y.obj_inv2 и y.obj_inv2 на соответствующие координаты вида (view_xview, view_yview).
|
|
|
|
|
Записан
|
|
|
|
Vulcano
Новичок
Репутация: 0
Offline
API: Game Maker 8.0 Pro
Сообщений: 3
|
 |
« Ответ #273 : Январь 03, 2013, 01:11:54 » |
|
Я вернулся к тому, с чего начал. Я разобрался с некоторыми переменными и теперь весь массив рисуется в пределах одних координат. Т.о. получается, что все ячейки наслаиваются друг на друга и в конечном итоге отображаются те, что нарисованы последними. Цикл отрисовки ячеек инвентаря теперь выглядит так: for (inv_stolb=0; inv_stolb<inv_height_y mod 5; inv_stolb+=1) { for (slot_y=0; slot_y<5; slot_y+=1) { draw_sprite(sprite_index,image_index,x,y+slot_y*slot_height_y); if (txt[inv_stolb,slot_y]!='' && txt[inv_stolb,slot_y]!='empty') { draw_sprite(spr[inv_stolb,slot_y],image_index,x,y+slot_y*slot_height_y); draw_set_color(c_black); draw_text_ext(x+sprite_get_width(spr[inv_stolb,slot_y]),y+slot_y*slot_height_y,txt[klick_x,klick_y],14,100); } } }
Но как теперь в коде отразить зависимой между изменяемой переменной, которая изменяется в случае нажатия на определенную стрелочку, и видимостью определенной части инвентаря - я не знаю. Просто изменять глубину у каждой рисующейся части в зависимости от означенной ранее переменной. Так в цикле это сделать не получится. Здесь используется простой перебор и любое условие со значением true будет действовать на все части инвентаря, а не только на промежуток - все 5 ячеек inv_stolb=0. Если это как-то можно сделать, я весь во внимании. Ну или всю эту "несложную задачу" можно решить каким-то другим логическим способом... Для меня она уже не просто сложная, а гиперсложная. Прошу помощи и совета у людей более сведущих в этом вопросе.
|
|
|
|
|
Записан
|
|
|
|
Reylor
Пользователь
 
Репутация: 1
Offline
Пол: 
API: Game Maker 8.0 Pro
Деятельность: Чём я занимаюсь в игрострое?... хм. да всем с чем приходится работать. Всего по немногу.
Сообщений: 90
|
 |
« Ответ #274 : Январь 04, 2013, 22:44:58 » |
|
Ну вот и финальная версия крафта. У меня остался только один вопрос. Вот отрезок кода из Left Pressed;obj_inv; if (keyboard_check(vk_shift))//Если зажата клавиша Shift {if (visible) { klick_x=floor((mouse_x-x)/slot_width_x); klick_y=floor((mouse_y-y)/slot_height_y);
if (txt[klick_x,klick_y]!='')//елси в слоте, над которым сейчас находится курсор, что-то есть { switch (name_obj[klick_x,klick_y])//Выбираем в зависимости от названия предметак какое действие выполнить { case obj_sword: //записываем все данные из этого слота в переменные для перетаскивания inv_item_x=klick_x; inv_item_y=klick_y; inv_txt=txt[klick_x,klick_y]; inv_item=1;//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]; case obj_potion_health: //записываем все данные из этого слота в переменные для перетаскивания inv_item_x=klick_x; inv_item_y=klick_y; inv_txt=txt[klick_x,klick_y]; inv_item=1;//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', то предмет в этой ячейке рисоваться не будет, хотя фактически он будет там находиться.*/ Меня немного смущает выделенный отрезок кода, что бы перемещать в инвентарь все предметы придётся добавлять для каждого предмета свой отрезок кода, но тогда код получиться совершенно не оптемизированн. Сейчас в inv_3 можно скинуть лишь 2 предмета зелье здоровья и меч, а остальные при нажатии ПКМ + shift просто удаляются,а это ни есть хорошо. Хотелось бы сделать, что бы все предметы можно было кидать в inv_3 либо только отдельные предметы (на выбор), но, что бы не приходилось писать для каждого предмета такой код как выше. Крафт уже реализовал так что это последний вопрос по инвентарю. Если есть время посмотри пример.
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #275 : Январь 06, 2013, 02:09:15 » |
|
VulcanoНужно просто убрать первую строку for (inv_stolb=0; inv_stolb<inv_height_y mod 5; inv_stolb+=1) и задавать переменную inv_stolb, равную номеру нужного столбца ReylorНаверное, не самый лучший вариант, но у меня сейчас нет веремени придумывать что-то другое. Суть способа в следующем: не перемещаем предмет в инвентарь, а создаем под ногами игрока. Тогда, если предметы перемещаются в инвентарь при прикосновении к игроку, он сам туда переместится. Если нужно нажимать клавишу - попробуй эмитировать нажатие этой клавиши. Для того чтобы то сделать достаточно заменить switch (name_obj[klick_x,klick_y])//Выбираем в зависимости от названия предметак какое действие выполнить (и весь код который ты выделил) на одну строку: instance_create(игрок.x,игрок.y,name_obj[klick_x,klick_y])
|
|
|
|
|
Записан
|
|
|
|
Reylor
Пользователь
 
Репутация: 1
Offline
Пол: 
API: Game Maker 8.0 Pro
Деятельность: Чём я занимаюсь в игрострое?... хм. да всем с чем приходится работать. Всего по немногу.
Сообщений: 90
|
 |
« Ответ #276 : Январь 06, 2013, 14:13:23 » |
|
Dva_Kota,сделал немного по-другому (циклы просто в коде перепутал), но все равно спасибо. Крафт довёл до ума. Добавил ещё один рецепт меч+зелье маны = меч маны. (так от делать нечего). Пример крафта выложу ниже, может кому пригодиться. P.S. Если кто будет использовать пример. Добавление "рецептов" думаю не составит труда т.к использованы не сложные коды. Да и комментарии там тоже присутствуют.
Добавлено: Январь 10, 2013, 12:15:07 Ах да, и ешё Dva_Kota как бы мне в инвентаре экипировке переставить слоты для одежды/оружия. Сам переставлял, но они всё равно ложатся не на место. Может что пропустил. Хотелось бы сделать как на картинке. P.S. И ещё хотелось бы убрать переменные для правой/левой рук. И оставить одну т.к. меч один. Но на мои попытки убрать одну из "рук" Выскакивала ошибка компиляции.
|
|
|
« Последнее редактирование: Январь 10, 2013, 12:15:08 от Reylor »
|
Записан
|
|
|
|
|
Hadarak
|
 |
« Ответ #277 : Январь 10, 2013, 12:40:55 » |
|
Во сделал как нужно. Посмотри изменения в obj_inv_weapon create, там я поменял типы предметов. И obj_item_base, там сменил n_x_(1,2) у некоторых предметов (меча, перчаток, амулетов)
|
|
|
|
Записан
|
|
|
|
Reylor
Пользователь
 
Репутация: 1
Offline
Пол: 
API: Game Maker 8.0 Pro
Деятельность: Чём я занимаюсь в игрострое?... хм. да всем с чем приходится работать. Всего по немногу.
Сообщений: 90
|
 |
« Ответ #278 : Январь 10, 2013, 15:51:44 » |
|
Hadarak, делал как ты. Но проблема в том, что после крафта предмета (К примеру, кровавый меч). Предметы ложатся как в стандартном spr_inv_equip_back. В чем причина, не пойму.
|
|
|
|
|
Записан
|
|
|
|
|
Hadarak
|
 |
« Ответ #279 : Январь 10, 2013, 16:06:38 » |
|
Вот ещё немного изменил пример, а то если активировать меч из инвентаря он одевался во вторую руку тоже. Вообщем тебе во всех switch с n_x_1, n_y_1 нужно заменить: case 1:...break; case 2:...break; case n:...break;
на case 1: n_x_1 = 2; n_y_1 = 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 = 1; break; case 6: n_x_1 = 0; n_y_1 = 0; n_x_2 = 2; n_y_2 = 0; break; case 7: n_x_1 = 0; n_y_1 = 2; n_x_2 = 2; n_y_2 = 2; break; Исправил бы сам, но не знаю как и где происходит крафт. Добавлено: Январь 10, 2013, 16:08:00 А хотя я вроде всё правильно сделал, ты же имел ввиду после крафта ты активируешь в инвентаре, а потом уже встаёт не на то место.
|
|
|
|
Записан
|
|
|
|
cfif31
Посетитель

Репутация: 0
Offline
API: Game Maker 8.0 Pro
Сообщений: 24
|
 |
« Ответ #280 : Январь 21, 2013, 16:51:02 » |
|
Скажите можно ли убрать цифры количества предметов в инвентаре? И ещё как сделать чтобы при отпускании мыши (в которой объект из инвентаря) вне инвентаря объект возвращался в инвентарь , а если например над объектом stacan (определённого предмета) выполнялось действие?
|
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #281 : Январь 22, 2013, 01:45:14 » |
|
1. Числа модно отключит в событии Draw. Нужно убрать строку, с функцией draw_text() (ту, которая отображает значение item[]) 2. В событии "Глобальное отпускание клавиши", в самом конце, есть такая часть кода: with (instance_create(obj_hero.x-16,obj_hero.y+16,inv_name_obj)) { number = other.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; замени ее на это: with (other) { txt[inv_item_x,inv_item_y]=inv_txt;//записываем в массив имя
inv_txt='';//показываем что больше ничего не перетаскиваем } Тогда предметы не будут выбрасываться. Выше (в том же событии) есть проверка ячейки, над которой находится выбрасываемый предмет (смотри комментарии в коде). Где сравнивается перетаскиваемый предмет с предметом, который в ячейке добавь еще свою проверку (если в ячейке предмет stacan - выполнять действие).
|
|
|
|
|
Записан
|
|
|
|
cfif31
Посетитель

Репутация: 0
Offline
API: Game Maker 8.0 Pro
Сообщений: 24
|
 |
« Ответ #282 : Январь 22, 2013, 16:31:17 » |
|
1. Числа модно отключит в событии Draw. Нужно убрать строку, с функцией draw_text() (ту, которая отображает значение item[]) 2. В событии "Глобальное отпускание клавиши", в самом конце, есть такая часть кода: with (instance_create(obj_hero.x-16,obj_hero.y+16,inv_name_obj)) { number = other.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; замени ее на это: with (other) { txt[inv_item_x,inv_item_y]=inv_txt;//записываем в массив имя
inv_txt='';//показываем что больше ничего не перетаскиваем } Тогда предметы не будут выбрасываться. Выше (в том же событии) есть проверка ячейки, над которой находится выбрасываемый предмет (смотри комментарии в коде). Где сравнивается перетаскиваемый предмет с предметом, который в ячейке добавь еще свою проверку (если в ячейке предмет stacan - выполнять действие). А если Объект стакан(stacan) не в инвентаре?
|
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #283 : Январь 22, 2013, 17:03:08 » |
|
Если не в ячейке, тогда нужно делать по-другому: перед кодом with (other) { txt[inv_item_x,inv_item_y]=inv_txt;//записываем в массив имя
inv_txt='';//показываем что больше ничего не перетаскиваем } (который ты вставил) нужно добавить проверку "находится ли под курсором объект "Стакан". Если true - выполнять действие, иначе - выполнять код выше.
|
|
|
|
|
Записан
|
|
|
|
cfif31
Посетитель

Репутация: 0
Offline
API: Game Maker 8.0 Pro
Сообщений: 24
|
 |
« Ответ #284 : Январь 22, 2013, 17:37:30 » |
|
Если не в ячейке, тогда нужно делать по-другому: перед кодом with (other) { txt[inv_item_x,inv_item_y]=inv_txt;//записываем в массив имя
inv_txt='';//показываем что больше ничего не перетаскиваем } (который ты вставил) нужно добавить проверку "находится ли под курсором объект "Стакан". Если true - выполнять действие, иначе - выполнять код выше. Спасибо!!!!! А можно ли чтобы если определённый предмет отпущен над стаканом(stacan) то выполнялось действие, а если другой предмет не выполнялось?
|
|
|
|
|
Записан
|
|
|
|
|