Пятница, 29 Марта 2024, 12:39

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Система диалогов. (Код от меня.=))
Система диалогов.
KrososДата: Среда, 18 Сентября 2013, 18:53 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
С 4 часов ночи сидел я , и делал диалоги.В итоге так задолбался , что сделал универсальный код диалогов , для максимального удобства.
Я его проверил , и вроде бы все работает.Подходит для любых спрайтов, шрифтов и прочего...
Может и не очень удобно , некоторым показалось , но это намного проще , чем то , что у меня было утром. bag

Познакомимся со скриптом.=)
Аргументов не хватило , и поэтому некоторые переменные от скрипта валяются вне его.
Сначала нужно создать объект , в create text_punkt=object_add() - пустой объект пунктов.
Назначаем Переменные:

global._text_font=font12 - шрифт для диалогов
_punktSPR_1=spr_text_punkt - спрайт не выбранного пункта
_punktSPR_2=spr_text_punkt_selest - спрайт выбранного пункта
_punktSPR_3=spr_text_punkt_none - спрайт недоступного пункта
_punkt_sound2=sound17 - звук доступного пункта(можно оставить 0)
_punkt_sound1=sound16 - звук не доступного пункта(можно оставить 0)
_text_sound=sound15 - звук текста(можно тоже оставить 0)
_frequency_of_the_sound=1 - частота "щелканья" звука во время набирания текста
_TextSpeed=1 - скорость текста
_1_punkt_text='Пункт1' - название пункта 1
_1_punkt_D=0 - доступен ли пункт?
_2_punkt_text='Пункт2' - название пункта 2
_2_punkt_D=0 - доступен ли пункт?

И так далее с пунктами , до 6. 6 - максимум.

О функции:
scr_dialog(xx,yy,text_window,30,text2,10,0,1,10,150,1,40,0,0,c_black,c_white)
1 и 2 число - координаты (x - середина y- нижний край)
3- спрайт фона для текста.Подойдет абсолютно любой!
4- размер вашей рамки , или расстояние , на котором текст или пункты будут отдаленны от краев фона для текста
5- сам текст.Скрипт не предусматривает размер вашего текста , поэтому рассчитывайте его сами.
6- размер шрифта , сам гейммэкер , не умеет его узнавать...
7-количество пунктов диалога ,максимум 6, если оставить на 0 , то достаточно будет кликнуть по области текста.
8-растянуть спрайты пунктов?Если да , то спрайты будут растянуты вдоль текстов пунктов , даже учитывая несколько строк(Если конечно используется знак#)
9-высота расположения пунктов от рамки
10-горизонтальная дистанция между пунктами
11- расположение пунктов.Если 0 , то пункты расположатся на нижнем ряду ( все 6) , если 1 , то пункты расположатся в 2 или 3 столбика1
12- вертикальная дистанция (если число 11 равно 0 , иначе смысла не имеет)
13- появление , если 1 , то диалог появится со временем, если 0 , то диалог мгновенно появится.Используется для начала диалога.
14- исчезновение , то же ,что и первое , но диалог исчезает.Используется для завершения диалога.
15- цвет обводки теста
16- цвет самого текста

Как использовать код:

Сначала назначаем переменные текстами:
text1='Выберите пункт'
text2='Выбран пункт 1'
text3='Выбран пункт 2'
text4='Выбран пункт 3'
text5='Выбран пункт 4'
text6='Выбран пункт 5'
text7='Выбран пункт 6'
text8='Спасибо за выбор'
Затем назначаем переменные:
global._text_font=font12
_punktSPR_1=spr_text_punkt
_punktSPR_2=spr_text_punkt_selest
_punktSPR_3=spr_text_punkt_none
_punkt_sound2=sound17
_punkt_sound1=sound16
_text_sound=sound15
xx=view_xview[0]+640
yy=view_yview[0]+1024
_frequency_of_the_sound=1
_TextSpeed=1

Используем переключение сцен:
switch Scene{ //Проверяем номер сцены
case 1: //Сцена 1
//Даем названия пунктам и назначаем им доступность:
_1_punkt_text='Пункт1'
_1_punkt_D=0
_2_punkt_text='Пункт2'
_2_punkt_D=0
_3_punkt_text='Пункт3'
_3_punkt_D=0
_4_punkt_text='Пункт4'
_4_punkt_D=0
_5_punkt_text='Пункт5'
_5_punkt_D=0
_6_punkt_text='Пункт6'
_6_punkt_D=1

scr_dialog(xx,yy,text_window,30,text1,10,6,1,10,150,1,40,1,0,c_black,c_white)
switch _Current_Punkt{ //Проверяем выбранный пункт.Выбранный пункт нам доступен только под диалогом!
case 1: Scene=2 break //Если игрок выбрал пункт 1 , то он перейдет на сцену 2, также и с остальными
case 2: Scene=3 break
case 3: Scene=4 break
case 4: Scene=5 break
case 5: Scene=6 break
case 6: Scene=7 break
}break
case 2:
scr_dialog(xx,yy,text_window,30,text2,10,0,1,10,150,1,40,0,0,c_black,c_white)
if _Current_Punkt=-1{Scene=8}break //Если пунктов не существует , то при нажатии по диалогу , _Current_Punkt будет равен -1
case 3:
scr_dialog(xx,yy,text_window,30,text3,10,0,1,10,150,1,40,0,0,c_black,c_white)
if _Current_Punkt=-1{Scene=8}break
case 4:
scr_dialog(xx,yy,text_window,30,text4,10,0,1,10,150,1,40,0,0,c_black,c_white)
if _Current_Punkt=-1{Scene=8}break
case 5:
scr_dialog(xx,yy,text_window,30,text5,10,0,1,10,150,1,40,0,0,c_black,c_white)
if _Current_Punkt=-1{Scene=8}break
case 6:
scr_dialog(xx,yy,text_window,30,text6,10,0,1,10,150,1,40,0,0,c_black,c_white)
if _Current_Punkt=-1{Scene=8}break
case 7:
scr_dialog(xx,yy,text_window,30,text7,10,0,1,10,150,1,40,0,0,c_black,c_white)
if _Current_Punkt=-1{Scene=8}break
case 8:
scr_dialog(xx,yy,text_window,30,text8,10,0,1,10,150,1,40,0,1,c_black,c_white)
if _Current_Punkt=-1{Scene=0 global.TheatrEnd=1} //Сцена завершилась , занавес закрылся
break
}


Если что-то не понятно - спрашивайте.
И вот еще скриншот:


Для тех , кто не понял даже , что такое рамка ,вот пример

Вот 2 скрипта:
scr_text_punkt - код пунктов диалога
Код
with argument0{
draw_set_halign(fa_center)
draw_set_valign(fa_center)

_Str=0
for (_O=0  ;string_length(argument1)>_O ;_O+=1){
if string_char_at(argument1,_O)='#'{_Str+=1} }
argument3+=4

if argument4=0{
_xxx=sprite_get_width(argument5)/2
_yyy=sprite_get_height(argument5)/2

if (x-_xxx)<mouse_x and mouse_x <(x+_xxx) and (y-_yyy)<mouse_y and mouse_y<(y+_yyy){
if argument8=0 {draw_sprite(argument6,-1,x,y)}else{draw_sprite(argument7,-1,x,y)}
global._Selected_Punkt[argument2]=1}
else{
if argument8=0 {draw_sprite(argument5,-1,x,y)}else{draw_sprite(argument7,-1,x,y)}
global._Selected_Punkt[argument2]=0}}

if argument4=1{
_xxx=(string_length(argument1)*argument3/2)/(_Str+1)
_yyy=argument3*_Str+argument3

if (x-_xxx)<mouse_x and mouse_x <(x+_xxx) and (y-_yyy)<mouse_y and mouse_y<(y+_yyy){
if argument8=0 {draw_sprite_stretched(argument6,-1,x-_xxx,y-_yyy,_xxx*2,_yyy*2-argument3/4)}else{{draw_sprite_stretched(argument7,-1,x-_xxx,y-_yyy,_xxx*2,_yyy*2-argument3/4)}}
global._Selected_Punkt[argument2]=1}
else{
if argument8=0 {draw_sprite_stretched(argument5,-1,x-_xxx,y-_yyy,_xxx*2,_yyy*2-argument3/4)}else{{draw_sprite_stretched(argument7,-1,x-_xxx,y-_yyy,_xxx*2,_yyy*2-argument3/4)}}
global._Selected_Punkt[argument2]=0}}

//draw_text_ol(x,y-argument3/4,argument1,c_white,c_black,global._text_font)
draw_set_font(global._text_font)
draw_set_color(argument9)
draw_text(x+1,y-argument3/4,argument1)
draw_text(x-1,y-argument3/4,argument1)
draw_text(x,y-argument3/4-1,argument1)
draw_text(x,y-argument3/4+1,argument1)
draw_set_color(argument10)
draw_text(x,y-argument3/4,argument1)

draw_set_halign(fa_left)
draw_set_valign(fa_left)
}


scr_dialog - код самих диалогов
Код
//argument0 - x()
//argument1 - y()
//argument2 - spr()
//argument3 - size()
//argument4 - text()
//argument5 - font_size
//argument6 - punkt_number(1,2,3,4,5,6)
//argument7 - punkt_stretching(0,1)
//argument8 - punkt_height()
//argument9 - punkt_H_distantion()
//argument10- punkt_location(0,1)
//argument11- punkt_V_distantion()
//argument12- appearance(0,1)
//argument13- disappearance(0,1)
//argument14- text_coolor1
//argument15- text_coolor2

draw_set_valign(fa_top)
if  argument12=1 and _appearance=0 and _Simvols=0{_appearance=1 _text_alpha=0}
if _appearance=1 and _text_alpha<1{_text_alpha+=0.02}else{if _disappearance=0 {_appearance=0 _text_alpha=1}}
if _Simvols=0 {_Speed=_TextSpeed _timer=1}

_Current_Punkt=0
_xx=argument0
_yy=argument1
_sizex=sprite_get_width(argument2)/2
_sizey=sprite_get_height(argument2)
if _Simvols>_MaxSimvols{_Simvols=_MaxSimvols }
draw_sprite_ext(argument2,-1,_xx,_yy,1,1,0,c_white,_text_alpha)

draw_set_alpha(_text_alpha)
draw_set_font(global._text_font)
draw_set_color(argument14)
draw_text(_xx-_sizex+argument3-1,_yy-_sizey+argument3-argument5/2,string_copy(argument4,0,floor(_Simvols)))
draw_text(_xx-_sizex+argument3+1,_yy-_sizey+argument3-argument5/2,string_copy(argument4,0,floor(_Simvols)))
draw_text(_xx-_sizex+argument3,_yy-_sizey+argument3-argument5/2-1,string_copy(argument4,0,floor(_Simvols)))
draw_text(_xx-_sizex+argument3,_yy-_sizey+argument3-argument5/2+1,string_copy(argument4,0,floor(_Simvols)))
draw_set_color(argument15)
draw_text(_xx-_sizex+argument3,_yy-_sizey+argument3-argument5/2,string_copy(argument4,0,floor(_Simvols)))

_MaxSimvols=string_length(argument4)

if _Simvols=_MaxSimvols and _disappearance=0{
switch argument6{
case 1:
if instance_exists(text_punkt)=0{
_1_punkt=instance_create(_xx,_yy-argument3-argument5,text_punkt)
}
break
case 2:
if instance_exists(text_punkt)=0{
_1_punkt=instance_create(_xx-argument9*1.66,_yy-argument8-argument3-argument5,text_punkt)
_2_punkt=instance_create(_xx+argument9*1.66,_yy-argument8-argument3-argument5,text_punkt)
}
break
case 3:
if instance_exists(text_punkt)=0{
_1_punkt=instance_create(_xx-argument9*1.66,_yy-argument8-argument3-argument5,text_punkt)
_2_punkt=instance_create(_xx,_yy-argument8-argument3-argument5,text_punkt)
_3_punkt=instance_create(_xx+argument9*1.66,_yy-argument8-argument3-argument5,text_punkt)
}
break
case 4:
if instance_exists(text_punkt)=0{
if argument10=0{
_1_punkt=instance_create(_xx-argument9*1.66,_yy-argument8-argument3-argument5,text_punkt)
_2_punkt=instance_create(_xx-argument9,_yy-argument8-argument3-argument5,text_punkt)
_3_punkt=instance_create(_xx+argument9,_yy-argument8-argument3-argument5,text_punkt)
_4_punkt=instance_create(_xx+argument9*1.66,_yy-argument8-argument3-argument5,text_punkt)
}
if argument10=1{
_1_punkt=instance_create(_xx-argument9,_yy-argument8-argument3-argument5-argument11,text_punkt)
_2_punkt=instance_create(_xx-argument9,_yy-argument8-argument3-argument5,text_punkt)
_3_punkt=instance_create(_xx+argument9,_yy-argument8-argument3-argument5-argument11,text_punkt)
_4_punkt=instance_create(_xx+argument9,_yy-argument8-argument3-argument5,text_punkt)
}
}
break
case 5:
if instance_exists(text_punkt)=0{
if argument10=0{
_1_punkt=instance_create(_xx-argument9*1.66,_yy-argument8-argument3-argument5,text_punkt)
_2_punkt=instance_create(_xx-argument9,_yy-argument8-argument3-argument5,text_punkt)
_3_punkt=instance_create(_xx,_yy-argument8-argument3-argument5,text_punkt)
_4_punkt=instance_create(_xx+argument9,_yy-argument8-argument3-argument5,text_punkt)
_5_punkt=instance_create(_xx+argument9*1.66,_yy-argument8-argument3-argument5,text_punkt)
}
if argument10=1{
_1_punkt=instance_create(_xx-argument9,_yy-argument8-argument3-argument5-argument11,text_punkt)
_2_punkt=instance_create(_xx-argument9,_yy-argument8-argument3-argument5,text_punkt)
_3_punkt=instance_create(_xx,_yy-argument8-argument3-argument5-argument11/2,text_punkt)
_4_punkt=instance_create(_xx+argument9,_yy-argument8-argument3-argument5-argument11,text_punkt)
_5_punkt=instance_create(_xx+argument9,_yy-argument8-argument3-argument5,text_punkt)
}
}
break
case 6:
if instance_exists(text_punkt)=0{
if argument10=0{
_1_punkt=instance_create(_xx-argument9*1.66,_yy-argument8-argument3-argument5,text_punkt)
_2_punkt=instance_create(_xx-argument9,_yy-argument8-argument3-argument5,text_punkt)
_3_punkt=instance_create(_xx-argument9/3,_yy-argument8-argument3-argument5,text_punkt)
_4_punkt=instance_create(_xx+argument9/3,_yy-argument8-argument3-argument5,text_punkt)
_5_punkt=instance_create(_xx+argument9,_yy-argument8-argument3-argument5,text_punkt)
_6_punkt=instance_create(_xx+argument9*1.66,_yy-argument8-argument3-argument5,text_punkt)

}
if argument10=1{
_1_punkt=instance_create(_xx-argument9*1.66,_yy-argument8-argument3-argument5-argument11,text_punkt)
_2_punkt=instance_create(_xx-argument9*1.66,_yy-argument8-argument3-argument5,text_punkt)
_3_punkt=instance_create(_xx,_yy-argument8-argument3-argument5,text_punkt)
_4_punkt=instance_create(_xx,_yy-argument8-argument3-argument5-argument11,text_punkt)
_5_punkt=instance_create(_xx+argument9*1.66,_yy-argument8-argument3-argument5-argument11,text_punkt)
_6_punkt=instance_create(_xx+argument9*1.66,_yy-argument8-argument3-argument5,text_punkt)
}
}
break
}
scr_text_punkt(_1_punkt,_1_punkt_text,1,argument5,argument7,_punktSPR_1,_punktSPR_2,_punktSPR_3,_1_punkt_D,argument14,argument15)
scr_text_punkt(_2_punkt,_2_punkt_text,2,argument5,argument7,_punktSPR_1,_punktSPR_2,_punktSPR_3,_2_punkt_D,argument14,argument15)
scr_text_punkt(_3_punkt,_3_punkt_text,3,argument5,argument7,_punktSPR_1,_punktSPR_2,_punktSPR_3,_3_punkt_D,argument14,argument15)
scr_text_punkt(_4_punkt,_4_punkt_text,4,argument5,argument7,_punktSPR_1,_punktSPR_2,_punktSPR_3,_4_punkt_D,argument14,argument15)
scr_text_punkt(_5_punkt,_5_punkt_text,5,argument5,argument7,_punktSPR_1,_punktSPR_2,_punktSPR_3,_5_punkt_D,argument14,argument15)
scr_text_punkt(_6_punkt,_6_punkt_text,6,argument5,argument7,_punktSPR_1,_punktSPR_2,_punktSPR_3,_6_punkt_D,argument14,argument15)
}

if _Simvols<_MaxSimvols and _appearance=0 {if mouse_check_button_pressed( mb_left) and mouse_y<yy and mouse_y>(yy-_sizey) and mouse_x>(xx-_sizex) and mouse_x<(xx+_sizex){
_Speed=_Speed*5 io_clear()}else{_Simvols+=_Speed  _timer-=1 if _timer=0{_timer=_frequency_of_the_sound if _text_sound>0{sound_play(_text_sound)}}}}

if mouse_check_button_pressed(mb_left) and _Simvols=_MaxSimvols and _disappearance=0{
if argument6=0 and mouse_y<yy and mouse_y>(yy-_sizey) and mouse_x>(xx-_sizex) and mouse_x<(xx+_sizex)  {with text_punkt {instance_destroy()} if argument13=1{_disappearance=1}else{ _Current_Punkt=-1 _Simvols=0 }  if _punkt_sound2>0{sound_play(_punkt_sound2)}}
if global._Selected_Punkt[1]=1 {if _1_punkt_D=1{if _punkt_sound1>0{sound_play(_punkt_sound1)}}else{with text_punkt {instance_destroy()}  if _punkt_sound2>0{sound_play(_punkt_sound2)}  if argument13=1{_disappearance=1}else{_Simvols=0 _Current_Punkt=1 global._Selected_Punkt[1]=0}}}
if global._Selected_Punkt[2]=1 {if _2_punkt_D=1{if _punkt_sound1>0{sound_play(_punkt_sound1)}}else{with text_punkt {instance_destroy()}  if _punkt_sound2>0{sound_play(_punkt_sound2)}  if argument13=1{_disappearance=1}else{_Simvols=0 _Current_Punkt=2 global._Selected_Punkt[2]=0}}}
if global._Selected_Punkt[3]=1 {if _3_punkt_D=1{if _punkt_sound1>0{sound_play(_punkt_sound1)}}else{with text_punkt {instance_destroy()}  if _punkt_sound2>0{sound_play(_punkt_sound2)}  if argument13=1{_disappearance=1}else{_Simvols=0 _Current_Punkt=3 global._Selected_Punkt[3]=0}}}
if global._Selected_Punkt[4]=1 {if _4_punkt_D=1{if _punkt_sound1>0{sound_play(_punkt_sound1)}}else{with text_punkt {instance_destroy()}  if _punkt_sound2>0{sound_play(_punkt_sound2)}  if argument13=1{_disappearance=1}else{_Simvols=0 _Current_Punkt=4 global._Selected_Punkt[4]=0}}}
if global._Selected_Punkt[5]=1 {if _5_punkt_D=1{if _punkt_sound1>0{sound_play(_punkt_sound1)}}else{with text_punkt {instance_destroy()}  if _punkt_sound2>0{sound_play(_punkt_sound2)}  if argument13=1{_disappearance=1}else{_Simvols=0 _Current_Punkt=5 global._Selected_Punkt[5]=0}}}
if global._Selected_Punkt[6]=1 {if _6_punkt_D=1{if _punkt_sound1>0{sound_play(_punkt_sound1)}}else{with text_punkt {instance_destroy()}  if _punkt_sound2>0{sound_play(_punkt_sound2)}  if argument13=1{_disappearance=1}else{_Simvols=0 _Current_Punkt=6 global._Selected_Punkt[6]=0}}}
}
if  _disappearance=1 {_text_alpha-=0.04}
if  _disappearance=1 and _text_alpha<=0 {
if global._Selected_Punkt[1]=1{_Current_Punkt=1 global._Selected_Punkt[1]=0}
if global._Selected_Punkt[2]=1{_Current_Punkt=2 global._Selected_Punkt[2]=0}
if global._Selected_Punkt[3]=1{_Current_Punkt=3 global._Selected_Punkt[3]=0}
if global._Selected_Punkt[4]=1{_Current_Punkt=4 global._Selected_Punkt[4]=0}
if global._Selected_Punkt[5]=1{_Current_Punkt=5 global._Selected_Punkt[5]=0}
if global._Selected_Punkt[6]=1{_Current_Punkt=6 global._Selected_Punkt[6]=0}
if argument6=0{_Current_Punkt=-1} _disappearance=0  _Simvols=0}     

draw_set_valign(fa_left)





Мой проект


Сообщение отредактировал Krosos - Четверг, 19 Сентября 2013, 07:03
berilДата: Среда, 18 Сентября 2013, 18:58 | Сообщение # 2
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Пункт 6 не выбирается



Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
KrososДата: Среда, 18 Сентября 2013, 19:07 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
beril, пункт 6 недоступен , для примера.
Вот смотри:
_1_punkt_text='Пункт1'
_1_punkt_D=0
_2_punkt_text='Пункт2'
_2_punkt_D=0
_3_punkt_text='Пункт3'
_3_punkt_D=0
_4_punkt_text='Пункт4'
_4_punkt_D=0
_5_punkt_text='Пункт5'
_5_punkt_D=0
_6_punkt_text='Пункт6'
_6_punkt_D=1


Добавлено (18.09.2013, 19:07)
---------------------------------------------
И еще , забыл сказать , на прошедшие сцены , котороые уже были, можно возвращаться.
Пример:





Мой проект


Сообщение отредактировал Krosos - Среда, 18 Сентября 2013, 19:10
CreatingOverДата: Среда, 18 Сентября 2013, 19:43 | Сообщение # 4
ColdGamedev
Сейчас нет на сайте
Krosos, а break зачем на каждую сцену то ставить? Смысла не вижу, но код это увеличивает.

Я снова с вами:з
Возвращение легенды. (нет)
KrososДата: Среда, 18 Сентября 2013, 20:07 | Сообщение # 5
постоянный участник
Сейчас нет на сайте
CreatingOver,
switch (<выражение>)
{
case <выражение1>: <оператор1>; ... ; break;
case <выражение2>: <оператор2>; ... ; break;
...
default: <оператор>; ...
}

Потому что в справке так написано.
А идти против справки , я не рискую.





Мой проект
CreatingOverДата: Среда, 18 Сентября 2013, 20:21 | Сообщение # 6
ColdGamedev
Сейчас нет на сайте
Ясно.. Просто я привык откидывать в скобки, а не брэйкать каждое действие.

Я снова с вами:з
Возвращение легенды. (нет)
KrososДата: Среда, 18 Сентября 2013, 22:02 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
CreatingOver, Вот не поставил break , я только что , и сразу косяк вылетел не приятный...
Какого-то хрена , нижние переменные объявились тогда , когда должны были объявиться верхние.
Как вы без break и скобок все делаете?O_o
Я только забуду поставить ,и у меня сразу начинаются неприятности.





Мой проект


Сообщение отредактировал Krosos - Среда, 18 Сентября 2013, 22:03
DARKLORDДата: Среда, 18 Сентября 2013, 22:10 | Сообщение # 8
был не раз
Сейчас нет на сайте
Как-то названия переменных не очень. Саму систему даже смотреть не стал, трудно воспринимается. Проще свою хрень написать.
KrososДата: Среда, 18 Сентября 2013, 22:16 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
DARKLORD, ага , напиши , тебе слишком простым все показалось.




Мой проект
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Система диалогов. (Код от меня.=))
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг