Как сделать плавное появление текста?
|
|
#1
Может кто, поможет. Хотелось бы сделать плавное появление текста(а не то что обычно в Ren'Py - печатная машинка). Как пример, смог найти это видео.
К сожалению, участники обсуждающие тот же вопрос в посту на LemmaSoft, где и было это видео, не смогли найти решение. Но то было лет 10 назад.
"Ничто не может оставаться таким же вечно. И вещи, приносящие радость и счастье, тоже. Ничто не остается неизменным." - Фурукава Нагиса, CLANNAD
|
#2
Вообще то вот этот пост в указаной теме красноречиво намекает на решение. Просто без реализации. Вот реализация, если угодно. Невероятно тупая и на практике неприменима, но доказывает концепт и задает вектор для ориентира
Код
transform appear(paus): paus*.02 alpha 0.0 linear 1.0 alpha 1.0
init python: for c in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ': for i in range(80): nameat = c+str(i)+'_at' renpy.image('%s'%nameat,At(Text('%s'%c),appear(i))) def appear_text(what): result = '' tag = False for i,c in enumerate(what): if tag or c == ' ': result+=c elif c == '}': result+=c tag = False elif c == '{': result+=c tag = True else: result += '{image='+c+str(i)+'_at}' return result
screen say(who, what): style_prefix "say"
window: id "window"
if who is not None:
window: id "namebox" style "namebox" text who id "who"
text what id "what" xpos 5000 text appear_text(what) slow True
label main_menu: return
label start: 'Кажется мне удалось это сэмулировать невероятно тупым костылём' 'Если реально будете применять сделайте поизящнее пожалуйста' return
|
#3
Я не хакер, поэтому не понимаю, а почему нельзя переписать функцию, выводящую текст на экран? На C можно же написать свою printf(), чтобы выводить тусклые буквы по таймеру, а затем перекрашивать. Неужели на питоне невозможно вклиниться? Вообще говоря, это ужас, то что выше предлагается.
|
#4
BattlePeasant, ты предлагаешь копаться в самой либе RenPy?
Не прошел все новеллы с Anivisual Jam #1. Будет отписывать комментарии к оставшимся (возможно никогда). Проснулся.
|
#5
Цитата BattlePeasant (  ) Вообще говоря, это ужас, то что выше предлагается. Я абсолютно согласен). Просто паталогическая страсть к ужасному коду.
Цитата BattlePeasant (  ) почему нельзя переписать функцию, выводящую текст на экран? Это и будет изящным решением. Но это фигура высшего пилотажа, поскольку требует изучения незадокументированного функционала напрямую через исходники. Будет скучно -- вернусь к этому.
|
#6
Удалено.
Сообщение отредактировал BattlePeasant - Вторник, 03/Ноя/2020, 18:55
|
#7
Цитата СОНЦЕ (  ) Вообще то вот этот пост Как и указал в своём сообщении) Я тоже попал на него, но да, практической реализации мне не хватало.
Цитата СОНЦЕ (  ) Это и будет изящным решением. Но это фигура высшего пилотажа, поскольку требует изучения незадокументированного функционала напрямую через исходники. Полностью согласен) Мне такой вариант предлагали и в Discord канале, хех. Но не думаю, что любительская бесплатная новелла стоит таких усилий. Разве что для себя, не торопясь)
Добавлено (04.11.2020, 15:42) ---------------------------------------------
Если честно, Я подумываю над таким решением:
https://pastebin.com/tFwAeZy3 ( на форуме нормально добавить не получилось ).

Намешал C++, PHP и Python, но думаю задумка ясна. Правда, как это реализовать в Ren'Py(вывод текста, назначение alpha на символ) понятия не имею 
Сообщение отредактировал progxaker - Среда, 04/Ноя/2020, 14:57
"Ничто не может оставаться таким же вечно. И вещи, приносящие радость и счастье, тоже. Ничто не остается неизменным." - Фурукава Нагиса, CLANNAD
|
#8
А почему именно на символ? Можно же сделать из текста картинку, и выводить его как картинку.
|
#9
Цитата GCStudio (  ) А почему именно на символ? Можно же сделать из текста картинку, и выводить его как картинку. Есть практическая реализация? Я представляю этот вариант так: какая-то функция переводит текст в картинку, другая функция как-то встраивает его в textbox(или вообще создаёт новую, что очень не оптимально), а дальше, какой-то функцией по градиенту появляется текст. Почему по градиенту? Потому что иначе нет смысла всё это воротить, ведь Ren'Py и так выводит, как печатная машинка, а показ букв, как открывание штор... Не мой случай.
"Ничто не может оставаться таким же вечно. И вещи, приносящие радость и счастье, тоже. Ничто не остается неизменным." - Фурукава Нагиса, CLANNAD
|
#10
progxaker, смотри какая идея правда я гений? правда? правда?
Код transform appear(ti): alpha .0 ti*.02 linear 1.0 alpha 1.0
image red_box=Solid('#f00',xysize=(20,20))
init python: list_for_livecomposite = [(1200,130)] i=0 for y in range(5): for x in range(60): i+=1 list_for_livecomposite.append((x*20,y*26)) list_for_livecomposite.append(At('red_box',appear(i))) image big_box = LiveComposite(*list_for_livecomposite)
screen say(who, what): style_prefix "say"
window: id "window"
if who is not None:
window: id "namebox" style "namebox" text who id "who"
text what id "what" xpos 5000 fixed xmaximum 1200: add AlphaMask(Text(what),'big_box')
label main_menu: return label start: 'Random text lol very random teeeext lol lol random random Random text lol very random teeeext lol lol random random Random text lol very random teeeext lol lol random random Random text lol very random teeeext lol lol random random Random text lol very random teeeext lol lol random random Random text lol very random teeeext lol lol random random Random text lol very random teeeext lol lol random random Random text lol very random teeeext lol lol random random Random text lol very random teeeext lol lol random random ' return
|
#11
Цитата СОНЦЕ (  ) правда я гений? правда? правда? Не гений, но и правда, реализация классная) Можешь добавить комментарии в код? Допустим, почему range(5) и range(60), почему x*20 и x*26, про верхнюю(appear) функцию и другие. Также Я бы поправил цикл. Цикл в цикле не самая лучшая затея, поэтому использовал бы while.
Пока игрался, нашёл проблемку. Если нужно пропустить "бегущий" эффект нажатием ЛКМ, то, вместо появления целой фразы, переключается на новую. И сегодня займусь заменой функции cps на предложенную тобой функции.
Сообщение отредактировал progxaker - Воскресенье, 08/Ноя/2020, 10:02
"Ничто не может оставаться таким же вечно. И вещи, приносящие радость и счастье, тоже. Ничто не остается неизменным." - Фурукава Нагиса, CLANNAD
|
#12
progxaker, хихи прям на полном серьезе похвалил меня в краску вгоняешь вот с комментами и менее гоповским кодом на счет вложенных циклов, я скромно настаиваю что в данном случае это хорошая практика также внедрена попытка устранить проблему с пропуском бегущего эффекта путем дублирования но обнаружена другая проблема - теперь применение изменения скорости появления текста требует перезагрузки т_т
Код ####################################################################### # Эффект плавного появления текста # # Реализован методом внедрения текста в АльфаМаску # собранную из поочередно появляющихся прямоугольников # для имитации нужного эффекта
# SMALL_XY - размеры маленького прямоугольника # подогнанны под размер символа # BIG_XY - размер всей маски подогнан под выделенное для текста окошка
# SPEED - скорость появления текста. Хотелось подогнать под CPS # но там всё не так просто =_=...
transform offset_appear(delay_offset,speed,GRADIENT = 10): #GRADIENT - примерная длина шлейфа градиента в символах alpha .0 delay_offset*speed linear speed*GRADIENT alpha 1.0
init python: LINE_SPACING = 4 #LINE_SPACING - это должна быть стандартная переменная отступа # между строчками в диалоговом окне но я её не нашел T_т SMALL_X = gui.text_size SMALL_Y = gui.text_size+LINE_SPACING BIG_X = (gui.dialogue_width/SMALL_X+1)*SMALL_X BIG_Y = (gui.textbox_height/SMALL_Y+1)*SMALL_Y SPEED = 1.0/preferences.text_cps list_for_dialogue_mask = [(BIG_X,BIG_Y)] delay_offset=0 for y in range(0,BIG_Y,SMALL_Y): for x in range(0,BIG_X,SMALL_X): delay_offset+=1 list_for_dialogue_mask.append((x,y)) list_for_dialogue_mask.append(At('symbol_box',offset_appear(delay_offset,SPEED)))
image symbol_box=Solid('#fff',xysize=(SMALL_X,SMALL_Y)) image dialogue_mask = LiveComposite(*list_for_dialogue_mask)
screen say(who, what): style_prefix "say"
window: id "window"
if who is not None:
window: id "namebox" style "namebox" text who id "who"
text what id "what" fixed style 'say_dialogue': add AlphaMask(Text(what),'dialogue_mask')
label main_menu: return label start: 'Смеркалось, жаркий день бледнел неуловимо, Над озером туман тянулся полосой, И кроткий образ твой, знакомый и любимый, В вечерний тихий час носился предо мной.' 'Улыбка та ж была, которую люблю я, И мягкая коса, как прежде, расплелась, И очи грустные, по-прежнему тоскуя, Глядели на меня в вечерний тихий час.' return
|
#13
СОНЦЕ, осталось добавить проверку на то, включён ли cps вообще и делить на скорость появление, а не на "выключатель":
Код if preferences.text_cps: SPEED = 1.0/preferences.afm_time
Но есть проблема, включён или выключен cps, идёт наложение текста.

А так, большое спасибо 
Сообщение отредактировал progxaker - Понедельник, 09/Ноя/2020, 16:38
"Ничто не может оставаться таким же вечно. И вещи, приносящие радость и счастье, тоже. Ничто не остается неизменным." - Фурукава Нагиса, CLANNAD
|