Создание функционального инвентаря
| |
MrIncrof | Дата: Воскресенье, 13 Ноября 2011, 11:05 | Сообщение # 1 |
Lite Programmer
Сейчас нет на сайте
| Привет всем! Я решил написать ещё один урок, в котором я расскажу как можно сделать отличный инвентарь для своей игры. Урок получится очень громоздким, поэтому подробно описывать всё не буду, но вы можете почитать комментарии в коде. Итак, начнём. Для начала мы создадим все необходимые объекты, а именно: obj_inv_open (открытие и закрытие инвентаря), obj_inv (ячейки инвентаря), obj_smil_base (родитель всех объектов, доступных для подбирания) и obj_hero (наш игрок, который будет ходить и подбирать все доступные предметы). Начнём с самого простого - наш герой, как я уже говорил, подробно расписывать я не буду, читайте комменты. Create игрока: Code hp=100;//это здоровье игрока. Эта переменная здесь только для того, чтобы продемонстрировать как работает использование предметов из инвентаря. Step игрока: Code if keyboard_check (ord('A')) && place_free (x-4,y) x-= 4; if keyboard_check (ord('D')) && place_free (x+1,y) x+=4 if keyboard_check (ord('W')) && place_free (x,y-3) y-= 4; if keyboard_check (ord('S')) && place_free (x,y+3) y+= 4; Мы закончили работать над игроком, кода мало, но больше и не требуется. Продолжим с ячейки. Пожалуй, это самая сложная часть инвентаря, там очень много кода. Create: Code //Параметры инвентаря inv_height_y=3;//количество ячеек в высоту inv_width_x=4;//количество ячеек в ширину slot_height_y=sprite_height;//Записываем высоту ячейки slot_width_x=sprite_width;//записываем ширину ячейки
/*Растягиваем спрайт ячейки таким образом, чтобы он был по размеру как все ячейки вместе взятые Ону будет служить маской столкновения для инвентаря. Это нужно для выполнения события нажатия кнопок мыши на инвентаре. Каждая ячейка будет рисоваться отдельно в событии Draw*/ image_xscale=inv_width_x; image_yscale=inv_height_y;
/*Сюда будем записывать названия предметов которые подбераем. Эти переменные также будут использоваться для вывода названий предметов при наведении курсора*/ for (slot_x=0; slot_x<inv_width_x; slot_x+=1)//выбираем столбец инвентаря для проверки { for (slot_y=0; slot_y<inv_height_y; slot_y+=1)//проверяем все ячейки в этом столбце, а потом опять выполнится сторка выше и мы перейдем к следующему столбцу инвентаря { txt[slot_x,slot_y]=''; } }
//Сюда будем записывать количество предметов в слоте for (slot_x=0; slot_x<inv_width_x; slot_x+=1)//выбираем столбец инвентаря для проверки { for (slot_y=0; slot_y<inv_width_x; slot_y+=1)//проверяем все ячейки в этом столбце, а потом опять выполнится сторка выше и мы перейдем к следующему столбцу инвентаря { item[slot_x,slot_y]=0; } }
//Максимальное количество объектов в ячейке. По умолчанию 0 (0 - значит сколько угодно объектов) for (slot_x=0; slot_x<inv_width_x; slot_x+=1)//выбираем столбец инвентаря для проверки { for (slot_y=0; slot_y<inv_width_x; slot_y+=1)//проверяем все ячейки в этом столбце, а потом опять выполнится сторка выше и мы перейдем к следующему столбцу инвентаря { max_number[slot_x,slot_y]=0; } }
//Сначала устанавливаем для всех ячеек прозрачный спрайт, потом он будет заменен на спрайт взятого предмета for (slot_x=0; slot_x<inv_width_x; slot_x+=1)//выбираем столбец инвентаря для проверки { for (slot_y=0; slot_y<inv_width_x; slot_y+=1)//проверяем все ячейки в этом столбце, а потом опять выполнится сторка выше и мы перейдем к следующему столбцу инвентаря { spr[slot_x,slot_y]=spr_inv;//spr_no_spr; } }
//Сюда будем записывать имена объектов. Использоваться этот массив будет для создания объектво в комнате при выбрасывании for (slot_x=0; slot_x<inv_width_x; slot_x+=1)//выбираем столбец инвентаря для проверки { for (slot_y=0; slot_y<inv_width_x; slot_y+=1)//проверяем все ячейки в этом столбце, а потом опять выполнится сторка выше и мы перейдем к следующему столбцу инвентаря { name_obj[slot_x,slot_y]='';//spr_no_spr; } }
//переменные для перетаскивания предметов в инвентаре и для выкидывания из инвентаря inv_item_x=0;//сюда будем записывать из какой ячейки взяли предмет, чтобы мжно было его вернуть на место inv_item_y=0;
inv_txt='';//сюда будем записывать название предмета, который взяли. еще по этой переменной будем определять взят ли сейчас какой-то предмет //(если переменная равно '' - значит не взят, иначе - взят.
inv_item=0;//Сюда будем записывать количество предметов, которое взяли
inv_spr=spr_inv;//spr_no_spr;//сюда будем записывать спрайт предмета, который взяли
inv_name_obj=0;//Сюда будем записывать имя объекта, который перетаскиваем
Добавлено (13.11.2011, 11:05) --------------------------------------------- Left Pressed: Code //Использование предмета. /*вычисляем на какой ячейке находится курсор (тут вычисляются не координаты, а как бы элемент массива которому принадлежит ячейка над которой курсор*/ if (visible) { klick_x=floor((mouse_x-x)/slot_width_x); klick_y=floor((mouse_y-y)/slot_height_y);
if (txt[klick_x,klick_y]!='')//елси в слоте, над которым сейчас находится курсор, что-то есть { 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 } 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; } } } Right Pressed: Code /*Выбрасывание предметов из инвентаря и перетаскивание предметов в инвентаре. Выбрасывание предметов осуществляется по одному если удерживать клавишу Shift и кликать правой кнопкой мыши по предметам в инвентаре. Перетаскивать предметы можно правой кнопкой мыши. Есил вынести предмет за пределы инвентаря и отпустить правую кнопку мыши - все предметы из этого слота будут выброшены. Предметы выбрасываются и появляются чуть ниже игрока. Это можно настроить. Можно сделать, например, чтобы предметы выбрасывались туда, где была отпущена правая копка мыши.*/
if (visible) { /*вычисляем на какой ячейке находится курсор (тут вычисляются не координаты, а как бы элемент массива которому принадлежит ячейка над которой курсор*/ 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', то предмет в этой ячейке рисоваться не будет, хотя фактически он будет там находиться.*/ } } }
Добавлено (13.11.2011, 11:05) --------------------------------------------- Global Right Released: Code 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;//Записываем максимальное количество предметов, которое может быть в одной ячейке name_obj[klick_x,klick_y]=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 (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; } } Draw: Code x=view_xview+32; y=view_yview+32;
//draw_sprite(sprite_index,image_index,x,y); draw_set_font(font0);//выбираем шрифт для отображения текста инвентаря. draw_sprite(spr_inv_back,-1,x,y);//Рисуем фон инвентаря. Это не обязательно если нужно чтобы были просто ячейки. Фон нужно подгонять под колчество ячеек. draw_text(view_xview+32,view_yview+4,string('hp: ')+string(obj_hero.hp));//Рисуем здоровье игрока. Это только для демонстрации использования предметов, к инвентарю отношения не имеет.
for (slot_x=0; slot_x<inv_width_x; slot_x+=1)//выбираем столбец инвентаря для проверки { for (slot_y=0; slot_y<inv_height_y; slot_y+=1)//проверяем все ячейки в этом столбце, а потом опять выполнится сторка выше и мы перейдем к следующему столбцу инвентаря { draw_sprite(sprite_index,image_index,x+slot_x*slot_width_x,y+slot_y*slot_height_y);//рисуем ячейки инвентаря if (txt[slot_x,slot_y]!='' && txt[slot_x,slot_y]!='empty')//если слот не пустой { draw_sprite(spr[slot_x,slot_y],image_index,x+slot_x*slot_width_x,y+slot_y*slot_height_y);//рисуем спрайт предмета, находящегося в этой ячейке инвентаря (в своих координатах) draw_text(x+slot_x*slot_width_x,y+slot_y*slot_height_y,item[slot_x,slot_y]);//пишем количество предметов в слоте } } }
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]!='empty')//если слот, на который наведен курсор, не пустой { draw_sprite_ext(spr_txt_back,-1,x+klick_x*slot_width_x,y+(klick_y+1)*slot_height_y,string_width(txt[klick_x,klick_y]),1,0,c_white,0.8);//Рисуем фон для текста по размеру текста draw_text(x+klick_x*slot_width_x,y+(klick_y+1)*slot_height_y,txt[klick_x,klick_y]);//рисуем текст - название предмета (записывается в событии создания предмета) } }
if (inv_txt!='')//Если мы сейчас перетаскиваем предмет { draw_sprite(inv_spr,image_index,mouse_x,mouse_y);//рисвем спрайт предмета там, где находится курсор. }
Добавлено (13.11.2011, 11:05) --------------------------------------------- Нам требуется нарисовать два спрайта: spr_txt_back (фон надписей, растягивается автоматически) и spr_inv_back (текстура фона инвентаря) и, естественно, спрайты для остальных объектов. Далее создаём родитель всех дочерних объектов, это obj_smil_base. Столкновение с игроком: Code //Это код перемещения предмета в инвентарь.
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]=other.name)//когда находим ячейку с таким же предметом { with (other) { if variable_local_exists('max_number')//если у этого объекта есть переменная max_number (ограничение на количество предметов в одной ячейке) { if (other.item[other.slot_x,other.slot_y]<max_number)//проверяем сколько предметов в этой ячейке. если меньше чем max_number: { other.txt[other.slot_x,other.slot_y]=name;//записываем в массив имя other.spr[other.slot_x,other.slot_y]=sprite_index;//записываем в массив какой спрайт отображать в нивентаре other.item[other.slot_x,other.slot_y]+=1;//увеличиваем кол-во предментов на 1 other.max_number[other.slot_x,other.slot_y]=max_number;//записываем максимальное количество предметов в слоте instance_destroy();//удаляем предмет из комнаты exit;//после того как нашли пустую ячейку и записали все нужные параметры прекращаем выполнение кода. остальные ячейки просматривать не имеет смысла } } else {//если у этого объекта нет переменной max_number то все предметы "складываем" в одну ячейку other.txt[other.slot_x,other.slot_y]=name;//записываем в массив имя other.spr[other.slot_x,other.slot_y]=sprite_index;//записываем в массив какой спрайт отображать в нивентаре other.item[other.slot_x,other.slot_y]+=1;//увеличиваем кол-во предментов на 1 (это для отображния в инвентаре. пока что не работает other.max_number[other.slot_x,other.slot_y]=0;//записываем максимальное количество предметов в слоте (т.к. это для безлимитных предметов - ставим 0 instance_destroy();//удаляем предмет из комнаты exit;//после того как нашли пустую ячейку и записали все нужные параметры прекращаем выполнение кода. остальные ячейки просматривать не имеет смысла } } } } } }
//Если ни в одной ячейке мы не нашли такой же предмет 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]='')//когда находим свободную ячейку { txt[slot_x,slot_y]=other.name;//записываем в массив имя spr[slot_x,slot_y]=other.sprite_index;//записываем в массив какой спрайт отображать в нивентаре item[slot_x,slot_y]+=1;//увеличиваем кол-во предментов на 1 name_obj[slot_x,slot_y]=other.object_index;//записываем имя объекта with (other) { if variable_local_exists('max_number')//если у этого объекта есть переменная max_number (ограничение на количество предметов в одной ячейке) { other.max_number[other.slot_x,other.slot_y]=max_number;//записываем максимальное количество предметов в слоте } instance_destroy();//удаляем предмет из комнаты } exit;//после того как нашли пустую ячейку и записали все нужные параметры прекращаем выполнение кода. остальные ячейки просматривать не имеет смысла } } } } теперь настала очередь inv_open. Left Released: Code with (obj_inv) { visible=!visible; if (inv_txt!='')//Если мы перетаскивали предмет то вернем его на место //(перетаскивание возможно когда "открыт инвентарь", значит сейчас произошло событие "закрытие инвентаря") { txt[inv_item_x,inv_item_y]=inv_txt;//записываем в массив имя inv_txt='';//показываем что больше ничего не перетаскиваем } } Draw: Code x=view_xview+6; // x объекта y=view_yview+22; // y объекта draw_sprite(sprite_index,1,x,y); // рисуем спрайт на данных координатах I pressed: Code with (obj_inv) { visible=!visible; if (inv_txt!='')//Если мы перетаскивали предмет то вернем его на место //(перетаскивание возможно когда "открыт инвентарь", значит сейчас произошло событие "закрытие инвентаря") { txt[inv_item_x,inv_item_y]=inv_txt;//записываем в массив имя inv_txt='';//показываем что больше ничего не перетаскиваем } } Вот и всё, чтобы сделать новый объект, создайте его, поставьте в родителя obj_smil_base и в create пишите: Code name='Тест';//В эту переменную записываем название объекта, которое будет отображаться при наведении курсора. //Еще эта переменная будет служить для определения "занята" ячейка инвентаря или "не занята" и если "не занята", то будет обозначать //какой именно предмет находится в ячейке
max_number=3;//'Эта переменная показывает какое количество этих объектов можно поместить в одну ячейку инвентаря. //Если эту переменную не указать, значить в одну ячейку можно положить сколько угодно таких объектов. Автор материала: Dva_Kota;
Сообщение отредактировал 4aBo - Вторник, 15 Ноября 2011, 16:57 |
|
| |
Ex3mDM | Дата: Воскресенье, 13 Ноября 2011, 11:12 | Сообщение # 2 |
участник
Сейчас нет на сайте
| Хороший урок Лови + за сторания.
|
|
| |
Els | Дата: Воскресенье, 13 Ноября 2011, 13:36 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| Пример загрузи
|
|
| |
FadeBaker | Дата: Воскресенье, 13 Ноября 2011, 18:40 | Сообщение # 4 |
JavaSE Game Developer
Сейчас нет на сайте
| Простите, конечно, за оффтоп, но это нагло скопированный код из примера инвентаря, написанного Dva_Kota. Делай выводы.
Уроки по GM Minecraft 2D на GM — Мои проекты — Blood Harvest [2D] — Original Blood Harvest [2D]: Remastered Edition Adventure Craft [2D] — Sandbox Space Shock [2D] — Scroll Shooter Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
|
|
| |
LunarPixel | Дата: Воскресенье, 13 Ноября 2011, 20:14 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| Интересно, интересно.. я про пост Fade.. Возникает вопрос, а всё остальное было авторское?!
|
|
| |
Syank | Дата: Понедельник, 14 Ноября 2011, 17:38 | Сообщение # 6 |
участник
Сейчас нет на сайте
| даже если стянуто из примера - он же тут всё расписал. Правда стоило бы указать источник.
|
|
| |
stalker5889 | Дата: Вторник, 15 Ноября 2011, 05:48 | Сообщение # 7 |
Свободный игродел
Сейчас нет на сайте
| Но комментаои писал не он. Ай ай ай!
|
|
| |
Dva_Kota | Дата: Вторник, 15 Ноября 2011, 11:59 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| Quote (LunarPixel) даже если стянуто из примера - он же тут всё расписал. Правда стоило бы указать источник. Ну вообще-то тут почти ничего не расписано. Просто написано какой код куда ставить (хотя и в примере видно какой код куда ставить). А вот что для чего делается не расписано. Хотя, возможно, отсюда удобнее копировать код в свою игру чем из примера. Вот если бы тут был описан принцип работы инвентаря - было бы очень хорошо.
Новый пример инвентаря! /20.06.2012/
Energy Wars
Сообщение отредактировал Dva_Kota - Вторник, 15 Ноября 2011, 12:01 |
|
| |
0x90 | Дата: Вторник, 15 Ноября 2011, 12:23 | Сообщение # 9 |
участник
Сейчас нет на сайте
| Не важно что он там объяснял и как. За такие поступки нужно отправлять на костер без суда и следствия.
Сообщение отредактировал 0x90 - Вторник, 15 Ноября 2011, 12:25 |
|
| |
FadeBaker | Дата: Вторник, 15 Ноября 2011, 15:50 | Сообщение # 10 |
JavaSE Game Developer
Сейчас нет на сайте
| 0x90, таки да, получается, что автор статьи он, т.к. не указан источник, а это уже нарушение правил.
Уроки по GM Minecraft 2D на GM — Мои проекты — Blood Harvest [2D] — Original Blood Harvest [2D]: Remastered Edition Adventure Craft [2D] — Sandbox Space Shock [2D] — Scroll Shooter Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
|
|
| |
MrIncrof | Дата: Вторник, 15 Ноября 2011, 16:57 | Сообщение # 11 |
Lite Programmer
Сейчас нет на сайте
| Простите все, не знал автора статьи, спасибо всем кто отписался P.S. добавил автора
|
|
| |
FadeBaker | Дата: Вторник, 15 Ноября 2011, 17:07 | Сообщение # 12 |
JavaSE Game Developer
Сейчас нет на сайте
| 4aBo, да успокойся, все нормально, всякое бывает.
Уроки по GM Minecraft 2D на GM — Мои проекты — Blood Harvest [2D] — Original Blood Harvest [2D]: Remastered Edition Adventure Craft [2D] — Sandbox Space Shock [2D] — Scroll Shooter Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
|
|
| |
MrIncrof | Дата: Вторник, 15 Ноября 2011, 20:34 | Сообщение # 13 |
Lite Programmer
Сейчас нет на сайте
| Quote (LunarPixel) Возникает вопрос, а всё остальное было авторское?! Да, это полностью моё, просто этот пример лежал в моей папке, я думал это мой, т.к. никакой инфы о авторе вообще нет, в общем, извините за стянутый пример
|
|
| |
|