From a64aadaa7775c3292e7c5375f9544f60653b6e1f Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 9 Nov 2021 01:27:31 +0300 Subject: [PATCH] [stable] animated dialogue text --- README.md | 24 +++++++++++++----------- blink_plugin.py | 2 +- dialogue_plugin.py | 24 +++++++++++++++++++++++- expression_plugin.py | 4 ++-- ghost.yaml | 8 ++++++++ main.py | 2 +- 6 files changed, 48 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index c2f5167..766881c 100644 --- a/README.md +++ b/README.md @@ -3,27 +3,29 @@ 1. + Чтобы Катру можно было перемещать по левому клику 2. + Чтобы правый клик открывал бы меню (как делать коллбеки на эти пункты?) 3. Собирать меню (системное/дебаговое) по правому клику на основе плагинов и коллбеков -4. Сделать окно диалога (которые собирается на основе плагинов), он будет единый для диалога по дабл-клик и для фраз -5. То есть Катра может начинать диалоги с вариантами ответов и ветвлением -6. Двойной клик по Катре -- диалог с пунктами меню (которые собирается на основе плагинов) -7. В диалоге текст показывается с анимацией посимвольно -8. + Анимация (мигание) +4. + Сделать базовое окно диалога для текста +5. Сделать окно диалога (которые собирается на основе плагинов), он будет единый для диалога по дабл-клик +6. То есть Катра может начинать диалоги с вариантами ответов и ветвлением +7. Двойной клик по Катре -- диалог с пунктами меню (которые собирается на основе плагинов) +8. + В диалоге текст показывается с анимацией посимвольно +9. + Анимация (мигание) Сделать систему плагинов 1. + Какой-нибудь стандартный формат для API 2. + Плагины на питоне, каждый цикл пробегать по всем методам on_tick в плагинах -3. Сделать on_boot/on_close, который исполняется один раз +3. Сделать on_boot/on_close, который исполняется один раз. on_boot это не init, в init техника, в on_boot поведение 4. + Может использовать какой-то сторонний планировщик? Сделать поведение 1. + Движок для наложения слоёв 2. + Слои накладываются с анимацией (периодичность) 3. + Наложенные слои -- теггировать по именам (файл с конфигурацией эмоций) -4. Сделать файл с рандомными фразами и возможностью внедрять теги с эмоциями (forced) и %username, делать перенос строки -5. Сделать рандомными части диалогов. То есть строчка одна, но она может комбинироваться. -6. "Сейчас %(hour12), %(username). Очень важно поддерживать режим." - говорить сколько сейчас время -7. normalboottalk -- приветствовать в зависимости от времени дня, прощаться - желать хороших снов -8. + Убрать (пока нет системы настроения) mouth с тэгом bad из рандомной ротации +4. Сделать файл с рандомными фразами и возможностью внедрять теги с эмоциями (forced) и %username, +5. +делать перенос строки +6. Сделать рандомными части диалогов. То есть строчка одна, но она может комбинироваться. +7. "Сейчас %(hour12), %(username). Очень важно поддерживать режим." - говорить сколько сейчас время +8. normalboottalk -- приветствовать в зависимости от времени дня, прощаться - желать хороших снов +9. + Убрать (пока нет системы настроения) mouth с тэгом bad из рандомной ротации Технические штуки 1. Сделать папку с плагинами, сделать категории плагинов, сделать наследование (конфиг, self.w) diff --git a/blink_plugin.py b/blink_plugin.py index 5c672de..fede707 100644 --- a/blink_plugin.py +++ b/blink_plugin.py @@ -16,7 +16,7 @@ def __init__(self, window, _ghostconfig): self.blink_close_min = self._config['timings']['blink']['closed']['min'] self.blink_close_max = self._config['timings']['blink']['closed']['max'] - window.app.after(10, self.tick()) + window.app.after(10, self.tick) def tick(self): if self.blinked: diff --git a/dialogue_plugin.py b/dialogue_plugin.py index e02e629..dc29369 100644 --- a/dialogue_plugin.py +++ b/dialogue_plugin.py @@ -1,7 +1,7 @@ import yaml import tkinter as tk import random - +import logging class DialoguePlugin: def __init__(self, window, _ghostconfig): @@ -12,6 +12,28 @@ def __init__(self, window, _ghostconfig): self._config = yaml.safe_load(f.read()) self.grip = None + self._text_to_render = iter("Привет, я Катра! Спасибо, что теперь я могу говорить!") + self._rendered_text = "" + self._textid = None + self._textspeed = self._config['dialogue']['text']['speed'] + + def _render_text_init(self): + self._textid = self.w.grip.create_text(self._config['dialogue']['offset'] + self._config['dialogue']['text']['offset']['xleft'], + self._config['dialogue']['text']['offset']['y'], + text=self._rendered_text, + anchor=tk.NW, + width=self._config['dialogue']['width'] - self._config['dialogue']['text']['offset']['xright'], + fill='black', font=(self._config['dialogue']['text']['font'], + self._config['dialogue']['text']['size'])) + self.w.app.after(self._textspeed, self._render_text_tick) + + def _render_text_tick(self): + newletter = next(self._text_to_render, None) + if newletter is not None: + self._rendered_text += newletter + logging.debug("Rendering " + self._rendered_text) + self.w.grip.itemconfig(self._textid, text=self._rendered_text) + self.w.app.after(self._textspeed, self._render_text_tick) def _render_back(self): h_cursor = 0 diff --git a/expression_plugin.py b/expression_plugin.py index 8fd7588..6a7af60 100644 --- a/expression_plugin.py +++ b/expression_plugin.py @@ -17,8 +17,8 @@ def __init__(self, window, _ghostconfig): self.random_change_max = self._config['timings']['change_random_expression']['max'] self.random_change_min = self._config['timings']['change_random_expression']['min'] self._random_expression_init() - window.app.after(10, self.random_tick()) - window.app.after(10, self.forced_tick()) + window.app.after(10, self.random_tick) + window.app.after(10, self.forced_tick) def _random_expression_init(self): self.w.grip.create_image(self._config['ghost']['width'], 0, image=self.w.image.getimg('direct_v_cat', 'closed'), anchor='nw', tags=("image_closed",)) diff --git a/ghost.yaml b/ghost.yaml index 89605d5..158863c 100644 --- a/ghost.yaml +++ b/ghost.yaml @@ -97,3 +97,11 @@ dialogue: file: 'static/dialogue/middle.png' - name: top file: 'static/dialogue/top.png' + text: + offset: + xleft: 20 + xright: 50 + y: 10 + font: Consolas + size: 15 + speed: 20 diff --git a/main.py b/main.py index 3e94cc4..c48f307 100644 --- a/main.py +++ b/main.py @@ -35,7 +35,7 @@ def __init__(self, *args, **kwargs): self.menu.add_command(label="Next expression", command=self.ep.random_tick) self.menu.add_command(label="Show dialogue", command=self.dp._render_back) self.menu.add_command(label="Hide dialogue", command=self.dp._hide_back) - self.menu.add_command(label="Reload", command=lambda: self.menu_callback("4")) + self.menu.add_command(label="Render text", command=self.dp._render_text_init) self.menu.add_checkbutton(label="add_checkbutton") self.menu.add_separator() self.menu.add_command(label="Exit", command=lambda: self.menu_callback("exit"))