Вторник, 19 Марта 2024, 09:18

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [354]
Статьи об общих понятиях связанных с созданием игр.
Программирование [82]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [144]
Статьи о программах для создания игр, уроки и описания.
Софт [39]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [16]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [160]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [128]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Игры какого жанра вы предпочитаете делать?
Всего ответов: 14610
Главная » Статьи » Создание игр

Добавление диалогов (Game Maker)
Здравствуйте дорогие пользователи! Мечтали когда-нибудь создать систему диалогов в игре 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*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,"Ага, KaramBino круто придумал!");
dlg_add_str(2,"Использовать очередь и событие user0");
dlg_add_str(1,"Кстати, сейчас это закончится#и игра закроется");
dlg_add_str(1,"Разве, ты с дуба рухнул.");
//выводим и ждём пока рак на горе свиснет...
dlg_activate();


Диалоги созданы!!! Разместите объекты в комнату и запускайте!!! С вами был KaramBino! До скорых встреч.
Категория: Создание игр | Добавил: KaramBino (10 Марта 2014)
Просмотров: 16309 | Комментарии: 8 | Рейтинг: 3.1/15 |
Теги: Статьи о GameMaker, Модные диалоги, Коды для GameMaker, Диалоги для Game Maker, Украшаем, Классные диалоги, уроки по Game Maker, Диалоги, Game Maker 8
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Добавление диалогов (Game Maker)», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 8
+0-
8 Biozombio   (09 Января 2015 17:48) [Материал]
К любым спрайтам (люди в полном виде) это применить можно?

+0-
7 89527759420   (25 Ноября 2014 19:06) [Материал]
89527759420http://computercreati.ucoz.ru/ на этом сайте можно скачать Game Maker
посмотреть уроки добавить свою игру

+0-
6 k0fe   (29 Мая 2014 01:48) [Материал]
k0feКидай исходник.

+0-
5 White_helin   (17 Апреля 2014 15:49) [Материал]
White_helinИсходник. Обычный исходник.

+0-
4 StarBerry   (17 Марта 2014 08:21) [Материал]
StarBerryА сама статья несёт какой-то смысл.

+0-
3 StarBerry   (17 Марта 2014 08:21) [Материал]
StarBerrystalker5889, так и надо этому копировщику!

+0-
1 KaramBino   (11 Марта 2014 15:41) [Материал]
KaramBinoКак статья?

+7-
2 stalker5889   (15 Марта 2014 14:38) [Материал]
stalker5889Статьи вообщем нет. Это скорее исходник. Просто код с комментариями "вставьте это сюда, а это сюда".

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • Aether3D
  • Noobster
  • Ultra Engine
  • G3D Engine
  • LÖVR
  • RPG Tools
  • World Forge
  • Bos Wars
  • RPGWizard
  • Glint 3d
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг