С 4 часов ночи сидел я , и делал диалоги.В итоге так задолбался , что сделал универсальный код диалогов , для максимального удобства. Я его проверил , и вроде бы все работает.Подходит для любых спрайтов, шрифтов и прочего... Может и не очень удобно , некоторым показалось , но это намного проще , чем то , что у меня было утром.
Познакомимся со скриптом.=) Аргументов не хватило , и поэтому некоторые переменные от скрипта валяются вне его. Сначала нужно создать объект , в 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_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)
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 _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}
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) --------------------------------------------- И еще , забыл сказать , на прошедшие сцены , котороые уже были, можно возвращаться. Пример:
switch Scene{ case 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 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=1}break
CreatingOver, Вот не поставил break , я только что , и сразу косяк вылетел не приятный... Какого-то хрена , нижние переменные объявились тогда , когда должны были объявиться верхние. Как вы без break и скобок все делаете?O_o Я только забуду поставить ,и у меня сразу начинаются неприятности.
switch Scene3{ case 1: _1_punkt_text='Огонь' _1_punkt_D=0 _2_punkt_text='Буран' _2_punkt_D=0 _3_punkt_text='Молния' _3_punkt_D=0 _4_punkt_text='Удары земли' _4_punkt_D=0 _5_punkt_text='Психоз' _5_punkt_D=0 _6_punkt_text='Назад' _6_punkt_D=0 scr_dialog(xx,yy,text_window,30,text3_1,10,6,1,10,200,1,40,0,0,c_black,c_white) switch _Current_Punkt{ case 1: Scene3=0 Scene3_1=1 break case 2: Scene3=0 Scene3_1=2 break case 3: Scene3=0 Scene3_1=3 break case 4: Scene3=0 Scene3_1=4 break case 5: Scene3=0 Scene3_1=5 break case 6: Scene3=0 Scene=3 break }break case 2: _1_punkt_text='Лечение' _1_punkt_D=0 _2_punkt_text='Ускорение' _2_punkt_D=0 _3_punkt_text='Рассеивание' _3_punkt_D=0 _4_punkt_text='Регенерация' _4_punkt_D=0 _5_punkt_text='Возвращение' _5_punkt_D=0 _6_punkt_text='Назад' _6_punkt_D=0 scr_dialog(xx,yy,text_window,30,text3_1,10,6,1,10,200,1,40,0,0,c_black,c_white) switch _Current_Punkt{ case 1: Scene3=0 Scene3_2=1 break case 2: Scene3=0 Scene3_2=2 break case 3: Scene3=0 Scene3_2=3 break case 4: Scene3=0 Scene3_2=4 break case 5: Scene3=0 Scene3_2=5 break case 6: Scene3=0 Scene=3 break }break }