Добавлено (06.04.2013, 23:20) --------------------------------------------- Опишите, игра будет одиночная или многопользовательская, укажите жанр
Добавлено (06.04.2013, 23:23) --------------------------------------------- Мне кажется,что наиболее актуальным жанром игры для соц. сети будет RPG/Квест/Шарики RPG-интересно и модно Квест- увлекающе Шарики-вечная игра
AlexRabbit, Одна голова хорошо- а две лучше. То бишь: Н-р один программист пишет код,а другой просматривает его(код) еще раз,смотрит что можно сократить,где что подправить. Знаю для проверки кода есть специальные программы,но все же лучше,если его просмотрит человек знающий сей язык программирования
Во-первых называя меня школотой вы очень ошибаетесь. Во-вторых исправьте ошибку
Цитата (Маркер)
Цитата (AlexRabbit) Зачем Вам второй программист?
Потому что первый программист ничего не умеет. Цитата (DataTravel23) Не переводится
Переводится. Смотри: "СтудияНовогоВремени".
Я прекрасно знаю перевод,но по-английски оно лучше звучит. "Первый программист ничего не умет"- как вы можете судить о том что я умею,а что нет прочитав лишь одну мою тему?
Цитата (mef1sto)
А сами вы, сударь, чьими будете? И зачем столько негатива? Наш гражданский долг оказывать моральную поддержку каждому начинающему гейм-девелоперу.
Хоть что-то радует
Цитата (Жужа)
DataTravel23, правильно говорят, спрайтыытй обычно рисуют, а не в интернете ищут, иначе как расценивать твою фразу: Цитата (DataTravel23) Хотя если игры станут коммерческими,то за деньги соответственно
Я прекрасно знаю что спрайты рисуют. Мало кто бесплатно согласится рисовать. ___ Не надо здесь набивать посты О как же я люблю гневные отзывы
Название: NewTimeStudio (NTS) Не переводится О команде: Цель Создание красивых и интересных 2D игр Условия работы Энтузиазм. Хотя если игры станут коммерческими,то за деньги соответственно Состав: DataTravel23 (больше известна как Эйли-Ми или Night) Направление: Программирование игр,иногда рисование Zellt Направление: Поиск 2d спрайтов,советчик Требуется Программист (знание C++ желательно но не обязательно, знание какого-либо движка/конструктора 2d игр) Художник (рисование 2d спрайтов Проекты: Skyline- в разработке. На 30.04.2013 намечается альфа-тестирование
[spoiler=Как сделать предмет,который нельзя выбросить( 1 способ-для 1.0064 версии и выше,2-ой для любой версии.] Был недавно вопрос про то, как сделать не выбрасываемый предмет. Конкретного кода я так и не дал. Вот два варианта:
1. Добавить новый тип предметов (например 8), которые нельзя выбрасывать. В событии Глобальное отпускание ПКМ, после последнего else (после строки 182) добавить проверку типа предмета, если тип который нельзя выбрасывать - возвращаем на место: Код:
Код
if (inv_item_type == 8) { txt[inv_item_x,inv_item_y]=inv_txt;//записываем в массив имя
inv_txt='';//ничего не перетаскиваем exit;//завершаем выполнение кода (чтобы предмет не удалился) }
2. Все то же самое, только проверку делать не по типу предмета, а по имени предмета, имени объекта или спрайту предмета (тут кому как нравится). Можно перечислить несколько предметов которые нельзя выбрасывать, например: Код:
Код
if (inv_name_obj == obj_potion_mana or inv_name_obj == obj_potion_health) { txt[inv_item_x,inv_item_y]=inv_txt;//записываем в массив имя
inv_txt='';//ничего не перетаскиваем exit;//завершаем выполнение кода (чтобы предмет не удалился) }
Кроме этого не забываем про то что предметы еще можно выбрасывать при нажатии ПКМ+Shift. По этому в событии Нажатие Правой Клавиши Мыши добавим такую же проверку, только наоборот, после проверки нажатия клавиши Shift и проверки наличия предмета в слоте (после 19 строки), должно получиться так:
для способа №1 Код:
Код
if (keyboard_check(vk_shift))//Если зажата клавиша Shift { if (txt[klick_x,klick_y]!='')//елси в слоте, над которым находится курсор, что-то есть { if (item_type[klick_x,klick_y] != 8) {
для способа №2 Код:
Код
if (keyboard_check(vk_shift))//Если зажата клавиша Shift { if (txt[klick_x,klick_y]!='')//елси в слоте, над которым находится курсор, что-то есть { if (name_obj[klick_x,klick_y] != obj_potion_mana and name_obj[klick_x,klick_y] != obj_potion_health) {
[spoiler=Как сделать,что бы в инвентаре отображались уменьшенные спрайты объектов(для любой версии)] Можно легко сделать чтобы в инвентаре для каждого предмета отображался не его спрайт, а какой-то другой. Например у нас есть предмет "корова" - спрайт в несколько раз больше чем ячейка инвентаря, а нам нужно чтобы в инвентаре отображался маленький спрайт. Для этого у каждого объекта "предмета" добавляем в событие Create строчку с переменной, в которую записываем индекс спрайта, который должен отображаться в инвентаре: Код:
У объекта - родителя для всех предметов в событии столкновения заменить строки (их две одинаковые, 8 и 28): Код:
Код
other.spr[other.slot_x,other.slot_y]=sprite_index;//записываем в массив какой спрайт отображать в нивентаре
на это: Код:
Код
other.spr[other.slot_x,other.slot_y]=sprite_mini;//записываем в массив какой спрайт отображать в нивентаре
Переменную sprite_mini можете назвать как вам наравится[/spoiler] [spoiler=Как добавить крафт(версия 1.0064,но для версии 1.0024 аналогично)] Во вложении есть пример Пример_инвентаря_Dva_Kota_Bodimir_Alexis_1.0064_rpg_mod + equipment + craft_1.0002 - это пример инвентаря с крафтом (все комментарии в скрипте scr_craft). Крафт очень примитивный. Если в одной ячейке нет достаточного количества предметов для крафта (они разложены по нескольким ячейкам) - не сработает. Добавил скрипт scr_craft - код там почти такой же, но использовать скрипт проще. Формат скрипта: scr_craft(объект_который_будет_создан_при_крафте,первый_ингредиент,количество_первого_ингредиента, второй_ингредиент, количество_второго_ингредиента). Можно легко сделать больше ингредиентов, добавив еще пару аргументов в скрипт и увеличив значение переменной n. В примере использование скрипта стоит в событии нажатия клавиши "F" у основного инвентаря.
Код
//Максимальное число ингредиентов для крафта в этом примере скрипта - 2. //если нужно увеличить/уменьшить количество ингредиентов - добавьет/уберите пару аргументов (массивы craft_name[] и craft_number[])
//Если какой-то ингридиент не нужен - вместо аргументов 1 или 3 должена быть произвольная строка, не совпадающую ни с одним из названий предметов (не пустая строка и не пробел!)
//argument0 - то что должно получиться craft_name[0] = argument1; //ингридиент 0 craft_number[0] = argument2; //необходимое количество ингридиента 0 craft_name[1] = argument3; //ингридиент 1 craft_number[1] = argument4; //необходимое количество ингридиента 1
craft[0]=false;//нашли ли мы нужное количество ингридиента 0 craft[1]=false;//нашли ли мы нужное количество ингридиента 1
n = 2; //максимельное количество ингредиентов
for (slot_y=0; slot_y<inv_height_y; slot_y+=1)//выбираем строку инвентаря для проверки { for (slot_x=0; slot_x<inv_width_x; slot_x+=1)//проверяем все ячейки в этой строке, а потом опять выполнится сторка выше и мы перейдем к следующепй строке инвентаря { for(i = 0; i < n; i += 1)//сравниваем предмет в этой ячейке со всеми ингридиентами { if (craft_name[i] = txt[slot_x,slot_y]) { if (item[slot_x,slot_y]>=craft_number[i] and !craft[i])//если предметов достаточное количество и мы еще не находили этот предмет { craft[i]=true; craft_x[i]= slot_x; craft_y[i]= slot_y; } } } } }
//Теперь смотрим все ли ингридиенты для крафта у нас есть: if (craft[0] and craft[1]) { for(i = 0; i < n; i += 1)//здесь n - максимальное число ингредиентов для крафта { if (item[craft_x[i],craft_y[i]] > craft_number[i])//если в ячейке предметов больше, чем нужно для крафта { item[craft_x[i],craft_y[i]] -= craft_number[i];//удаляем нужное количество предметов из ячейки (просто уменьшаем количество) } else//если в ячейки предметов столько, сколсько нужно для крафта {//очищаем переменные для ячейки из которой перетаскивали (удаляем предмет из инвентаря) txt[craft_x[i],craft_y[i]]=''; item[craft_x[i],craft_y[i]]=0; max_number[craft_x[i],craft_y[i]]=0; } } //здесь код того что должно произойти (созлдание нового предмета) instance_create(obj_hero.x-16,obj_hero.y+16,argument0); //предмет создается ниже игрока. Можно создавать предмет сразу в координатах игрока, тогда он сразу будет попадать в инвентарь (если там есть место) }
[/spoiler]
Код
with (obj_inv)//выполняем код для объекта obj_inv { for (slot_y=0; slot_y<inv_height_y; slot_y+=1)//выбираем строку инвентаря для проверки { for (slot_x=0; slot_x<inv_width_x; slot_x+=1)//проверяем все ячейки в этой строке, а потом опять выполнится сторка выше и мы перейдем к следующепй строке инвентаря { txt[slot_x,slot_y]='';//очищаем переменные для этой ячейки (удаляем предмет из инвентаря) item[slot_x,slot_y]=0; max_number[slot_x,slot_y]=0; } } }
[spoiler=Как назначить горячие клавиши слотов(Для версии 1.0064, для 1.0028 аналогично)]Для более ранних версия (где один инвентарь) достаточно скопировать код из события нажатия левой клавиши мышки в события нажатия горячей клавиши для слота.
В переменные klick_x и klick_y мы записываем координаты ячейки для использования. Если нужно чтобы горячие клавиши действовали и при свернутом инвентаре - уберите проверку visible в перовй строке. Код:
Код
//Использование предмета. /*вычисляем на какой ячейке находится курсор (тут вычисляются не координаты, а как бы элемент массива которому принадлежит ячейка над которой курсор*/ if (visible and inv_txt='' and obj_inv_weapon.inv_txt='' ) { klick_x=0;//координаты ячейки для использования предмета klick_y=0;
if (txt[klick_x,klick_y]!='')//елси в слоте, над которым сейчас находится курсор, что-то есть { with (obj_inv_weapon) {//задаем координаты ячеек в которые можно переместить данный предмет. Сначала -1, это означает что перемещать нельзя, дальше зададим реальные координаты //количество пар переменных = максимальное количество слотов для данного типа предмета //в нашем примере максимальное количество слотов для одного типа предметов 2 (это два оружия и два кольца) //Вы можете сделать больше одинаковых ячеек, добавив еще пары переменных здесь и в коде ниже n_x_1 = -1; n_y_1 = -1; n_x_2 = -1; n_y_2 = -1;
switch (other.item_type[other.klick_x,other.klick_y])//Выбираем в зависимости от типа предмета какое действие выполнить {//типр предмета: 0 - обычный предмет, 1 - оружие, 2 - шлем, 3 - броня, 4 - обувь, 5 - перчатки, 6 - амулет, 7 - кольца case 0: execute_string(other.act_on[other.klick_x,other.klick_y]); break;//для обычных предметов типа 0 просто выполняем тот код, который в них записан //дальше идет определение координат ячеек, в которые можно переместить предметы, которые игрок моежет надевать //если переменные n_x_2 и n_y_2 здесь не определены, значит из значение -1 и для этого типа предметов предназначен только один слот case 1: n_x_1 = 0; n_y_1 = 1; n_x_2 = 2; n_y_2 = 1; break; case 2: n_x_1 = 1; n_y_1 = 0; break; case 3: n_x_1 = 1; n_y_1 = 1; break; case 4: n_x_1 = 1; n_y_1 = 2; break; case 5: n_x_1 = 0; n_y_1 = 0; break; case 6: n_x_1 = 2; n_y_1 = 0; break; case 7: n_x_1 = 0; n_y_1 = 2; n_x_2 = 2; n_y_2 = 2; break; } }
if (obj_inv_weapon.n_x_1 != -1) //Если этот предмет можно надеть (для тех типов предметов, которе надеть нельзя эта переменная была определена выше как -1) { //записываем все данные из этого слота в переменные для перетаскивания inv_item_x=klick_x; inv_item_y=klick_y; inv_txt=txt[klick_x,klick_y]; inv_item=1; 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]; inv_act_on = act_on[klick_x,klick_y];//записываем код, выполняемый при использовании inv_act_off = act_off[klick_x,klick_y];//записываем параметры для надеваемых предметов inv_item_type = item_type[klick_x,klick_y];//записываем тип предмета
with (obj_inv_weapon)//выполняем код для объекта obj_inv_weapon. { if (txt[n_x_1,n_y_1]='')//Если первая ячейка свободна перемещаем в нее предмет (для оружия это будет слот правой руки) { txt[n_x_1,n_y_1]=other.inv_txt;//записываем в массив имя spr[n_x_1,n_y_1]=other.inv_spr;//записываем в массив какой спрайт отображать в нивентаре item[n_x_1,n_y_1]=other.inv_item;//увеличиваем кол-во предментов на 1 name_obj[n_x_1,n_y_1]=other.inv_name_obj;//записываем имя объекта max_number[n_x_1,n_y_1]=other.inv_max_number;//записываем максимальное количество предметов в слоте act_on[n_x_1,n_y_1] = other.inv_act_on;//записываем код, выполняемый при использовании act_off[n_x_1,n_y_1] = other.inv_act_off;//записываем параметры для надеваемых предметов item_type[n_x_1,n_y_1] = other.inv_item_type;//записываем тип предмета r_weap = true;//эта переменная будет использоваться для определения в какой руке оружие: true - в правой, false - в левой (только для оружия) execute_string(act_on[n_x_1,n_y_1]);//выполняем то, что должно произойти когда надеваем предмет } else//иначе, если япервая ячейка этого типа занята проверяем вторую ячейку этого типа (если она есть) {//если в Вашем инвентаре предусмотрено больше 2-х ячеек одного типа, добавьте здесь блок кода приведенный выше (строки 70-82) подставив другие переменные вместо n_x_1 и n_y_1. Код ниже - проверка последнего слота этого типа if (n_x_2 != -1)//Если есть еще одна ячейка для этого типа предметов { if (txt[n_x_2,n_y_2]='')//Если вторая ячейка свободна перемещаем в нее предмет { txt[n_x_2,n_y_2]=other.inv_txt;//записываем в массив имя spr[n_x_2,n_y_2]=other.inv_spr;//записываем в массив какой спрайт отображать в нивентаре item[n_x_2,n_y_2]=other.inv_item;//увеличиваем кол-во предментов на 1 name_obj[n_x_2,n_y_2]=other.inv_name_obj;//записываем имя объекта max_number[n_x_2,n_y_2]=other.inv_max_number;//записываем максимальное количество предметов в слоте act_on[n_x_2,n_y_2] = other.inv_act_on;//записываем код, выполняемый при использовании act_off[n_x_2,n_y_2] = other.inv_act_off;//записываем параметры для надеваемых предметов item_type[n_x_2,n_y_2] = other.inv_item_type;//записываем тип предмета r_weap = false;//эта переменная будет использоваться для определения в какой руке оружие: true - в правой, false - в левой execute_string(act_on[n_x_2,n_y_2]);//выполняем то, что должно произойти когда надеваем предмет
other.txt[other.klick_x,other.klick_y]='';//очищаем переменные для этой ячейки (удаляем предмет из инвентаря) other.max_number[other.klick_x,other.klick_y]=0; other.item[other.klick_x,other.klick_y]=0; other.inv_txt=''; exit;//!Заканчиваем выполнение кода! } } //Если все ячейки для этого типа предметов заняты //Сначала перемещаем предмет из первого слота в инвентарь (на место того предмета, которое будем перемещать в первый слот) other.txt[other.klick_x,other.klick_y] = txt[n_x_1,n_y_1];//записываем в массив имя other.spr[other.klick_x,other.klick_y] = spr[n_x_1,n_y_1];//записываем в массив какой спрайт отображать в нивентаре other.item[other.klick_x,other.klick_y] = item[n_x_1,n_y_1];//увеличиваем кол-во предментов на 1 other.name_obj[other.klick_x,other.klick_y] = name_obj[n_x_1,n_y_1];//записываем имя объекта other.max_number[other.klick_x,other.klick_y] = max_number[n_x_1,n_y_1];//записываем максимальное количество предметов в слоте other.act_on[other.klick_x,other.klick_y] = act_on[n_x_1,n_y_1];//записываем код, выполняемый при использовании other.act_off[other.klick_x,other.klick_y] = act_off[n_x_1,n_y_1];//записываем параметры для надеваемых предметов other.item_type[other.klick_x,other.klick_y] = item_type[n_x_1,n_y_1];//записываем тип предмета r_weap = true;//эта переменная будет использоваться для определения в какой руке оружие: true - в правой, false - в левой (только для оружейных слотов) execute_string(act_off[n_x_1,n_y_1]);//выполняем то, что должно произойти когда снимаем предмет //Потом перемещаем выбранный предмет в первый слот txt[n_x_1,n_y_1]=other.inv_txt;//записываем в массив имя spr[n_x_1,n_y_1]=other.inv_spr;//записываем в массив какой спрайт отображать в нивентаре item[n_x_1,n_y_1]=other.inv_item;//увеличиваем кол-во предментов на 1 name_obj[n_x_1,n_y_1]=other.inv_name_obj;//записываем имя объекта max_number[n_x_1,n_y_1]=other.inv_max_number;//записываем максимальное количество предметов в слоте act_on[n_x_1,n_y_1] = other.inv_act_on;//записываем код, выполняемый при использовании act_off[n_x_1,n_y_1] = other.inv_act_off;//записываем параметры для надеваемых предметов item_type[n_x_1,n_y_1] = other.inv_item_type;//записываем тип предмета execute_string(act_on[n_x_1,n_y_1]);//выполняем то, что должно произойти когда надеваем предмет
other.inv_txt='';//мы ничего не перетаскиваем exit;//!Заканчиваем выполнение кода! } } } //эта часть кода выполняется для всех типов предметов: item[klick_x,klick_y]-=1;//Уменьшаем количество предметов в слоте на 1 if (item[klick_x,klick_y]=0)//если предметов больше не осталось, { txt[klick_x,klick_y]='';//очищаем переменные для этой ячейки (удаляем предмет из инвентаря) max_number[klick_x,klick_y]=0; } inv_txt=''; } }
[spoiler=Как применить привязку предметов в инвентаре(любая версия)] В объекте obj_inv в событии Draw изменить последнюю часть кода вот так (отнимать от координат курсора половину ширины и высоты спрайта предмета):
Код:
Код
if (inv_txt!='') { draw_sprite(inv_spr,image_index,mouse_x-16,mouse_y-16); }
Тогда предметы будут перетаскиваться не за верхний левый угол, а за центр спрайта, при желании можно настроить перетаскивание как Вам нужно.[/spoiler] [spoiler=Перетасивание по принципу "Нажал-перетаскиваешь,еще раз нажал-положил"(на версии 1.0064 не тестировалось)] Можно сделать чтобы предметы перетаскивались не при удержании правой кнопкой а по принципу "нажал один раз - перетаскиваешь, нажал еще раз - положил"
Событие Glob Right Released меняем на событие Glob Right Pressed и в конец добавляем else код из события Right Pressed: Схема такая: Код:
Код
"Код из события Glob Right Released" else "Код из события Right Pressed"
Код
if (inv_txt!='')//если при отпускании правой кнопки мыши мы перетаскивали предмет { if position_meeting(mouse_x,mouse_y,self)//если курсор над инвентарем { /*вычисляем на какой ячейке находится курсор (тут вычисляются не координаты, а как бы элемент массива которому принадлежит ячейка над которой курсор*/ klick_x=floor((mouse_x-x)/slot_width_x); klick_y=floor((mouse_y-y)/slot_height_y);
if (txt[klick_x,klick_y]='')//если ячейка над которой отпустили правую кнопку миыши пустая { txt[klick_x,klick_y]=inv_txt;//записываем в массив имя spr[klick_x,klick_y]=inv_spr;//записываем в массив какой спрайт отображать в нивентаре item[klick_x,klick_y]=inv_item;//Записываем количество предметов, которые мы перетаскивали max_number[klick_x,klick_y]=inv_max_number;//Записываем максимальное количество предметов, которое может быть в одной ячейке
inv_txt='';//показываем что больше ничего не перетаскиваем
txt[inv_item_x,inv_item_y]='';//очищаем переменные для ячейки из которой перетаскивали (удаляем предмет из инвентаря) item[inv_item_x,inv_item_y]=0; max_number[inv_item_x,inv_item_y]=0; } else {//если ячейка над которой отпустили правую кнопку миыши НЕ пустая if (txt[klick_x,klick_y]=inv_txt)//если там такой же предмет, какой мы перетаскиваем { if (inv_max_number=0)//если перетаскиваемые предметы можно складывать в любом количестве в одну ячейку { item[klick_x,klick_y]+=inv_item;//Добавляем все перетаскиваемые предметы в эту ячейку
inv_txt='';//показываем что больше ничего не перетаскиваем
txt[inv_item_x,inv_item_y]='';//очищаем переменные для ячейки из которой перетаскивали (удаляем предмет из инвентаря) item[inv_item_x,inv_item_y]=0; max_number[inv_item_x,inv_item_y]=0; } else { while (item[klick_x,klick_y]<inv_max_number && inv_item>0)/*добавляем предметы по одному в эту ячейку, пока она не зполнится или пока не добавим все перетаскиваемые объекты*/ { item[klick_x,klick_y]+=1;//увеличиваем количество объектов в слоте на один (добавлчем в слот один предмет) inv_item-=1;//Уменьшаем количество перетаскиваемых объектов на один } if (inv_item!=0)/*если остались еще предметы которые мы перетаскиваем (это может произойти если заполнилась ячейка в которую мы перетаскивали предметы)*/ {//Возвращаем оставшиеся предмет в ту ячейку, откуда взяли txt[inv_item_x,inv_item_y]=inv_txt;//записываем в массив имя item[inv_item_x,inv_item_y]=inv_item;//записываем оставшееся количество предметов
inv_txt='';//показываем что больше ничего не перетаскиваем } else {//если после перетаскивания предметов больше не осталось inv_txt='';//показываем что больше ничего не перетаскиваем
txt[inv_item_x,inv_item_y]='';//очищаем переменные для ячейки из которой перетаскивали (удаляем предмет из инвентаря) item[inv_item_x,inv_item_y]=0; max_number[inv_item_x,inv_item_y]=0;
} } } else//если отпустили правую кнопку мышки над предметом. отличающимся от перетаскивания {//Возвращаем предмет в ту ячейку, откуда взяли txt[inv_item_x,inv_item_y]=inv_txt;//записываем в массив имя
inv_txt='';//показываем что больше ничего не перетаскиваем } } } else //если курсор не над инвентарем { repeat(inv_item)//выбрасываем предметы (выбрасываем столько предметов, сколько находилось в ячейке) { instance_create(obj_hero.x-16,obj_hero.y+16,inv_name_obj); } inv_txt='';//показываем что больше ничего не перетаскиваем
txt[inv_item_x,inv_item_y]='';//очищаем переменные для ячейки из которой перетаскивали (удаляем предмет из инвентаря) item[inv_item_x,inv_item_y]=0; max_number[inv_item_x,inv_item_y]=0; } } else { if (visible) { if (position_meeting(mouse_x,mouse_y,self))//если курсор над инвентарем) { /*вычисляем на какой ячейке находится курсор (тут вычисляются не координаты, а как бы элемент массива которому принадлежит ячейка над которой курсор*/ klick_x=floor((mouse_x-x)/slot_width_x); klick_y=floor((mouse_y-y)/slot_height_y);
if (keyboard_check(vk_shift))//Если зажата клавиша Shift { if (txt[klick_x,klick_y]!='')//елси в слоте, над которым находится курсор, что-то есть { instance_create(obj_hero.x,obj_hero.y+32,name_obj[klick_x,klick_y]);//создаем этот объект чуть ниже игрока item[klick_x,klick_y]-=1;//Уменьшаем количество предметов в слоте на 1 if (item[klick_x,klick_y]=0)//Если предметов в слоте больше не осталось { txt[klick_x,klick_y]='';//очищаем переменные для этой ячейки (удаляем предмет из инвентаря) max_number[klick_x,klick_y]=0; } } } else {//если не нажата клавиша Shift if (txt[klick_x,klick_y]!='')//елси в слоте, над которым находится курсор, что-то есть {//записываем все данные из этого слота в переменные для перетаскивания inv_item_x=klick_x; inv_item_y=klick_y; inv_txt=txt[klick_x,klick_y]; inv_item=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];
txt[klick_x,klick_y]='empty';/*помечаем эту ячейку "пусто", но в нее пока что ничего положить нельзя будет. Если переменная txt[] будет равна 'empty', то предмет в этой ячейке рисоваться не будет, хотя фактически он будет там находиться.*/ } } } } }
Здесь в код из события Right Pressed добавлена еще одна проверка "находится ли курсор над инвентарем Код:
Код
if (position_meeting(mouse_x,mouse_y,self))
Возможно я здесь еще что-то менял. И, возможно, комментарии не везде соответствуют тому что на самом деле...
Вот нашла несколько интересных примеров инвентаря. Часть 1 Цитирую авторов: ___ Авторы: Dva_Kota, bodimir, Alexis
Небольшой пример инвентаря с подробными комментариями (на русском языке). Этот пример был сделан для игры Wonderful World Armatrit. Теперь он модифицирован для игры The Heroes of Stream - Wolrand и к нему добавлен инвентарь экипировки – можно надевать различные вещи и предметы на игрока. Всю графику для примера рисовал Alexis.
Я видел не так уж мало примеров инвентаря, но все они мне не очень нравились. Там было много кода (если в инвентаре достаточно функций) и чтобы его как-то изменить (изменить количество ячеек изменить их размер и т.д.) нужно было «бродить» по скриптам, добавлять кучу строк для каждой новой ячейки, причем добавлять строки нужно в разные скрипты и разные места кода. Может быть, есть более удобные в использовании инвентари, просто я их не видел. По этой причине пришлось создавать свой инвентарь, который можно легко добавлять в любые проекты, практически ничего не меняя…
Прошу обратить внимание на то, что предметы в инвентаре не являются объектами. При перемещении «предмета» в инвентарь происходит следующее: параметры объекта записываются в массивы, а сам объект удаляется из комнаты. В событии рисования объекта obj_inv происходит просто рисование спрайтов объектов, перемещенных в инвентарь, в соответствии с данными из массивов. Когда «выбрасываем» «предмет» из инвентаря – создается объект, данные которого записаны в ячейку массива, соответствующую ячейке инвентаря, в которой находился «предмет». Когда перетаскиваем «предмет» из одного инвентаря в другой – значения массива первого инвентаря переписываются в массив второго инвентаря. Это следует учитывать, например, если вам нужно подсчитать количество объектов в комнате – объекты в инвентаре не будут учитываться. Дальше под понятием «предмет» следует понимать несколько массивов, содержащих данные объекта, а под понятием «объект» сам объект ГМ. [spoiler=Возможности/функции версии 1.0026 (старая версия,просто инвентарь)] • Можно задавать количество ячеек по горизонтали и вертикали. Количество ячеек за-дается при создании инвентаря.
• Можно задавать любые размеры ячеек, любую ширину и высоту, ячейки не обязательно должны быть квадратными, можно делать прямоугольные ячейки, можно делать ячейки вообще любой формы, только не забудьте убрать точную проверку столкновений. За размер и форму ячеек отвечает спрайт spr_inv каким вы его сделаете, такими и будут ячейки инвентаря (не забудьте убрать точную проверку столкновений у этого спрайта!)
• Можно задавать фон для инвентаря. Будет отображаться как рамка вокруг всех ячеек (для разных размеров инвентаря нужно будет делать разные спрайты фона). Задается спрайтом spr_inv_back.
• Предметы можно складывать в ячейки по одному, по несколько или в любом количестве (можно настроить отдельно для каждого предмета). Существует объект obj_smil_base. Это родительский объект для всех предметов. В этом объекте прописан код перемещения предмета в инвентарь. Параметры предметов задаются в их событиях создания. Это две переменные: в первой записано название предмета (можно русскими буквами, но не забудьте добавить русский шрифт), это название будет выводиться при наведении курсора на объект в инвентаре; во вторую записывается лимит количества предметов в одном слоте (если не указывать эту переменную – можно складывать данный предмет в дин слот в не ограниченном количестве).
• Предметы можно перетаскивать из одной ячейки в другую.
• Если в нескольких ячейках одинаковые предметы их можно объединить в одну (если позволяет максимальное количество данных предметов в одной ячейке)
• Можно выбрасывать предметы из ячейки. Выбросить все предметы из ячейки перетащив их правой кнопкой мышки за пределы инвентаря, или выбрасывать предметы по одному удерживая клавишу Shift и кликая на предмет в инвентаре правой кнопкой мыши. В примере четыре предмета. Два из них, при выбрасывании, появляются чуть ниже игрока, остальные два появляются в случайной точке комнаты. Код «выбрасывания» на-писан в событии Glob Right Released
• Можно использовать предметы из инвентаря, кликая по ним левой кнопкой мыши. Код использования написан в событии Left Pressed (для каждого предмета нужно про-писать свой код, т.к для каждого предмета при использовании будут выполняться свои действия!).
• При наведении курсора на предмет в инвентаре показывается его название. Сюда, при желании можно добавить и другую информацию, например характеристики предмета. Можно изменить положение этой надписи (в этом примере название предмета появляется под ячейкой, в которой находится предмет)[/spoiler]
1. Скопируйте объект obj_inv, obj_smil_base в свой проект. obj_smil_base можно на-звать по-другому, как Вам больше нравится. Этот объект нужно сделать родитель-ским для всех объектов, которые вы хотите помещать в инвентарь.
2. скопируйте спрайты spr_txt_back, spr_inv, spr_inv_back в свой проект Спрайты можно поставить свои, но имена должны быть именно такими. Координаты цнетров этих спрайтов должны быть (0,0). spr_inv_back – это фон инвентаря. Он не обязателен. Если не хотите его использовать, удалите строку draw_sprite(spr_inv_back,-1,x,y); в объекте obj_inv в событии Draw.
3. В событии Create объекта obj_inv, задайте размеры инвентаря Код:
Код
inv_height_y=3; // Количество ячеек в высоту inv_width_x=4; // Количество ячеек в ширину
4. Во всех объектах, которые нужно перемещать в инвентарь, в событии Create задай-те переменную name=’строка’, которая будет содержать текст, показываемый при наведении курсора, и, если нужно, переменную max_number=число, которая будет показывать сколько таких «предметов» можно будет положить в одну ячейку (если переменную max_number не задать, таких предметов в одну ячейку можно будет положить сколько угодно.
5. добавить шрифт font0, которым будут отображаться надписи при наведении курсора на предмет в инвентаре. Шрифт можно назвать по другому. Тогда в событии Create объекта obj_inv нужно будет прописать другой шрифт в первой строке draw_set_font(font0);
6. Теперь нужно определить какие действия будут выполняться при использовании предметов (при нажатии левой кнопкой мышки на предмет в инвентаре). В событии Left Pressed объекта obj_inv есть такая часть кода: Код:
Код
switch (name_obj[klick_x,klick_y]) //Выбираем в зависимости от названия предмета какое действие выполнить { case obj_grin: obj_hero.hp+=10; break; //увеличиваем у игрока hp на 10 case obj_wink: obj_hero.x=random(room_width); obj_hero.y=random(room_height); break; //перемещаем игрока в случайную точку в пределах комнаты case obj_shocked: obj_hero.hp-=10; break; //уменьшаем у игрока hp на 10 case obj_sm15: obj_hero.hp+=10; break; //увеличиваем у игрока hp на 10 }
Здесь после каждого case написаны имена объектов, а дальше, после двоеточия, написаны действия, соответствующие этим объектам (это для тех кто не знает как использовать switch)
7. Вернемся ко объекту obj_smil_base. Там всего лишь одно событие – столкновение с игроком. Вы можете заменить это событие на другое, при котором должно происходить перемещение предмета в инвентарь (например нажатие левой кнопки мыши).
[spoiler=Возможности/фукнции версии 1.0064 (инвентарь+ инвентарь экипировки)] • Можно задавать количество ячеек каждого инвентаря по горизонтали и вертикали. Количество ячеек задается при создании инвентаря (в каждом инвентаре отдельно). • Можно задавать любые размеры ячеек, любую ширину и высоту, ячейки не обязательно должны быть квадратными, можно делать прямоугольные ячейки, можно делать ячейки вообще любой формы, только не забудьте убрать точную проверку столкновений. За размер и форму ячеек отвечает спрайт spr_inv, каким вы его сделаете, такими и будут ячейки инвентаря (не забудьте убрать точную проверку столкновений у этого спрайта). Для основного инвентаря и для инвентаря экипировки можно задавать разные ячейки (в примере используются одинаковые ячейки). • Можно задавать фон для инвентаря. Будет отображаться как рамка вокруг всех ячеек (для разных размеров инвентаря нужно будет делать разные спрайты фона). Задается спрайтом spr_inv_back для основного инвентаря и спрайтом spr_inv_equip_back для инвентаря экипировки (обратите внимание, что спрайт spr_inv_equip_back нужен обязательно, иначе пустые ячейки инвентаря экипировки не будут отображаться). • Предметы можно складывать в ячейки по одному, по несколько или в любом количестве (можно настроить отдельно для каждого предмета). Существует объект obj_item_base. Это родительский объект для всех предметов. В этом объекте прописан код перемещения предмета в инвентарь. Параметры предметов задаются в их событиях создания. • Предметы можно перетаскивать из одной ячейки в другую. • Если в нескольких ячейках одинаковые предметы их можно объединить в одну (если позволяет максимальное количество данных предметов в одной ячейке) • Можно выбрасывать предметы из ячейки. Выбросить все предметы из ячейки, перетащив их правой кнопкой мышки за пределы инвентаря, или выбрасывать предметы по одному удерживая клавишу Shift и кликая на предмет в инвентаре правой кнопкой мыши. Код «выбрасывания» написан в событии Glob Right Released • Можно использовать предметы из инвентаря, кликая по ним левой кнопкой мыши. Код использования написан в событии Create в переменной act_on (для каждого пред-мета нужно прописать свой код, т.к. для каждого предмета при использовании будут выполняться свои действия!). • Если подобрать предмет, который можно надеть на игрока, и если для этого предмета есть соответствующий пустой слот – он переместится сразу в инвентарь экипировки. Эту функцию можно убрать, удалив часть кода в событии Create объекта obj_item_base (в коде есть комментарии и указания что именно нужно удалять). • При наведении курсора на предмет в инвентаре показывается его название. Сюда, при желании можно добавить и другую информацию, например характеристики предмета. Можно изменить положение этой надписи в событии Draw у объектов obj_inv и obj_inv_weapon (там есть соответствующие комментарии и подсказки). В этом примере название предмета появляется под ячейкой, в которой находится предмет. • Инвентарь экипировки состоит из 9-и слотов (его можно настроить как угодно и сде-лать любое количество слотов). • Слоты инвентаря экипировки имеют разный тип, в зависимости от того какой пред-мет туда можно положить (например оружие или одежда) • Некоторые слоты имеют одинаковый тип (в примере два слота для оружия) - предме-ты в таких слотах можно менять, местами перетаскивая правой кнопкой мыши [/spoiler] [spoiler=Как добавить в игру инвентарь версии 1.0064(инвентарь+инвентарь экипировки)] 1. Скопируйте объект obj_inv, obj_inv_weapon, obj_item_base в свой проект. obj_item_base можно назвать по-другому, как Вам больше нравится. Этот объект нужно сделать родительским для всех объектов, которые вы хотите помещать в инвентарь.
1.1. Если нужно чтобы инвентарь можно было закрывать/открывать – скопируйте объект obj_inv_open. Открытие и закрытие реализовано двумя способами: 1 – при на-жатии ЛКМ на этом объекте, 2 – при нажатии клавиши «I». Если хотите сделать только нажатие по клавише не клавиатуре – сделайте этот объект невидимым, уберите у него событие нажатия клавиши мыши и можете убрать у него спрайт.
2. Скопируйте спрайты spr_txt_back, spr_inv, spr_inv_back, spr_inv_equip_back в свой проект. Спрайты можно поставить свои, но имена должны быть именно такими. spr_inv_back – это фон инвентаря. Он не обязателен. Если не хотите его использовать, удалите строку draw_sprite(spr_inv_back,-1,x,y); в объекте obj_inv в событии Draw. Спрайт spr_inv_equip_back – это фон инвентаря экипировки, он нужен обязательно и в нем должны быть нарисованы пустые ячейки.
2.1. spr_inv – фон ячейки инвентаря, от нее зависят размеры (об этом было сказано выше). При желании для инвентаря экипировки можно использовать другие спрайты ячеек (даже другого размера) – не такие как для основного инвентаря. Для этого создайте спрайт ячейки для инвентаря экипировки и у объекта obj_inv_weapon в событии Draw замените везде spr_inv на имя спрайта ячейки инвентаря экипировки. Центр этого спрайта обязательно должен находиться в координатах (0,0)!
3. В событии Create объекта obj_inv, задайте размеры инвентаря, например так: Код:
Код
inv_height_y=3; // Количество ячеек в высоту inv_width_x=4; // Количество ячеек в ширину
В событии Create объекта obj_inv_weapon задайте размеры инвентаря экипировки, например так: Код:
Код
inv_height_y=3;//Количество ячеек в высоту inv_width_x=3;//Количество ячеек в ширину
Здесь можно задавать любые значения в зависимости от того какого размера вам ну-жен инвентарь.
4. Во всех объектах, которые нужно перемещать в инвентарь, в событии Create задайте переменные: name – название предмета (можно русскими буквами, но не забудьте добавить русский шрифт), это название будет выводиться при наведении курсора на объект в инвентаре; max_number – лимит количества предметов в одном слоте. (Если не указывать эту пе-ременную – можно складывать данный предмет в один слот в не ограниченном коли-честве). Для предметов, которые можно перемещать в инвентарь экипировки, эта переменная должна быть равна 1 (т.е. по одной вещи в одном слоте), но при желании можно перенастроить инвентарь, чтобы было по несколько вещей в одном слоте; act_on – код, который должен быть выполнен при использовании предмета (например, пополнение здоровья при использовании зелья лечения) или код, который должен вы-полняться при надевании предмета (например, увеличение брони); act_off – код, который должен выполняться при снятии предмета с игрока, обычно это код, противоположный коду из предыдущей переменной (если в act_on записано увеличение брони, то в act_off нужно записать уменьшение брони на ту же величину); item_type – тип предмета. В примере существуют такие типы предметов (Вы можете задать любое количество типов предметов): 0 - обычный предмет, 1 – оружие, 2 – шлем, 3 – броня, 4 – обувь, 5 – перчатки, 6 – амулет, 7 – кольца. Тип 0 нельзя пере-мещать в инвентарь экипировки, все остальные – можно. От типа зависит то, в какие ячейки инвентаря экипировки можно будет перемещать предмет. Можно создать кон-станты с этими значениями, для боле удобной работы с инвентарем.
4.1. Оружие, в отличие от остальных предметов, создается в руках у игрока в виде объектов и следует за ним. Для того, чтобы оружие из слота правой руки было прикреплено именно к правой руке, а из левой – к левой, в коде есть переменная r_weap, которая вычисляется при перемещении оружия в оружейный слот и из него, и показывает к какой руке относится это оружие (r_weap = true – правая рука, r_weap = false – левая рука). В переменных act_on и act_off (где расположен код) проверяется эта переменная и в зависимости от того в какой руке то оружие, с которым происходит действие перемещения из слота или в слот, выполняются соответствующие действия. Когда берем оружие (act_on) – создается предмет «оружие, которое будет в руках у игрока и будет перемещаться за ним» а – это отдельный объект. Для него, в зависимости от того в какой руке это оружие, задаются разные координаты привязки, которые потом используются в Step оружия, привязанного к игроку (обратите внимание на то, что предмет «меч, который можно подобрать» «меч, который находится в руках у игрока» - разные объекты, хотя имеют одинаковый спрайт!), потом id созданного экземпляра объекта оружия записывается в переменную obj_hero.weap_r (если оружие в правой руке) или в переменную obj_hero.weap_l (если оружие в левой руке) – для того чтобы можно было удалить оружие из этой руки. Когда выбрасываем оружие или меняем его на другое (act_off) – удаляем экземпляр объекта, записанный в переменную obj_hero.weap_r (если оружие было в правой руке) или в переменную obj_hero.weap_l (если оружие было в левой руке).
5. Типы ячеек для инвентаря экипировки задаются в событии Create объекта obj_inv_weapon массивом item_type[]. Здесь для каждой конкретной ячейки определяется тип. Если Вы хотите чтобы предметы в инвентаре экипировки располагались как-то по-другому или чтобы было другое количество ячеек – можете настроить это так, как вам нравится.
6. добавить шрифт font0, которым будут отображаться надписи при наведении курсора на предмет в инвентаре. Название шрифта можно изменить. Тогда в событии Create объекта obj_inv нужно будет прописать другой шрифт в первой строке draw_set_font(font0);
7. Вернемся к объекту obj_item_base. Там всего лишь одно событие – столкновение с игроком. Вы можете заменить это событие на другое, при котором должно происходить перемещение предмета в инвентарь (например, нажатие левой кнопки мыши) или добавить дополнительную проверку на нажатие клавиши, чтобы предметы подбирались только тогда, когда игрок столкнулся с ними и нажал, например, клавишу «Е».
8. Можно настроить положение инвентарей относительно вида в событии Draw у объектов obj_inv, obj_inv_weapon.[/spoiler] [spoiler=Немного про код в примере( что бы не было лишних вопросов)] В событии создания инвентаря задаются несколько массивов и переменные. Некоторые из них можно не задавать в событии создания. Я это сделал для того чтобы Вам легче было разобраться какой массив и какая переменная для чего нужны.
Код Код:
Код
/*вычисляем на какой ячейке находится курсор (тут вычисляются не координаты, а как бы элемент массива которому принадлежит ячейка над которой курсор*/ klick_x=floor((mouse_x-x)/slot_width_x); klick_y=floor((mouse_y-y)/slot_height_y);
во всех событиях инвентаря я добавил из-за того что события нажатия клавиш мышки и события рисования происходят не одновременно. Если поставить код только в событии рисования, то при быстром перемещении мышки может оказаться что во время вычислений мышка была в одном месте, а при клике она уже будет в другом месте. Из за этого появляются ошибки.[/spoiler] Еще несколько способов модифицировать инвентарь: [spoiler=Код проверки наличия предмета в инвентаре(любая версия)]
Код
//Это код проверки наличия предмета в инвентаре
with (obj_inv)//выполняем код для объекта obj_inv { 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]='Grin')//когда находим ячейку с таким же предметом { //здесь код, который должен выполниться если предмет есть в инвентаре } } } }
1.Как дать права администратора пользователю? 2.Как создать карту к нему? Спросила на англ. сайте,но ответа еще нет. Просьба помочь. С Генессисом начала только недавно работать. Пробовала F1,но это ничего не дало.