Вторник, 23.04.2024, 20:48
Главная Регистрация RSS
Приветствую Вас, Гость
Поиск по сайту
Авторизация

Меню сайта
Game Maker
Если вы только-только начали изучать игрострой и еще даже не успели скачать сам Game Maker, предлагаем вам на выбор следующие версии программы:

Game Maker 8.1
Классика. Идеально подходит для создания простых 2D игр на PC. Требует активации.
Game Maker for Mac
Абсолютно та же программа, но только для пользователей Mac. Требует активации.
Game Maker Studio
Самая новая версия с возможностью кроссплатформенной разработки. Бесплатна.
Топ 5 игр
Агент Green 4.2 / 5.0
FeDo 4.2 / 5.0
To Mars: Sec... 4.2 / 5.0
To Mars+MapE... 3.9 / 5.0
Paintball 3.8 / 5.0

Топ игр составлен путем пользовательского голосования.

Если вы не согласны с какой-либо оценкой, примите участие и поставьте свой балл игре. Ваша оценка очень важна для нас ;)
Статистика



На сайте: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Разработка игр

Добавление диалогов

Здравствуйте дорогие пользователи! Мечтали когда-нибудь создать систему диалогов в игре Game Maker? Если да, то читайте дальше.

Сначала нам необходимо сделать спрайт с несколькими частями (если я непонятно сказал см.скрин):


Теперь создаём объект o_dialogue, и создаём событие Create, в него, прописываем код:

//Это нужно только для анимации появления-исчезания диалога
dy=0; // диалог изначально не раскрыт
alpha=0; // абсоютно прозрачен
act=0; //этой перменной будем переключать состояния
//act=0 - это появление диалога
//act=1 - это вывод реплик
//act=2 - это исчезновение дилога
//Учите теорию автоматов, господа ^_^

//Это можно назвать перемнными для текущей реплики
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*0.8);
draw_rectangle(vx,vy+480-dy,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,"Ага, Аркаша круто придумал!");
dlg_add_str(2,"Использовать очередь и событие user0");
dlg_add_str(1,"Кстати, сейчас это закончится#и игра закроется");
dlg_add_str(1,"Разве, ты с дуба рухнул.");
//выводим и ждём пока рак на горе свиснет...
dlg_activate();

Диалоги созданы!!! Разместите объекты в комнату и запускайте!!! С вами был Аркаша! До скорых встреч.


Источник: http://igrostroystroyi.ucoz.ru/publ/sozdanie_igr/dobavlenie_dialogov/1-1-0-14 (BESTROV это я)
Категория: Разработка игр | Добавил: MasterSambo (11.03.2014)
Просмотров: 4077 | Комментарии: 3 | Рейтинг: 1.8/10
Всего комментариев: 3
3 Xomafok   (06.04.2014 10:10) [Материал]
Xomafok Пора уже смириться, что все файлы и уроки Аркаши - просто плагиат.

2 BRESS   (11.03.2014 10:01) [Материал]
BRESS Ужасная статья. Ничего не объяснено, оформление унылое. Да и вообще это сплошной кусок кода из чужого примера, а не статья. Более чем уверен, что ты даже сам не понимаешь, как эта штуковина работает.

1 MasterSambo   (11.03.2014 06:38) [Материал]
MasterSambo Коды не мои, но статья моя - значит авторская.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]