Инвентарь при помощи массива. - Помогите, не получается! - Разработка игр на Game Maker (Simple Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Помогите, не получается! » Инвентарь при помощи массива. (И снова хелп.)
Инвентарь при помощи массива.
Nik Дата: Воскресенье, 08.08.2010, 13:18 | Сообщение # 1
Болтун
Группа: Проверенные
Сообщений: 211
Статус: Offline
Собственно вот http://gm-rus.ru/index.p....id=6263
Вроде хорошая статья, но одно не ясно. Вот отрисовали мы сам инвентарь (ячейки) Сделали список вещей. По названию вещи находим её id, по первому элементу массива item[3,0]='Шлем', id=3. А дальше? Где прописываются вещи которые у нас в инвентаре? Как они добавляются в инвентарь? Сижу, весь вечер бъюсь со скриптом add_item, так и не добил. Прошу объяснить, хотя бы в общих словах.

Да, и из названия темы запятую уберите.

Добавлено (08.08.2010, 13:18)
---------------------------------------------
Что, неужели никто не подскажет?



Сообщение отредактировал Nik - Пятница, 06.08.2010, 14:58
 
Ang3L Дата: Воскресенье, 08.08.2010, 13:56 | Сообщение # 2
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Первое что мы выясняем что инвентарь это кучка данных. Данные надо как-то хранить. Для хранения что ты выбрал? Статичный двумерный массив. Что мы о них знаем? То что они имеют фиксированный размер, т.е. в массив ничего НЕЛЬЗЯ ни добавлять, ни удалять, только изменять данные и прямой доступ к любой ячейке. Теперь нужно определится что хранится в строках, а что в столбах. На картинке снизу, строки - предметы, а столбцы их свойства (белые клетки - реальные данные, то что хранится в памяти; серые клетки - просто описание, чтобы понятнее было).

Как мы видим, где вещи есть там есть данные, где их нет - нули. Точнее вещи нет, если образующее свойство (допустим тип вещи) нулевое - т.е. тип = пусто. Если(тип == пусто) то не читаем этот предмет, тут ничего нет. Тут есть нюанс, пусто необязательно значит ноль. Пустым типом можно сделать единичку или строку "null", а ноль оставить под ошибочный тип, потому что в ГМ по умолчанию переменные автоматически инициализируются нулём. Так мы сможем намного проще выловить ошибки в инвентаре, если вдруг чего.
Чтобы добавить или удалить вещь нужно полностью заменить строку. Если удаляем предмет - ставим тип пустым, остальные данные тоже пустые. Если добавляем, то ставим тип на нужный и заполняем данные. На примере таблице (та что выше):

  • Заходим в клетку [0,3] (нулевое место, третья строчка - тут хранится тип третьего предмета): ставим "Меч";
  • Заходим в клетку [1,3] (тут спрайт): ставим спрайт меча;
  • Заходим в клетку [2,3] (а тут название): ставим название: "Супер меч".
    Всё просто. Магия начинается когда всё это будет динамическим и когда нужно будет сделать уникальные свойства (допустим Атака. К атакующим предметам. Её же нет у шлема. И тут нужно будет извернуться)
  • Прикрепления: 4727241.png(26Kb)


    Blogpost
     
    Nik Дата: Воскресенье, 08.08.2010, 14:44 | Сообщение # 3
    Болтун
    Группа: Проверенные
    Сообщений: 211
    Статус: Offline
    Ang3L, Спасибо, что всё так расписал конечно...
    Это-то всё понятно. Я представляю, что такое массив, по сути та же матрица. Вот мне интересен, конкретно этот пример - мы создаем массив, где хранятся все вещи - это база данных. Далее, рисуем сам инвентарь. Затем, по названию вещи, определяем её идентификатор. Ищем в БД - Меч пиратов, его ид будет 2. Далее... Вот тут загвоздка. Что происходит, после того как мы определили положение предмета в БД. Как он добавляется, как рисуется, как убирается? Я не могу понять, инвентарь же не представляется как массив и нет элемента массива БД показывающего, есть ли предмет в инвентаре... Можно этот момент по подробнее, плиз.


    Сообщение отредактировал Nik - Воскресенье, 08.08.2010, 14:44
     
    Ang3L Дата: Воскресенье, 08.08.2010, 15:22 | Сообщение # 4
    Каждый 5й пост мой
    Группа: Админы
    Сообщений: 2667
    Статус: Offline
    Quote (Общее)
    Чтобы добавить или удалить вещь нужно полностью заменить строку.

    Quote (Удаление)
    Если удаляем предмет - ставим тип пустым, остальные данные тоже пустые.

    Quote (Добавление с примером)
    Если добавляем, то ставим тип на нужный и заполняем данные. На примере таблице (та что выше):
    1) Заходим в клетку [0,3] (нулевое место, третья строчка - тут хранится тип третьего предмета): ставим "Меч";
    2) Заходим в клетку [1,3] (тут спрайт): ставим спрайт меча;
    3) Заходим в клетку [2,3] (а тут название): ставим название: "Супер меч".

    Quote (Nik)
    инвентарь же не представляется как массив

    Инвентарь мы можем представить как угодно! Вот этот момент очень важен. Представление инвентаря на экране не одно и то же что в памяти! Это надо чётко понимать. Я уже сотни раз об этом говорил, написал статью (она единственная у меня, только там в общем случае: Представление программы на экране не одно и то же что в памяти. И это очень важное знание для понимания программ). А как угодно тебе, я не знаю.

    Quote (Nik)
    есть ли предмет в инвентаре...

    Quote (Ang3L)
    Если(тип == пусто) то не читаем этот предмет, тут ничего нет.

    Может быт так понятнее:
    Code
    if(inv[0, 2] == "null") //то пусто

    Code
    if(inv[0, 2] == "меч") //то тут меч

    Я ж всё написал, ты как читал-то? Не знаешь что такое пусто? Читаем далее:
    Quote (Ang3L)
    пусто необязательно значит ноль. Пустым типом можно сделать единичку или строку "null"

    Может непонятна эта структура:

    Code
    inv[property, id]; //возвращает что находится в этой клетке

    Где property - свойство (столбец), а id - номер объекта (строка). Например, мне нужно такое-то свойство, такого-то объекта. Мы обходим весь массив по столбцу "тип". Если тип не пустой, то рисуем спрайт с индексом inv[1, текущий_объект] (1 - индекс_спрайта). и т.д.

    Вроде бы несложно. Я уж и не знаю что именно нужно подробнее.



    Blogpost
     
    Nik Дата: Понедельник, 09.08.2010, 02:00 | Сообщение # 5
    Болтун
    Группа: Проверенные
    Сообщений: 211
    Статус: Offline
    Ang3L,
    Я одного не могу понять, список вещей у нас массив item[x,y]. Пустые ячейки инвентаря массив cell[x,y], на сколько я понял. Для добавления предмета в инвентарь пишем inv.cell[item_cell_id,30], где tem_cell_id его id предмета, конкретно, - его название. Но хранятся-то они в массиве item!!! Соответственно, когда я делаю так, ничего не добавляется, а в примере все работает. Не могу понять как.
    Если можно, в коде. Пускай есть массив item[x,y] - это БД, всех предметов с их свойствами, имя,спрайт. Инвентарь - это cell[x,y]. Допустим все ячеки в нем = null, я хочу какой-то предмет из БД, поместить в инвентарь, как это будет выглядеть в коде? Я понимаю, что нужна какая-то ссылка на массив БД, но как? Вот чего я не могу понять, как работает.


    Сообщение отредактировал Nik - Понедельник, 09.08.2010, 02:01
     
    SkipH Дата: Понедельник, 09.08.2010, 05:31 | Сообщение # 6
    Болтун
    Группа: Проверенные
    Сообщений: 220
    Статус: Offline
    в item[x,y] хранится информация о вещах, а cell[] это сам инвентарь. При добавление в инвентарь все параметры о вещи копируются в инвентарь из .
    базы, ссылкой по сути является имя вещи. А скрипт можешь посмотреть add_item.

    От себя хочу добавить(так как использую похожую систему в one_world) что лучше все таки использовать динамические структуры(я использую ds_grid), так как открывается больше возможностей, например очень легко изменять размер инвентаря. Более простая работа со скриптами при использовании нескольких инвентарей, сообщая ид инвентаря скрипту.
    Еще для идентификации вещи лучше использовать не имя а позицию вещи в базе, тогда отпадает необходимость поиска вещи в базе.
    Да и хранить все данные в инвентаре о вещи тоже думаю не стоит, в инвентаре достаточно ид вещи, количество вещей, ну и какие-нибудь параметры которые у одной и той же вещи могут быть разными.



    Robot v0.7 <200 kb форум
    One world v0.5~1.6 mb форум
     
    Nik Дата: Понедельник, 09.08.2010, 07:01 | Сообщение # 7
    Болтун
    Группа: Проверенные
    Сообщений: 211
    Статус: Offline
    SkipH, Это понятно, и про скрипт add_item. И храниться там ид вещи.
    Раз делал похожий инвентарь, будь другом, напиши кусок кода для ссылки одного массива на другой. Т.е, чтобы в массиве cell хранились ссылки на адрес вещи из item.
    Что мешает изменять размер инвентаря при использовании массивов?


    Сообщение отредактировал Nik - Понедельник, 09.08.2010, 07:02
     
    OPALsmoke Дата: Понедельник, 09.08.2010, 10:20 | Сообщение # 8
    Хрен заткнешь
    Группа: Проверенные
    Сообщений: 347
    Статус: Offline
    Nik add_item() (мой скрипт)
    add_item(argument0,argument1,item_name[argument0],item_ves[argument0],item_type[argument0],item_use[argument0],item_money[argument0],item_dis[argument0],item_img[argument0])

    box[i,d] // Это ID итема. 1...99999

    Code

    with OPS
    {
             for (d=1;d<=inv_h;d+=1) // Размеры инвентОря
             for (i=1;i<=inv_w;i+=1) // Размеры инвентЫря
             {
             if box[i,d]=0 // Если в ячейке пусто, создаем новую и вбиваем информацию
             {
             box[i,d]=argument0 // По желанию. Смотря какие данные хочешь сохранить
             count[i,d]=argument1
             name[i,d]=argument2
             ves[i,d]=argument3
             type[i,d]=argument4
             use[i,d]=argument5
             money[i,d]=argument6
             dis[i,d]=argument7
             img[i,d]=argument8
             //---Добавляем вес
             all_ves+=argument1*argument3
             exit;
             }
             else
             if box[i,d]=argument0 // Если уже есть ячейка, с однотипным обьектом, создаем стек.     
             {
             count[i,d]+=argument1
             //---Добавляем вес
             all_ves+=argument1*argument3
             exit;
             }
             }
    }


    gmexe.ru

    Сообщение отредактировал OPALsmoke - Понедельник, 09.08.2010, 20:49
     
    Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Помогите, не получается! » Инвентарь при помощи массива. (И снова хелп.)
    Страница 1 из 11
    Поиск:



    Сообщество Gmaker.SU 2005-2012
    Используются технологии uCoz
    Простой вход