Нужна помощь с инвентарем.
|
|
Cmaujluk | Дата: Суббота, 10 Августа 2013, 19:17 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Всем привет! Дошёл я наконец-то до одного из сложных элементов игростроя - инвентаря, и... встрял Делал по примеру, понял как он работает, но не понял как его можно модернизировать.
Есть объект который отвечает за создание спрайта инвентаря. В нем код на глобальное зажатие ЛКМ Код if mouse_x>view_xview[0]+sprite_dx if mouse_x<view_xview[0]+sprite_dx + 500 if mouse_y>view_yview[0]+sprite_dy if mouse_y<view_yview[0]+sprite_dy + 300 // входит ли мышка в область { current_x=(mouse_x-(view_xview[0]+sprite_dx)) div cell_size current_y=(mouse_y-(view_yview[0]+sprite_dy)) div cell_size //высчитывается координаты клеток if item_sprite[current_x,current_y]//если в клетке присутствует предмет то { temporary_item=instance_create(mouse_x,mouse_y,obj_temporary_item) //создать объект obj_temporary_item который прикреплен к мышке(в другом коде) temporary_item.sprite_index=item_sprite[current_x, current_y] //сделать этому объекту спрайт который мы подобрали в ячейке temporary_item.adds_x=current_x //запомнить координаты по х temporary_item.adds_y=current_y//запомнить координаты по у item_sprite[current_x, current_y] = -1//удалить спрайт из ячейки инвентаря } } Всё, мы забрали предмет(спрайт) из ячейки и он теперь передвигается за мышкой Далее идет код глобального отпускания ЛКМ в obj_temporary_item(созданном объекте) Код sprite_dx=obj_inv_items.sprite_dx sprite_dy=obj_inv_items.sprite_dy cell_size=obj_inv_items.cell_size//присваиваем значения таким как в объекте инвентаря if mouse_x>view_xview[0]+sprite_dx if mouse_x<view_xview[0]+sprite_dx + 500 if mouse_y>view_yview[0]+sprite_dy if mouse_y<view_yview[0]+sprite_dy + 300 //расписываем размеры инвентаря { current_x=(mouse_x-(view_xview[0]+sprite_dx)) div cell_size current_y=(mouse_y-(view_yview[0]+sprite_dy)) div cell_size//записываем координаты if obj_inv_items.item_sprite[current_x,current_y] //если место занято obj_inv_items.item_sprite[adds_x,adds_y]= sprite_index //вернуть предмет на место else//иначе { obj_inv_items.item_sprite[current_x,current_y] = sprite_index //переместить его } instance_destroy()//начальный объект удаляется } Могу выложить код полностью но вроде и так постарался объяснить понятно. Теперь сама суть, мне нужно чтобы если клетка занята то предметы менялись местами, а не чтобы предмет возвращался на место. Пробовал по разному и вводить переменные и с кодом экспериментировать, всё без толку. Надеюсь на вашу помощь, с меня+.
Не жадный на плюсы. Наши проекты: Clicker Mine Mania 2 - Увлекательный кликер в стиле Minecraft Angry Bee Evolution - Эволюция с элементами кликера Чего не хватает? - Викторина на логику"
|
|
| |
lisiyrak | Дата: Суббота, 10 Августа 2013, 20:18 | Сообщение # 2 |
Hero of bacon
Сейчас нет на сайте
| Цитата одного из сложных элементов игростроя - инвентаря
Не думаю, что инвентарь сделать сложно..
KEKW
Сообщение отредактировал lisiyrak - Суббота, 10 Августа 2013, 20:29 |
|
| |
Cmaujluk | Дата: Суббота, 10 Августа 2013, 20:29 | Сообщение # 3 |
участник
Сейчас нет на сайте
| Цитата (lisiyrak) Не думаю, что инвентарь сделать сложно.. Пожалуйста без оффтопа.
Не жадный на плюсы. Наши проекты: Clicker Mine Mania 2 - Увлекательный кликер в стиле Minecraft Angry Bee Evolution - Эволюция с элементами кликера Чего не хватает? - Викторина на логику"
|
|
| |
lisiyrak | Дата: Суббота, 10 Августа 2013, 20:29 | Сообщение # 4 |
Hero of bacon
Сейчас нет на сайте
| Cmaujluk, вообще, чтобы сделать то, что ты хочешь, надо в тот момент, когда ты берешь предмет записать в отдельные переменные координаты ячейки(из которой ты брал предмет). А потом, когда ты кладешь предмет, если ячейка занята, спрайт это ячейки должно перенести на записанные координаты, а спрайт, который находится в мышке поместить на эту ячейку.
Яснее объяснить не могу.
KEKW
Сообщение отредактировал lisiyrak - Суббота, 10 Августа 2013, 20:32 |
|
| |
Cmaujluk | Дата: Суббота, 10 Августа 2013, 20:34 | Сообщение # 5 |
участник
Сейчас нет на сайте
| Да это я и сам понял, как реализовать не знаю. Цитата (lisiyrak) когда ты берешь предмет записа/ть в отдельные переменные координаты ячейки(из которой ты брал предмет) Код temporary_item.adds_x=current_x //запомнить координаты по х temporary_item.adds_y=current_y//запомнить координаты по у Вот думаю как списать координаты ячейки которая занята.
Не жадный на плюсы. Наши проекты: Clicker Mine Mania 2 - Увлекательный кликер в стиле Minecraft Angry Bee Evolution - Эволюция с элементами кликера Чего не хватает? - Викторина на логику"
|
|
| |
CreatingOver | Дата: Суббота, 10 Августа 2013, 20:37 | Сообщение # 6 |
ColdGamedev
Сейчас нет на сайте
| Спрайты: spr_inv - ячейка инвентаря spr_mech - наш первый (и пока единственный) предмет.
Теперь создадим 3 объекта: obj_inv - ячейка obj_mech - меч obj_drawing_mech - взятый меч.
Создаем ячейке столкновение с obj_drawing_mech, пишем: Дальше идем к obj_mech. В Left Pressed пишем: Код instance_create(obj_inv.x,obj_inv.y,obj_drawing_mech) instance_destroy() if instance_number(obj_inv)=0 {show_message('Мест нет.')} Теперь создаем комнату и расставляем все объекты как хотим. Готово =) Все.
Я снова с вами:з Возвращение легенды. (нет)
|
|
| |
lisiyrak | Дата: Суббота, 10 Августа 2013, 20:38 | Сообщение # 7 |
Hero of bacon
Сейчас нет на сайте
| Cmaujluk, попробуй.
Код if mouse_y>view_yview[0]+sprite_dy if mouse_y<view_yview[0]+sprite_dy + 300 //расписываем размеры инвентаря { current_x=(mouse_x-(view_xview[0]+sprite_dx)) div cell_size current_y=(mouse_y-(view_yview[0]+sprite_dy)) div cell_size//записываем координаты if obj_inv_items.item_sprite[current_x,current_y] //если место занято { obj_inv_items.item_sprite[adds_x,adds_y]= obj_inv_items.item_sprite[current_x,current_y] //эта строка все делает
obj_inv_items.item_sprite[current_x,current_y] = sprite_index } else//иначе { obj_inv_items.item_sprite[current_x,current_y] = sprite_index //переместить его } instance_destroy()//начальный объект удаляется }
KEKW
Сообщение отредактировал lisiyrak - Суббота, 10 Августа 2013, 20:39 |
|
| |
Cmaujluk | Дата: Суббота, 10 Августа 2013, 20:45 | Сообщение # 8 |
участник
Сейчас нет на сайте
| Цитата (lisiyrak) Cmaujluk, попробуй. Lol! Работает! Пробовал то же самое, не прокало. С меня +
Не жадный на плюсы. Наши проекты: Clicker Mine Mania 2 - Увлекательный кликер в стиле Minecraft Angry Bee Evolution - Эволюция с элементами кликера Чего не хватает? - Викторина на логику"
|
|
| |
Kazerex | Дата: Суббота, 10 Августа 2013, 20:48 | Сообщение # 9 |
был не раз
Сейчас нет на сайте
| Пока разбирал код и делал пример, lisiyrak немного опередил)
Там нужно исправить лишь код выполняемый в этом условии в такой вид: Код if obj_inv_items.item_sprite[current_x,current_y] {//если место занято obj_inv_items.item_sprite[adds_x,adds_y]=obj_inv_items.item_sprite[current_x,current_y] obj_inv_items.item_sprite[current_x,current_y]=sprite_index }
Но вот люди! У меня возникла проблема!) Я делал пример на основе этого вопроса! И у меня возникли непонятки х) Я всю голову сломал и не пойму в чём дело В инвентаре испаряется почему-то жёлтый круг, если на него навести и отпустить другим предметом. Я уже не понимаю в чём может быть проблема...
Скачать пример.
Всё, разобрался) там в условии при отпускании мыши была проверка if obj_inv_items.item_sprite[current_x,current_y] { /* ... */ } А у Спрайтка item0s номер был равен нулю. Добавил проверку если не равно noone. Теперь пример рабочий) Можете пользоваться, хотя я бы реализовал инвентарь совершенно иначе и проще, используя лишь один объект controller.
Сообщение отредактировал Kazerex - Суббота, 10 Августа 2013, 21:07 |
|
| |