Сейчас многие начали выкладывать статьи и уроки для ГМ-а... Вот и я решил снести свою лепту=) Мои уроки будут ориентированы на РПГ игру но, думаю что и для других целей подойдут наверняка есть много способов которыми сделать то о чем я напишу но я буду писать как делал сам! и так начнем: Часть 1:создание ГГ
для начала я добавляю спрайты ГГ в 3 видах(стоит.идет.бьет) создаю объект ГГ(o_hero) в событии создания я пишу основные переменные:
Code
//////////////////////////ниже основные переменные:хп,мп,сила и т.д v_agility=5 v_streng=10 v_intel=5 v_hp=100+(v_streng*3) v_mp=100+(v_intel*3) v_gold=0 /////////////////////////ниже кое какие дополнительные переменные для удобности(не знаю как кому но мне так удобней) v_arm_st=2 v_ev_st=1 v_hast_st=40 v_speed_st=2 v_cast_st=100 ////////////////////////////ниже переменные аналогичные тем что выше только отвечают за бонусы от "одежды" v_arm_dop=0 v_ev_dop=0 v_hast_dop=0 v_speed_dop=0 v_cast_dop=0 /////////////////////////ниже переменные типа: скорость атаки, бега, защиты...я сразу прописал основные формулы для их расчета(каждый подбирает формулы для себя сам) v_armor=v_arm_st+((v_streng/5)+v_arm_dop) v_evansion=v_ev_st+((v_agility/5)+v_ev_dop) v_hast=v_hast_st-((v_agility/10)+v_hast_dop) v_speed=v_speed_st+((v_agility/10)+v_speed_dop) v_cast=v_cast_st-((v_intel/5)+v_cast_dop) //////////////////////////
здесь я добавил переменные ХП,МП, сила, ловкость и т.д и кое какие формулы для их подсчета...эти все формулы я делал для себя и вам они могут стать лишними поэтому делайте только необходимые вам переменки=) дальше я создаю еще 1 кнопку кода(что бы не путаться) где буду писать дополнительные переменные...
Code
xx=x yy=y
пока здесь только 2 переменные которые нужны для передвижения ГГ на первое время можно забыть о событии Create - идем в Step Передвижение героя я сделал по принципу Diablo(Куда нажали туда и идем) в степе делаем такое:
Code
if mouse_check_button_pressed(mb_right){xx=mouse_x;yy=mouse_y;instance_create(mouse_x,mouse_y,o_cur1)} if !(x=xx and y=yy) { mp_potential_step(xx,yy,v_speed,false) sprite_index=s_hero_1_run if xx=x and yy=y{sprite_index=s_hero_1_stand} } if direction>90 and direction<270{image_xscale=-1}else{image_xscale=1} depth=y*(-1)
в этом куске кода проверяется нажатие правой кнопки мыши и последующее назначение координат мыши в xx и yy o_hero. Дальше идет проверка на соответствие координат o_hero и переменных xx и yy и при их несоответствии заставляет героя передвигаться к точке (xx,yy). Следующая строчка меняет спрайт героя на "бегущего". далее снова проверяется соответствие координат ГГ c xx/yy и если сходятся устанавливает спрайт "стоящего ГГ". Cледующая проверка смотрит направление ГГ и устанавливает направление спрайта ГГ в нужную сторону(У меня только лево/право, но при желании можно сделать сколько угодно вариантов разворотов). Последняя строчка нужна для правильного отображения глубины объекта(с помощью этой строчки вставленной в степе любого объекта можно не парится с неправильным отображение глубины деревьев, кустов и прочих вещей)
сделав все правильно можно зайти и посмотреть как ходит ваш ГГ продолжение... Наш персонаж научился ходить, но этого маловато=) Поэтому продолжим... Какая РПГ обходится без прокачки и лвл-апа?Именно это я сейчас и опишу(хотя это одна из самых легких частей РПГ и может быть очень разнообразной но стиль темы вынуждает написать и про это) Сначала нужно подготовить переменные для опыта и лвла. Заходим в меню Create ГГ и добавляем переменные:
Code
v_lvl=1 //уровень персонажа v_exp=0//опыт v_exp_max=100//количество опыта для поднятия уровня(Я обычно сразу придумываю формулу для повышения требуемого опыта с уровнем например:v_exp=100*v_lvl) v_exp_ostatok=0//остаток экспы после лвл-апа
далее идем в событие Step:
Code
if v_exp>=v_exp_max//когда опыт достиг предела. { v_exp_ostatok=v_exp-v_exp_max//записываем лишний опыт(что бы убив супер боса не было обидно) v_lvl+=1//повышаем уровень на 1 v_streng+=1//повышаем характеристики v_agility+=1 и т.д если событие Сreate ГГ подобное или скопированное с того что выше тогда копируем все переменные с формулами сюда, а там можно вставить обычные числа... v_exp_max=100*lvl//ставим новый предел на опыт v_exp=v_exp_ostatok//возвращаем оставшийся опыт в основной }
теперь если сделать событие добавления опыта, например через клавишу или подбор предмета, то не зависимо от количества будет пормальный лвл_ап(если очень много опыта добавить то получите много уровней)
часть 2:инвентарь
дальше я взялся за создание инвентаря(основу взял из этой на нашем форуме и немного усовершенствовал) распишу лучше с 0: создаем обьект o_case(слоты инвентаря) и o_inv(сам инвентарь) у последнего в событии Create:
Code
width = 4;//количество клеток по высоте height = 5;//количество клеток по ширине for(i = 0; i < width; i += 1;)//просчитывает цикл { for(j = 0; j < height; j += 1;)//еще раз для двойного массива { cell[i,j] = instance_create((i*32),( j*32), o_case)//создает слоты инвентаря }}
дальше идем в Create o_case:
Code
v_item=0//предмет в ячейке(0=пусто) v_kolvo=0//количество предметов v_cur=0//Нужна для отображения надписи при наведении на ячейку v_text=''//текст надписи xport=x//нужна для удобной привязки инвентаря к виду yport=y//аналогичная предыдущей
дальше идем в Step:
Code
x=view_xview[0]+xport//Привязка к виду y=view_yview[0]+yport if v_item=0{v_text=''}//Тест в зависимости от предмета if v_item=1{v_text='Яблоко('+string(v_kolvo)+'):Востанавливает 15 здоровья'} if v_item=2{v_text='Древняя монета('+string(v_kolvo)+'):Можно продать'}
дальше в Draw:
Code
draw_set_font(f0)//настраиваем шрифт if v_item=0{draw_sprite_ext(s_inv_pustoy_slot,-1,view_xview[0]+xport,view_yview[0]+yport,1,1,0,c_white,0.5)}//рисуем спрайт в зависимости от обьекта if v_item=1{draw_sprite_ext(s_inv_item1_test,-1,view_xview[0]+xport,view_yview[0]+yport,1,1,0,c_white,0.5)} if v_item=2{draw_sprite_ext(s_inv_item2_test,-1,view_xview[0]+xport,view_yview[0]+yport,1,1,0,c_white,0.5)} draw_sprite(sprite_index,-1,view_xview[0]+xport,view_yview[0]+yport)//рисуем спрайт самого слота if v_cur=1{draw_text(300,50,v_text)}//если v_cur=1 то выводим текст
следуем в mouse_enter:
Code
v_cur=1//переменная для вывода текста(вкл)
следуем в mouse_leave:
Code
v_cur=0//переменная для вывода текста(выкл)
дальше создаем обьект, например, o_item для него лучше всего написать скрипт(что бы не копиравать кучу кода для каждого нового обьекта), он будет лежать в событии подбора предмета, например столкновение) назовем скрипт s_item. В нем:
Code
a=1//предохранительная переменная for(j = 0; j < o_inv.height; j += 1;) { //просматриваем ячейки инвентаря for(i = 0; i < o_inv.width; i += 1;) { if o_inv.cell[i,j].v_item=argument0 // усли находит ячейку с таким самым предмето(argument0-это номер предмета и ставится в самом предмете) if o_inv.cell[i,j].v_kolvo<argument1//и если количество предметов ниже максимального { { instance_destroy()//уничтожает предмет o_inv.cell[i,j].v_kolvo+=1//и увеличивает количество предметов в инвентаре a=0//эта переменка нужна т.к происходил странный баг с 0-вым колвом предметов) exit } } } } if a=1//если таких самых предметов нету в инвентаре { for(j = 0; j < o_inv.height; j += 1;)//снова просматрваем каждую ячейку { for(i = 0; i < o_inv.width; i += 1;) { if o_inv.cell[i,j].v_item=0// и когда находим пустую { o_inv.cell[i,j].v_item = argument0;//добавляем предмет o_inv.cell[i,j].v_kolvo= 1;//количесво ставим 1(или 100500) instance_destroy();//уничтожаем предмет exit; } } } }
единственным отличием моего инвентаря от примера на который ссылка выше - это вывод текста и возможность складировать по несколько вещей...Поэтому я ввел этот пункт только ради общей составляющей=))
сам инвентарь готов, но, для большей удобности, нужно иметь возможность перемещать предметы в инвентаре по собственному желанию... этим сейчас и займемся=)
для начала идем в Create объекта инвентаря(по статье o_inv) там добавляем несколько переменных:
Code
v_mouse=0//предмет который перетаскиваем v_item=0//эта переменка нужна для правильной замены предмета v_kolvo=0//Количество предмета(у меня все сразу перетаскивается) v_kol=0//также дополнительная переменка для правильной замены(что бы не потерять что то=)
дальше идем в событие Left Pressed(или Right Pressed если так удобнее)и пишем:
Code
if o_inv.v_mouse=0 and !(v_item=0)//проверяем на соответствие поднятого ничего нету\в слоте что то лежит { o_inv.v_mouse=v_item// поднимаем предмет o_inv.v_kolvo=v_kolvo//устанавливаем количество поднятого v_item=0//опустошаем слот exit//обрываем функцию } if v_item=0 and !(o_inv.v_mouse=0)//проверка пустой слот\на мышке что то висит { v_item=o_inv.v_mouse//ложим предмет в слот v_kolvo=o_inv.v_kolvo//устанавливаем ему количество o_inv.v_mouse=0// опустошаем мышку exit//обрыв ф-ции } if !(o_inv.v_mouse=0) and !(v_item=0) and !(o_inv.v_mouse=v_item)//проверка мышка с предметов\слот не пустой\предмет на мышке и в слоте разные { o_inv.v_item=v_item//бросаем предмет в доп. переменную o_inv.v_kol=v_kolvo//количество тоже в доп. переменную v_item=o_inv.v_mouse//ложим в слот предмет с мышки v_kolvo=o_inv.v_kolvo//устанавливаем кол-во предметов o_inv.v_mouse=o_inv.v_item//ложим предмет из доп. переменной на мышку o_inv.v_kolvo=o_inv.v_kol// так же и количество o_inv.v_item=0//очищаем доп. переменные o_inv.v_kol=0 exit//обрываем } if v_item=o_inv.v_mouse//проверка предмет на мышке такой же как в слоте { o_inv.v_mouse=0//чистим мышку v_kolvo+=o_inv.v_kolvo//увеличеваем кол-во предметов за счет кол-ва на мышке o_inv.v_kolvo=0//очищаем количество на мышке exit//обрываем }
в принципе уже все работает, но все операции проходят незаметно(не видно что на мышке висит) поэтому идем в Draw объекта o_inv(инвентарь) и пишем:
Code
if v_mouse=1{draw_sprite(s_inv_item1_test,-1,mouse_x,mouse_y)}//смотрит на "ид" предмета и взависимости от значения рисует спрайт который висит на мышке
теперь можно создать еще несколько предметов и как угодно их перемещать по инвентарю=))
вкоторых нету в статье=)) Более мощный компьютер глючит быстрее и точнее.
Сообщение отредактировал BrightSpot - Вторник, 11 Октября 2011, 20:28
я показал только пример переменных(и расшифровывать его не стоит) а сложно все потому что кроме самых переменных уже показаны примеры формул для будующего подсчета...
Было бы неплохо докрепить урок получившимся материалом в формате GMK!
так как я делаю уроки паралельно с самой игрой то проблем не будет=)))
Quote (vasyan555)
Рад, что пользуются моими статьями!)
если честно то я второй раз за время пользования ГМ делаю инвентарь и первый раз я еще не шарил в массивах и несколько слотов инвентаря потребовало уйму кода=))так что я воспользовался твоим уроком=))
Добавлено (13.07.2011, 17:57) --------------------------------------------- немного "допилил" статью=))
Пример как то тупо с монетами просто отойди от них на 600 м и тыкай по ним 3дэшечки: https://sketchfab.com/myactyindie Курентли воркс он: https://myacty.itch.io/raskopnik