Вообще то вот этот пост в указаной теме красноречиво намекает на решение. Просто без реализации. Вот реализация, если угодно. Невероятно тупая и на практике неприменима, но доказывает концепт и задает вектор для ориентира
Код
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
Я не хакер, поэтому не понимаю, а почему нельзя переписать функцию, выводящую текст на экран? На C можно же написать свою printf(), чтобы выводить тусклые буквы по таймеру, а затем перекрашивать. Неужели на питоне невозможно вклиниться? Вообще говоря, это ужас, то что выше предлагается.
Вообще говоря, это ужас, то что выше предлагается.
Я абсолютно согласен). Просто паталогическая страсть к ужасному коду.
ЦитатаBattlePeasant ()
почему нельзя переписать функцию, выводящую текст на экран?
Это и будет изящным решением. Но это фигура высшего пилотажа, поскольку требует изучения незадокументированного функционала напрямую через исходники. Будет скучно -- вернусь к этому.
Как и указал в своём сообщении) Я тоже попал на него, но да, практической реализации мне не хватало.
ЦитатаСОНЦЕ ()
Это и будет изящным решением. Но это фигура высшего пилотажа, поскольку требует изучения незадокументированного функционала напрямую через исходники.
Полностью согласен) Мне такой вариант предлагали и в Discord канале, хех. Но не думаю, что любительская бесплатная новелла стоит таких усилий. Разве что для себя, не торопясь)
А почему именно на символ? Можно же сделать из текста картинку, и выводить его как картинку.
Есть практическая реализация? Я представляю этот вариант так: какая-то функция переводит текст в картинку, другая функция как-то встраивает его в textbox(или вообще создаёт новую, что очень не оптимально), а дальше, какой-то функцией по градиенту появляется текст. Почему по градиенту? Потому что иначе нет смысла всё это воротить, ведь Ren'Py и так выводит, как печатная машинка, а показ букв, как открывание штор... Не мой случай.
"Ничто не может оставаться таким же вечно. И вещи, приносящие радость и счастье, тоже. Ничто не остается неизменным." - Фурукава Нагиса, CLANNAD
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
Не гений, но и правда, реализация классная) Можешь добавить комментарии в код? Допустим, почему range(5) и range(60), почему x*20 и x*26, про верхнюю(appear) функцию и другие. Также Я бы поправил цикл. Цикл в цикле не самая лучшая затея, поэтому использовал бы while.
Пока игрался, нашёл проблемку. Если нужно пропустить "бегущий" эффект нажатием ЛКМ, то, вместо появления целой фразы, переключается на новую. И сегодня займусь заменой функции cps на предложенную тобой функции.
Сообщение отредактировал progxaker - Воскресенье, 08/Ноя/2020, 10:02
"Ничто не может оставаться таким же вечно. И вещи, приносящие радость и счастье, тоже. Ничто не остается неизменным." - Фурукава Нагиса, CLANNAD
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_т
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)))
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