Здравствуйте дорогие пользователи! Мечтали когда-нибудь создать систему диалогов в игре Game Maker? Если да, то читайте дальше.
Сначала нам необходимо сделать спрайт с несколькими частями (если я непонятно сказал см.скрин):
Теперь создаём объект o_dialogue, и создаём событие Create, в него, прописываем код:
Код
//Это нужно только для анимации появления-исчезания диалога dy=0; // диалог изначально не раскрыт alpha=0; // абсоютно прозрачен act=0; //этой перменной будем переключать состояния //act=0 - это появление диалога //act=1 - это вывод реплик //act=2 - это исчезновение дилога //Учите теорию автоматов, господа <img src="http://s12.ucoz.net/sm/1/happy.gif" border="0" align="absmiddle" alt="happy" />
//Это можно назвать перемнными для текущей реплики cur_text=""; //Это текущяа реплика str=""; // Это текущий текст - часть реплики pos=0; //позиция в текущей реплике, т.к. текст мы выводим бобуквенно cur_icon=-1; // текущая иконка - нет иконки
///Здесь можно задать массивом список имён говорящих, главное чтоб не путаться, для себя уставновить что-то в духе: // человек с id=0 - это "Человек 1" и у него иконка в спрайте под номером 0 name[0]="Человек 1"; name[1]="Подтверждатель"; name[2]="Лысый мужик";
//Хелперы, строка которая выводиться внизу призывая пользователя к действию. // Наши далоги можно будет пропускать и листать дальше при помощи кнопки Z str_help[0]="пропустить(Z)"; str_help[1]="продолжить(Z)";
// Ещё вот здесь я обычно выключаю главного персонажа // with o_player active=false; // у него всегда имеется перменная activate // так что я делаю так чтобы персонаж только слушал а не бродил по уровню // обратная активация персонажа делаеться в событии destroy
Как видите, объяснять ничего не буду, для этого есть комментарии в коде. Далее нам нужно событие Destroy. В него пропишем такой код:
Код
//Высвобождаем память dlg_close();
//Если вы занимаетесь активацией персонажа, то самое время сделать её здесь... // with o_player active=true;
//Запускаем событие для родительского объекта with par { event_user(0); }
И вновь не буду ничего объяснять - для этого см.комменты в коде. На этот раз нам нужно событие Alarm0. А вот и код для него:
Код
//Здесь мы проверяем очередь if ds_queue_size(q_id)>0 then { //в очереди ещё есть реплики, поэтому вытакскиваем следующую реплику и её автора cur_icon=ds_queue_dequeue(q_id); cur_text=ds_queue_dequeue(q_content); str=""; //текщий текст сбрасываем pos=0; // позицию - тоже alarm[1]=1; //запускаем реплику } else { //реплики кончились - переключаем act=2, то есть исчезановение диалога act=2; }
Комментарии в помощь. Теперь мы создаём событие Alarm1 и впишем код:
Код
//Здесь выводм посимвольно реплику if pos<string_length(cur_text) then { //конец строки не достигнут, поэтому сдвигаем позицию на 1 и к текущей строке добавляем новый символ //Здесь всё правильно. В GameMaker строки нумеруются с 1, а pos изначально равен 0. //Поэтому первая итерация сделает pos=1 и мы запишем в текщую строку первый символ. pos+=1; str+=string_char_at(cur_text,pos); alarm[1]=1; //Кстати, с условием тоже всё в порядке, когда у нас pos=string_length(cur_text), // то str уже содержит последний символ строки, т.к. добавление нового символа происходит после итерации pos }
Комментарии в помощь вам. Предпоследним будет событие Step. Вводим такой код:
Код
//Это простая анимация if act==0 then { if alpha<1 then alpha+=0.2; // выводим прозрачность в 1 if dy<100 then dy+=10 else // можно считать что это высота диалогового окна, в данном случае она ббудет равна 100 { //всё раскрыли, запускаем реплики act=1; // это типа ожидание, пока act=1 будут выводиться реплики. alarm[0]=5; } }
//исчезновение диалога if act==2 then { //пока прозрачность ненулевая - плавно её уменьшаем if alpha>0 then alpha-=0.1 else instance_destroy(); if dy<0 then dy-=20; }
//здесь мы проматываем диалоги if keyboard_check_pressed(ord("Z")) then { //при нажатии на кнопку Z (это может быть и любая другая кнопка) if cur_text!="" then//если текущий текст вообще есть, иначе нет смысла что-то проверять { if pos<string_length(cur_text) then { // если реплика не промоталась, то искуственно её проматываем pos=string_length(cur_text);//это чтобы не было косяков. Когда сработает очередной alarm[1] то перменная уже pos=string_length(...). иначе мы рискуем получить дубли символов в реплике str=cur_text;//текущая строка - есть текущая реплика } else { //если реплика промотана, то сбрасываем текущий текст и вызываем новую реплику(если она там будет) cur_text=""; alarm[0]=1; } } }
Последний раз повторюсь на всякий случай, хотите разобрать код, а не тупо его списать, читайте комментарии. И наконец событие Draw. В нём код:
Код
//рисуем!!!
//Я всегда делаю такое переобзначение для координат вида - потом легче работать гораздо. var vx, vy; vx=view_xview[0]; vy=view_yview[0];
// Сперва нарисуем чёрную подложку высотой в диалогове окно draw_set_alpha(0.5*alpha); draw_set_color(c_black);
draw_rectangle(vx,vy+480-dy*1.1,vx+600,vy+480,0);//<----это чисто спецэффект - тенюшка сверху дилогового окна
// теперь рисуем автора реплики draw_set_alpha(alpha); draw_set_color(c_white);
if cur_icon!=-1 then //если автор вообще существует { draw_sprite_ext(sprite0,cur_icon,vx+60,vy+480-dy*0.55,2,2,0,c_white,alpha); // выводим нужнйы спрайт draw_set_font(names_text_fnt); draw_set_color(c_gray); draw_text(vx+110,vy+480-dy*0.9,name[cur_icon]+":");// выводим нужное имя автора реплики }
//Далее текст реплики draw_set_color(c_white); draw_set_font(main_text_fnt); draw_set_alpha(alpha); draw_text_ext(vx+110,vy+480-dy*0.65,str,20,-1);//сама текущая реплика!
//Рисуем хелпер if cur_text!="" then { //тут я тоже иду на маленькую хитрость. var kk; kk=1;// изначально считаем что текст можно промотать if pos<string_length(cur_text) then { //если он уже промотан то призываем пользователя продолжить диалог... kk=0; } draw_set_font(helper_text_fnt); draw_set_color(c_gray); //я всегда такие штуки завожу массивом чтобы по условию переключать только индексы, а содержание массивов менять в событии create draw_text(vx+590-string_width(str_help[kk]),vy+480-24,str_help[kk]); }
Теперь создаём объект o_caller. Событие Create и его код:
Код
// тут всё просто dlg_create();//создаём диалог //наполняем его содержимым dlg_add_str(0,"Привет!#Это тестовая система диалогов!"); dlg_add_str(1,"Ага, KaramBino круто придумал!"); dlg_add_str(2,"Использовать очередь и событие user0"); dlg_add_str(1,"Кстати, сейчас это закончится#и игра закроется"); dlg_add_str(1,"Разве, ты с дуба рухнул."); //выводим и ждём пока рак на горе свиснет... dlg_activate();
Диалоги созданы!!! Разместите объекты в комнату и запускайте!!! С вами был KaramBino! До скорых встреч.
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Добавление диалогов (Game Maker)», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.