Среда, 06 Ноября 2024, 02:25

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Нужна помощь с инвентарем.
CmaujlukДата: Суббота, 10 Августа 2013, 19:17 | Сообщение # 1
участник
Сейчас нет на сайте
Всем привет!
Дошёл я наконец-то до одного из сложных элементов игростроя - инвентаря, и... встрял wacko
Делал по примеру, понял как он работает, но не понял как его можно модернизировать.

Есть объект который отвечает за создание спрайта инвентаря. В нем код на глобальное зажатие ЛКМ
Код
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, пишем:
Код
instance_destroy()

Дальше идем к 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
}


Но вот люди! У меня возникла проблема!) Я делал пример на основе этого вопроса! И у меня возникли непонятки х) Я всю голову сломал и не пойму в чём дело wacko
В инвентаре испаряется почему-то жёлтый круг, если на него навести и отпустить другим предметом. Я уже не понимаю в чём может быть проблема...

Скачать пример.

Всё, разобрался) там в условии при отпускании мыши была проверка if obj_inv_items.item_sprite[current_x,current_y] { /* ... */ } А у Спрайтка item0s номер был равен нулю. Добавил проверку если не равно noone. Теперь пример рабочий) Можете пользоваться, хотя я бы реализовал инвентарь совершенно иначе и проще, используя лишь один объект controller.


Сообщение отредактировал Kazerex - Суббота, 10 Августа 2013, 21:07
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг