| Инвентарь при помощи массива. |
|
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] (а тут название): ставим название: "Супер меч". Всё просто. Магия начинается когда всё это будет динамическим и когда нужно будет сделать уникальные свойства (допустим Атака. К атакующим предметам. Её же нет у шлема. И тут нужно будет извернуться)
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 |
| |
| |
|
|