Сайт Anivisual.net закрыт

Он продолжит функционировать в виде архива. Новые материалы добавлять нельзя.

Персонажи (Character).

Персонажи (Character).

Персонажи

В большинстве визуальных новелл, главную роль играют, так называемые персонажи.

И дабы было проще работать с персонажами, в Ren'Py есть такое понятие, как Character. Он регистрируется в блоке init, и состоит из нескольких аргументов.

Самый простой character выглядит примерно так:
Код
init:
    $ nm = Character(u"Имя", color="#ffffff")

nm - регистрируемое название, для быстрого написания, в коде, пред самой репликой. .
u"Имя" - имя, которым будет подписана реплика, выведенная на экран.

color - цвет имени, указывается в стандартной, для Ren'Py, цветовой модели RGB.

Регистрируемое название, необходимо вписывать пред нужной вам репликой:
Код
label start:
    nm "Hello, world!"


Аргументы для автоматического добавления символов в начало/конец имени персонажа, либо реплики:


К примеру, перед именем персонажа поставим многоточие, а после реплики, восклицательный знак.
Код
init:
    $ nm = Character (u"Имя", color="#ffffff",
    who_prefix = '...',
    what_suffix = '!' )
label start:
    nm "Hello, world"



Давайте создадим персонажа, с уникальным для него диалоговым окном и расположенным, слева от реплик, спрайтом.
Для этого нам нужно иметь спрайт диалогового окна и непосредственно, персонажа.
Если разрешение игры 800х600, то стандартный размер диалогового окна будет составлять 800x150 пикселей.
Спрайт для персонажа, я возьму, размером 150х200 пикселей.
Код
init:
#...Обычный персонаж
    $ nm = Character(u"Имя", color="#ffffff", who_prefix = '...', what_suffix = '!')  

#...Мой персонаж
    $ er = Character(_(u'Эрвин'), color="#b1bab1", window_left_padding=160, window_background="do.png",  
                    show_side_image=Image("er_h.png", xalign=0.0, yalign=1.0))

label start:
    nm "Обычный персонаж"
    er "Мой персонаж"
    return #...Возвращение в главное меню

window_left_padding=160 - указание расположения текста в диалоговом окне, относительно левой стороны экрана, поскольку спрайт персонажа занимает 150 пикселей, ещё 10 оставим, дабы между спрайтом и текстом было немного свободного пространства.
window_background="do.png" - указание фона, для диалогового окна.
show_side_image=Image("er_h.png", xalign=0.0, yalign=1.0) - строка, для определения спрайта персонажа для текста, так называемая "голова".

P.S. xalign - значение с плавающей точкой, по координате X, yalign - значение с плавающей точкой, по координате Y.
P.S.S. Строка window_left_padding взята из options.rpy.

Результат:
Обычный персонаж:


Мой персонаж:

Таких эффектов можно добиться, используя лишь character.

P.S.S.S. Если у вас "головы" у всех персонажей, то тогда window_left_padding лучше менять в самом options.rpy, нежели каждому персонажу прописывать одно и то же.

Уже зарегистрированные персонажи

В Ren'Py имеется пара, уже зарегистрированных персонажей.

1. centered - выводит текст по центру экрана, без диалогового окна.
Код
label start:
    scene black #...Чёрный фон
    centered "Hello, world!"



2. extend - продолжает предыдущую реплику. Удобно, если вам необходимо, во время реплики, произвести смену спрайта, а после продолжить данную реплику. Речь о нём уже шла.

Аргументов для персонажей можно записывать бесконечное множество. Создавайте персонажей, как будет удобней вам.

©Программист Celestial Novels
18
Декабрь
31
4.0
33292
Добавлять комментарии могут только зарегистрированные пользователи.

Комментарии к записи: 31

avatar
#1 Рангес
в 19:06 (25/Сен/2014)
2
отличная статья, молодец! продолжай в том же духе!
avatar
#2 sDextra
132
в 19:09 (25/Сен/2014)
0
Спасибо :3 Буду стараться ^^
avatar
#26 Ennka
40987
в 18:50 (13/Сен/2016)
0
У меня такой вопрос. Можно ли сделать одновременно два диалоговых окна? Допустим для ГГ диалоговое окно стандартное и находится внизу, а реплики остальных персонажей появляются в отдельных диалоговых окнах "облачках".
Я уже бьюсь над этим очень долгое время. Надеюсь, что хотя бы здесь мне помогут angry
avatar
#3 barsunduk
860
в 23:10 (25/Сен/2014)
1
> Если у вас "головы" у всех персонажей, то тогда window_left_padding лучше менять в самом options.rpy, нежели каждому персонажу прописывать одно и то же.

в таком случае и для обычного текста будет отступ для картинки, которой нет. а вдруг вы не хотите такого отступа для обычного текста? поможет это:

init:
# narrator - это пустой персонаж. т.е. просто текст
....define narrator = Character(None, window_left_padding=0) # без отступа!

# а это, чтобы не лезть в options.rpy,
# изменим отступ прямо из script.rpy:
....$ style.window.left_padding=200
....$ style.rebuild()

# теперь в объявлении говорящей головы можно не указывать отступ
....image side dudehead = "dudehead.png"
....define dude = Character("Чувак", image=dudehead)
avatar
#4 sDextra
132
в 07:33 (26/Сен/2014)
0
>изменим отступ прямо из script.rpy
Точно, забыл упомянуть, спасибо. smile_45
avatar
#5 Vinriala
3772
в 12:54 (10/Фев/2015)
0
У меня вопрос насчёт вывода текста без диалогового окна. Есть ли теги для перенесения текста на следующую строчку, как в стихотворениях обычно делают? Либо для перехода с одной сцены на другую, если есть только этот чёрный экран.
avatar
#6 sDextra
132
в 01:15 (05/Май/2015)
0
Тег - \n для перевода на новую строку. К примеру
"Hello \nWorld!"
Будет как:

"Hello
World!"
Ответ от слоу-слоу-слоупока.
avatar
#7 Chrono_
6827
в 01:43 (05/Май/2015)
0
Мммм...объясните, пожалуйста, для д***ла Х_Х . Вот вы говорите стандартное разрешение экрана 800*600, вот я беру свое диалоговое окно в формате png которое, как показывает paint, имеет размер 800*600. Если я уменьшу до ххх*150, то он автоматически уменьшает и длину, т.е. получается НЕ 800*150, А 200*150. smile_13
avatar
#8 sDextra
132
в 17:29 (07/Май/2015)
0
Диалоговое окно должно быть по больше части ширины экрана, и во всю "его" высоту. К примеру, если экран 800х600, а диалоговое окно в высоту 200, то надо обрезать его, дабы не было лишнего, т.е. к примеру 800х200, ну или меньшей ширины, как предпочтительней.
avatar
#9 Cordelia_FT
7804
в 17:50 (02/Июн/2015)
0
love спасибо!
avatar
#10 Leshiy133
8334
в 21:56 (04/Сен/2015)
0
Объясните, пожалуйста, что за:
"Sayer mio is not a function or string"
"Sayer jul is not a function or string"
????

у меня персонажи говорить не могут, ошибка вылетает Т.Т
А они и на экране показаны верно
и в ините прописаны:
$ mio = Character(u'Мио', color="#B22222")
$ jul = Character(u'Джульетта', color="#FF8C00")
cry
avatar
#11 Elebriska
9675
в 16:32 (12/Сен/2015)
0
Если Вам ещё нужна помощь - советую проверить наличие самого блока init. Ren'py любит вытворять весёлые вещи...
Сейчас поясню с примерами:

define jul = Character('Джульетта', color="#FF8C00")#такая форма объявления находится ВНЕ БЛОКА init и работает. В случае чего - скопируйте отсюда и вставьте.

init:
$ jul = Character(u"Джульетта", color="#ff8c00")#Здесь блок init есть. Тоже работает.

$ la = Character(u"Лала", color="#ffffff")# А вот эта форма объявления работать не будет (может,когда-то работала,но при проверке сейчас - выдала ошибку),если она не в блоке init.

Собсна,вот.
avatar
#13 Leshiy133
8334
в 16:36 (12/Сен/2015)
0
Хм, да у меня всё внутри блока init.
поменял jul на juli - теперь всё показывает, как надо) Пока новых проблем не замечено, но ещё по мере кода не все персонажи появились, чтобы "Заговорить" =))
avatar
#14 Elebriska
9675
в 16:43 (12/Сен/2015)
0
Хах, ну точно весёлые вещи
avatar
#15 Leshiy133
8334
в 16:48 (12/Сен/2015)
0
ага... он у меня ещё не хотел с true/false работать, когда надо, например, зачесть игроку, что он "уже был в библиотеке" и повторно сцену не показывать)) пришлось делать:
define library = 0
и в библиотеке $ library += 1
Типа балл давать не только за героиню, но и за библиотеку, и потом уже через if library == 1:
прокручивать нужную сцену)
А когда пытался через true/false это провернуть - ваще нифига не получалось.

И у меня почему-то РенПи не признаёт знаки "меньше" и "больше", т.е. стрелки ">" и "<"
Я не могу задать "if jul >= 4:", мне нужно прям строго-строго указывать равное кол-во "if jul == 4". А как сделать если "более 4 баллов" - нипаняяяятна Т.Т ренпи ругается на ">=" символ - хотя в примерах кода в инете именно так написано мол чтобы больше/меньше...
avatar
#16 Elebriska
9675
в 17:11 (12/Сен/2015)
0
wow Попробуйте,что ли,обновить его...
avatar
#17 Leshiy133
8334
в 17:12 (12/Сен/2015)
0
Не вариант, русская версия только такая. Без перевода я там вообще ничего не пойму)))
avatar
#18 Elebriska
9675
в 17:14 (12/Сен/2015)
0
Стоп-стоп-стоп. А вы попробуйте. Там теперь версия мультиязычная,вроде как. Т.е, качаете - там на английском,затем в настройках выбираете язык - он докачивает и переводит о.о По крайней мере,у меня так с последней обновой вышло
avatar
#19 Leshiy133
8334
в 17:16 (12/Сен/2015)
0
Хм, а откуда брать? какой номер последней?
И главное - как мне в новый РенПи вместить снова свою игру-проект?! оО он воспримет её заново то хоть???
avatar
#20 Elebriska
9675
в 17:21 (12/Сен/2015)
0
О,великие админы,простите за кучу комментов :D
Запускаете ренпи - обновить - он проверяет - говорит,какая версия доступна и спрашивает подтверждение - подтверждаете - обновляет.
Обновила минуту назад, и у меня проекты остались те же. Если у Вас сбросятся - в настройках после выбора языка выберите директорию игры (папка,где у вас все проекты хранятся,т.е,на уровень выше,чем папка с конкретной игрой). Вроде,всё
avatar
#21 Leshiy133
8334
в 17:34 (12/Сен/2015)
0
О, ура! Заработало))
if jul >= 5:
"text-text"
else:
pass

ошибок нет, линт не ругается, текст показывается =) мило-мило ^__^ теперь можно работать с условиями меньше-больше, а не только строго-равно))) ихихи))

Спасибушки! happy
avatar
#22 Elebriska
9675
в 17:35 (12/Сен/2015)
0
Пожалуйста love
avatar
#12 Elebriska
9675
в 16:35 (12/Сен/2015)
0
Ну и, конечно, если через define - то тоже преспокойно в init запихивается
avatar
#23 animeshnica
13694
в 21:09 (28/Сен/2015)
0
я попытаюсь сделать офигеную новелу funny happy
avatar
#24 WeiP
21055
в 17:19 (29/Дек/2015)
1
Возник вопрос.
Допустим, когда мой персонаж говорит, у него меняются эмоции. Следовательно, голову персонажа нужно показывать всегда с разными эмоциями.
Как это лучше провернуть? smile_57
avatar
#25 AnnaSchwarz
22221
в 19:20 (11/Янв/2016)
0
Мне нужно разместить голову так, чтобы на протяжении всей игры она находилась там и не исчезала, не менялась. Где это сделать, а то я вообще не поняла, как размещать голову и куда писать нужный код.
И еще вопрос. Можно ли сделать так, чтобы ГГ "говорил" в диалоговом окне внизу, а фразы остальных персонажей появлялись в виде облачков?
avatar
#27 Colo
46501
в 00:27 (04/Ноя/2016)
0
А что делать если "голова" находится, уж очень высоко от текста? smile_13
avatar
#28 FairyTail2003
23991
в 07:36 (09/Апр/2017)
0
Здравствуйте.
Сразу же извинюсь,потому что возможно не туда пишу,но мне необходимо узнать как сделать лицо персонажа справа от блока с текстом?
Если я делаю,то у меня текст улетает далеко далеко,а имя скрывается за лицом персонажа.
Помогите. cry cry cry cry
avatar
#30 Jessamin
6802
в 18:31 (03/Ноя/2017)
0
Не знаю актуально ли еще.
Код
  
  if side_image:
  add side_image
  else:
  add SideImage() xalign 0.0 yalign # вот это место отвечает за позицию 1.0


~ add SideImage() xalign 1.0 yalign 1.0
avatar
#29 LeninStar
65087
в 19:40 (27/Авг/2017)
0
Драсть.
Как поменять имя у созданного ранее обьекта Character?
Я так понимаю что это экземпляр класса?
Пробовал так
ma_name.name = new name
но не вышло.
Это возможно?
avatar
#31 Jessamin
6802
в 18:52 (03/Ноя/2017)
0
Можно так
Код

  $ ruru = Character(name="Незнакомка")
  ruru "Желаете познакомится?"
  $ ruru.name = "Руру"
  ruru "Мое имя Руру."


Тут вроде не говорилось, но можно и не объявлять персонажа
Код

"Куру" "А меня зовут Куру."