|
Dva_Kota
|
 |
« Ответ #255 : Декабрь 13, 2012, 18:53:51 » |
|
Везде, где идет вычисление координат ячеек через цикл добавлять ширину/высоту расстояния между ячейками. По умолчанию расстояние между ячейками равно 0.
|
|
|
|
|
Записан
|
|
|
|
RussFakt
Новичок
Репутация: 7
Offline
Пол: 
API: Game Maker 8.0 Pro
Деятельность: Дизайнер, программист.
Сообщений: 6
|
 |
« Ответ #256 : Декабрь 16, 2012, 19:37:21 » |
|
Как сделать, чтобы при старте игры инвентарь был закрыт? 
|
|
|
|
|
Записан
|
|
|
|
|
Hadarak
|
 |
« Ответ #257 : Декабрь 16, 2012, 20:27:55 » |
|
obj_inv Createvisible = false;
|
|
|
|
|
Записан
|
|
|
|
Reylor
Пользователь
 
Репутация: 1
Offline
Пол: 
API: Game Maker 8.0 Pro
Деятельность: Чём я занимаюсь в игрострое?... хм. да всем с чем приходится работать. Всего по немногу.
Сообщений: 90
|
 |
« Ответ #258 : Декабрь 21, 2012, 11:23:40 » |
|
Я сделал несколько инвентарей (с помощью двойного инвентаря, как я раньше не додумался  ) ну так вот, если мы подбираем obj_shoes_01, переносим ботинки в основной инвентарь. Зажимаем shift жмём ПКМ ботинки переносятся во inv_3 опять жмём ПКМ на ботинках, они переносятся в inv_2. Опять ПКМ и ботинки переносятся в obj_inv. У меня есть вопрос почему я не могу ложить все предметы в inv_3,2 с помощью obj_item_base. Вот отрезок кода из Left Pressed inv_3 такойже и в inv_2. switch (name_obj[klick_x,klick_y])//Выбираем в зависимости от названия предметак какое действие выполнить { case obj_shoes_01: //записываем все данные из этого слота в переменные для перетаскивания 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]; Если я ставлю вместо obj_shoes_01, obj_item_base то предметы вообще не ложатся в inv_2,3. В чем проблемма?
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #259 : Декабрь 21, 2012, 15:53:56 » |
|
obj_item_base - родитель для всех предметов-объектов которые присутствуют в комнате (не в инвентаре!). Он используется для проверки столкновения с предметами в комнате - нужен для того чтобы при добавлении новых предметов не создавать еще одно событие столкновения - весь код перемещения предмета (для всех предметов) написан в одном событии.
|
|
|
|
|
Записан
|
|
|
|
Reylor
Пользователь
 
Репутация: 1
Offline
Пол: 
API: Game Maker 8.0 Pro
Деятельность: Чём я занимаюсь в игрострое?... хм. да всем с чем приходится работать. Всего по немногу.
Сообщений: 90
|
 |
« Ответ #260 : Декабрь 26, 2012, 20:04:13 » |
|
Да, я понял. Как то глупо получилось, ну да ладно. Как бы мне осуществить систему крафта не поможешь. Пока, что крафт реализован как в начальном примере, в inv_3 кидаем 2 предмета (в моём случае Лечебное зелье + Меч = Кровавый меч) как сделать крафт как в моей прошлой нарисовке? Не могу сделать что бы после проверки на предметы в inv_3 (Зелье + меч) в inv_2 создавался предмет (кровавый меч). Как бы это реализовать?
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #261 : Декабрь 27, 2012, 11:12:28 » |
|
Я бы посоветовал сделать немного по другому: В Draw проверять какие предметы в inv_3, в соответствии с этим рисовать в inv_2 спрайт создаваемого предмета. Проверять то же самое при клике мышкой по inv_2, при этом удаляя все предметы из inv_3 и создавая предмет (кровавый меч) сразу в основном инвентаре. Так будет на много проще. Думаю что проверить какие предметы находятся в inv_3 не составит труда, т.к. в первом сообщении темы описано как сделать такую проверку. Код очистки инвентаря там тоже есть.
|
|
|
|
|
Записан
|
|
|
|
UniversalCreator
Активный участник
   
Репутация: 29
Offline
Пол:  Награды: ![За постоянность! [10 дней на форуме] За постоянность! [10 дней на форуме]](http://forum.hellroom.ru/awards/35b6e985f89cc9a79a2bbfdd216390ca_hellroomforum_time_tin.gif)
API: Game Maker 8.0 Pro
Деятельность: Я занят!
Сообщений: 443
|
 |
« Ответ #262 : Декабрь 27, 2012, 11:55:59 » |
|
ух ты! прикольный инвентарь! Мне обязательно пригодится
|
|
|
|
|
Записан
|
|
|
|
Reylor
Пользователь
 
Репутация: 1
Offline
Пол: 
API: Game Maker 8.0 Pro
Деятельность: Чём я занимаюсь в игрострое?... хм. да всем с чем приходится работать. Всего по немногу.
Сообщений: 90
|
 |
« Ответ #263 : Декабрь 27, 2012, 21:39:38 » |
|
Начал делать как ты сказал но спрайт кровавого меча рисует не там где надо как быть. И ещё как сделать, что бы спрайт рисовался когда именно два предмета определенны. (меч, зелье) Пытался сделать так { if (txt[slot_x,slot_y]='меч')//когда находим ячейку с таким же предметом if (txt[slot_x,slot_y]='зелье') { Но эффекта ноль как быть.
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #264 : Декабрь 27, 2012, 23:10:28 » |
|
Так ты проверяешь наличие двух предметов в одной и той же ячейке. Создай переменную, значение которой false. Нужно сначала проверить все ячейки на наличие первого предмета. Как только найдешь первый предмет меняй значение этой переменной на true. затем проверяем переменную. Если она true - меняем ее значение на false и проверяем все ячейки на наличие второго предмета. Если находим второй предмет - меняем значение переменной на true. Если после поиска всех предметов значение переменной true - рисуем спрайт. Приблизительный код: a = false;
//поиск первого предмета for (slot_y=0; slot_y<inv_height_y; slot_y+=1) { for (slot_x=0; slot_x<inv_width_x; slot_x+=1) { if (txt[slot_x,slot_y]='зелье') { a = true; } } } if (a) { a = false for (slot_y=0; slot_y<inv_height_y; slot_y+=1) { for (slot_x=0; slot_x<inv_width_x; slot_x+=1) { if (txt[slot_x,slot_y]='Меч') { a = true; } } } }
if (a) { //Здесь рисуем спрайт } Разумеется, если много различных вариантов крафта то такой код не очень удобен. В примерах крафта, вроде бы, было описано как лучше это организовать.
|
|
|
|
|
Записан
|
|
|
|
Reylor
Пользователь
 
Репутация: 1
Offline
Пол: 
API: Game Maker 8.0 Pro
Деятельность: Чём я занимаюсь в игрострое?... хм. да всем с чем приходится работать. Всего по немногу.
Сообщений: 90
|
 |
« Ответ #265 : Декабрь 27, 2012, 23:59:26 » |
|
С этим понятно, но почему я не могу задать собственные координаты спрайту.? Он рисуется как при координатах х=0 у=0
|
|
|
|
|
Записан
|
|
|
|
Vulcano
Новичок
Репутация: 0
Offline
API: Game Maker 8.0 Pro
Сообщений: 3
|
 |
« Ответ #266 : Декабрь 28, 2012, 00:08:18 » |
|
Инвентарь отличный. Маленько переработал код, добавил кое-что свое и сделал всякие красивости в виде нарисованных спрайтов. Но наткнулся на камень, под который никак не затекает вода! Как логически сообразить, что нужно для кода, при котором будут отображаться только части инвентаря. Поясню подробнее. Есть инвентарь только из одной колонки. В нем 15 ячеек, но изначально рисуются только 5 (понятно, что в них отображаются взятые предметы, если они уже взяты). При нажатии кнопки, или области нарисованного спрайта (стрелка вправо), исчезают первые пять ячеек и на тех же позициях появляются следующие 5 (т.е. начиная с 5, т.к. массив хранит переменные с 0 - 1 ячейка и т.д., если я правильно понял  ). Нажатие на стрелку влево, возвращает первые пять ячеек с предметами (начиная с 0-й). По этому принципу в инвентаре получается как бы 3 страницы, которые отображают разные адреса ячеек. Если видно какую-то одну страничку, то не видно остальные, или они вообще не прорисовываются. Просто дичайшими затратами и так уставшего мозга после работы сидел вечерами больше недели. Все, что удалось выжать - страницы две не исполняющегося кода: draw_sprite(i_menu_right_arrow,-1,x+(sprite_get_width(i_menu_back)-30),y+(sprite_get_height(i_menu_back)-35)) //рисует стрелку для ссылки, координаты примерные draw_sprite(i_menu_left_arrow,-1,x+(sprite_get_width(i_menu_back)-130),y+(sprite_get_height(i_menu_back)-35)) //то же самое draw_sprite(i_menu_back,-1,x,y);
for (slot_x=0; slot_x<inv_width_x; slot_x+=1) { for (slot_y=0; slot_y<inv_height_y; slot_y+=1) { if slot_y<5 //ограничивает отрисовку ячеек { draw_sprite(sprite_index,image_index,x+slot_x*slot_width_x,y+slot_y*slot_height_y); if (txt[slot_x,slot_y]!='' && txt[slot_x,slot_y]!='empty') { i_triger+=1 draw_sprite(spr[slot_x,slot_y],image_index,x+slot_x*slot_width_x,y+(slot_y-i_trig)*slot_height_y); draw_set_color(c_black); draw_text_ext(x+slot_x*slot_width_x+sprite_get_width(spr[slot_x,slot_y]),y+(slot_y-i_trig)*slot_height_y,txt[klick_x,klick_y],14,100); } if slot_y<10 && push_bt_right=1 //доп. переменная, которая изменяется, как только была нажата нужная клавиша или область, далее, выполнение отрисовки следующих ячеек, начиная со стартовых позиций, за счет введения переменной i_triger { draw_sprite(sprite_index,image_index,x+slot_x*slot_width_x,y+slot_y*slot_height_y); if (txt[slot_x,slot_y]!='' && txt[slot_x,slot_y]!='empty') { draw_sprite(spr[slot_x,slot_y],image_index,x+slot_x*slot_width_x,y+(slot_y-i_trig)*slot_height_y); draw_text_ext(x+slot_x*slot_width_x+sprite_get_width(spr[slot_x,slot_y]),y+(slot_y-i_trig)*slot_height_y,txt[klick_x,klick_y],14,100); } }
//Часть кода ниже - остатки другой задумки, с очисткой предыдущей отрисованной области инвентаря, но как это все совместить??? если это вообще правильно if (position_meeting(mouse_x,mouse_y,i_menu_left_arrow)) && (mouse_check_button(mb_left)) { with(i_menu_spisok) { visible=false; } i_trig=slot_y; slot_y+=1; }
Сломал себе уже весь мозг. Не хватает у меня логического мышления, чтобы решить, скорее всего, пустяковую задачу. Элементы кода, что я приложил, возможно вообще бред. Я даже в этом ничуть не сомневаюсь. Подскажите, в каком направлении хотя бы соображать 
|
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #267 : Декабрь 28, 2012, 00:22:14 » |
|
Reylor, а как именно задаются координаты рисующегося спрайта? (сейчас нет возможности посмотреть твой пример)
Vulcano, задача, вроде бы, не сложная. Наверное, нужно сделать так: Задаем переменную, которая показывает какой столбец сейчас активный. По умолчанию задаем ей значение 0. При нажатии стрелок увеличиваем/уменьшаем ее значение на 1 (не забываем поставить ограничение, чтобы значение переменной не получилось отрицательным или большим чем количество столбцов -1).
В коде (в Draw и в событиях нажатия клавиш мыши) убираем строки for (slot_x=0; slot_x<inv_width_x; slot_x+=1) и slot_x в коде заменяем на нашу переменную (про которую я написал выше). Возможно (скорее всего), нужно будет еще изменить настройки маски инвентаря. Они задаются в событии Create (где-то в начале, там есть комментарии). Маска размером как одна ячейка растягивается по Х и У таким образом, чтобы она покрывала все ячейки - нужно убрать растягивание по Х, оставить только по У.
|
|
|
|
|
Записан
|
|
|
|
Reylor
Пользователь
 
Репутация: 1
Offline
Пол: 
API: Game Maker 8.0 Pro
Деятельность: Чём я занимаюсь в игрострое?... хм. да всем с чем приходится работать. Всего по немногу.
Сообщений: 90
|
 |
« Ответ #268 : Декабрь 28, 2012, 22:27:29 » |
|
a = false;
//поиск первого предмета for (slot_y=0; slot_y<inv_height_y; slot_y+=1) { for (slot_x=0; slot_x<inv_width_x; slot_x+=1) { if (txt[slot_x,slot_y]='зелье') { a = true; } } } if (a) { a = false for (slot_y=0; slot_y<inv_height_y; slot_y+=1) { for (slot_x=0; slot_x<inv_width_x; slot_x+=1) { if (txt[slot_x,slot_y]='Меч') { a = true; } } } }
if (a) { draw_sprite(spr_sword_red,0,x=obj_inv2,y=obj_inv2)//решил рисовать через draw_sprite }
|
|
|
|
|
Записан
|
|
|
|
Vulcano
Новичок
Репутация: 0
Offline
API: Game Maker 8.0 Pro
Сообщений: 3
|
 |
« Ответ #269 : Декабрь 28, 2012, 23:10:42 » |
|
Сделал все так, как было подсказано. Остается пара вопросов и как обычно незавершенный код. 1. slot_x стоило убрать из всех строк и заменить его новой переменной, определяющей столбец? Даже из массивов (spr[], txt[] и т.д.) 2. весь код отрисовки стоит оставить в draw объекта инвентаря, или можно перенести его в draw стрелок и отрисовывать нужные ячейки массивов в момент нажатия при изменении переменной (скорее можно и так и так, но у меня не получается). 3. я ограничил отрисовку ячеек инвентаря относительно размера, т.о. у меня получилось в каждой колонке он рисует только 5 ячеек - это вообще правильно, т.к. в неотрисованные ячейки просто не записываются взятые предметы. Я прекрасно понимаю, что взятый предмет сначала записывается в массив, а уже потом отрисовывается в определенной ячейке, но с такими ограничениями как у меня, вылазит ошибка: __________________________________________ ERROR in action number 1 of Collision Event with object hero_1 for object hero_boom:
Error in code at line 47: if (txt[inv_stolb,slot_y]='')//когда находим свободную ячейку ^ at position 40: Cannot compare arguments.
Почему программа считает slot_y неизвестной? На мой взгляд потому, что следующая позиция массива просто не отрисована и отображаться спрайту следующего взятого предмета - негде. Как это исправить? Рисовать все сразу и делать ячейки массива невидимыми, это вообще может помочь или я опять что-то недопонимаю? 4. код draw теперь выглядит так: if inv_stolb=0 { for (slot_y=0; slot_y<5; slot_y+=1) { draw_sprite(sprite_index,image_index,x+inv_stolb*slot_width_x,y+slot_y*slot_height_y); { draw_sprite(spr[inv_stolb,slot_y],image_index,x+inv_stolb*slot_width_x,y+slot_y*slot_height_y); draw_set_color(c_black); 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); } } } if inv_stolb=1 { for (slot_y=5; slot_y<10; slot_y+=1) { draw_sprite(sprite_index,image_index,x+inv_stolb*slot_width_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+inv_stolb*slot_width_x,y+slot_y*slot_height_y); draw_set_color(c_black); 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); } } }
Верно ли я понял ваши замечания, либо вконец все испортил и снова иду в неправильном направлении? Вроде бы все, я правда, стараюсь, однако, как видите, получается плохо. Заранее спасибо за проявленное внимание, жду хоть каких-нибудь советов по теме.
|
|
|
|
|
Записан
|
|
|
|
|