在 python 中呈现格式化文本(目前使用 pyglet)
Render formatted text in python (currently with pyglet)
我正在使用 pyglet 制作游戏。在某些时候,这款游戏将在游戏中 help/reference 一些 "core" RPG 规则,加上描述等(游戏使用 Pathfinder SRD)。所以有长格式的文本(具有不同的大小、颜色等)。
我打算提供的样式示例(将进行进一步格式化):
In-game SRD
目前我正在使用 pyglet 的格式化文档模型(纯文本和一些 python 为 style/formatting 生成的字段):
"""
{font_name 'Fontin'}{.align "center"}{bold True}{font_size 28}{italic True}{indent 0}{color (128,144,160, 223)}
The Title
{.align "left"}{bold False}{font_size 12}
Huge amount of text with further reformatting goes here...
And ends with a copyright notice (section 15 of OGL).
"""
- 如果我 存储 json 中的文本(在 class、种族等的特定键下),这种一次性处理可能需要几秒钟;将文本存储在字典中的 .py (such as this one, with 5k lines) 正文中是值得的,有什么理由不这样做吗?
- 解码 在运行时使用
pyglet.text.decode_attributed
需要一些时间。但考虑到完成后游戏参考可能有一百个 'pages',在运行前解码(解码整个字典或 json)将花费大量的赛前时间。因此,预解码或动态解码(这意味着某些文本,如果我不进行高效编码,可能会被冗余地重新编码)?线程在 pyglet 上不可靠...
- 呈现 并稍后切换
pyglet.text.layout.ScrollableTextLayout
文档的内容在大块文本上需要 1-2 秒,如果文本之前没有解码则更多;
- 或者可能有任何 其他库 可用于在 pyglet 的上下文中呈现文本(进行一些调整)......但是,请考虑在当前格式中我'我既可以在 "Reference" 视图中显示全部内容,也可以从中提取少量文本作为工具提示,例如...
- 一些最后的考虑:性能在这里很重要,因为我的目标是低规格机器。该游戏将是图形 roguelike / 2d rpg,需要超过 libtcod/curses,但没有 3d 图形,这就是我现在使用 pyglet 的原因。但具体来说,格式化文本方面让我很困扰。
存储空间
如果我是你,我会将文本保留为 原始格式 ,将其读入相应的 dictionary
结构中,然后将其转储到 pickle 二进制。它的阅读和使用速度都快得惊人,而且它占用的空间更少 space。
解码
这是需要以某种方式完成的事情。
最初只是简单地使用 loading... 屏幕进行初始设置就可以了,但稍后您可以优化它并仅加载少数初始内容并将其余内容加载到后台,同时用户正在摆弄菜单之类的东西。
通常你不能序列化 GL 库的东西(有些部分你可以,但有时很棘手)。
所以你最好的办法是把启动时需要加载的东西分开,然后把剩下的打包成顺序解码。
皮格莱特
现在,每个人都有自己的宗教信仰。我的是 Python 和 Pyglet。
话虽如此,你确定你真的需要 Pyglet 吗?我的意思是,如果您只打算使用文本,也许 Pygame 甚至 UI 工具包(例如 TkInter 或 Kiwy)是更好的选择?
Pyglet 真的很多样化,可以轻松处理复杂的东西,但它也是一项非常繁重且手工繁琐的工作。通常,如果您打算做以前从未做过的疯狂事情,这将很有帮助。例如,您自己的 gfx 引擎或无法通过其他方式完成的自定义按钮。
2d
你提到这是一项要求,我不确定为什么,因为你是有远见的人。
但是看看我昨天回答的另一个关于如何提高性能的问题。
它详细介绍了如何高效渲染内容以及如何设置精灵 class 以配合您的需要。
我之前玩过一个 2d/side-scroller/rpg 游戏并使用过 Pyglet,但只是因为我觉得手动繁琐的工作比使用其他预定义的库更自在..
如果你知道为什么你不会后悔前面的辛勤工作,那就去吧!但这就是我们可以为您提供的全部帮助,因为您实际上并没有请求任何代码帮助本身。
祝你好运!
我正在使用 pyglet 制作游戏。在某些时候,这款游戏将在游戏中 help/reference 一些 "core" RPG 规则,加上描述等(游戏使用 Pathfinder SRD)。所以有长格式的文本(具有不同的大小、颜色等)。 我打算提供的样式示例(将进行进一步格式化): In-game SRD
目前我正在使用 pyglet 的格式化文档模型(纯文本和一些 python 为 style/formatting 生成的字段):
"""
{font_name 'Fontin'}{.align "center"}{bold True}{font_size 28}{italic True}{indent 0}{color (128,144,160, 223)}
The Title
{.align "left"}{bold False}{font_size 12}
Huge amount of text with further reformatting goes here...
And ends with a copyright notice (section 15 of OGL).
"""
- 如果我 存储 json 中的文本(在 class、种族等的特定键下),这种一次性处理可能需要几秒钟;将文本存储在字典中的 .py (such as this one, with 5k lines) 正文中是值得的,有什么理由不这样做吗?
- 解码 在运行时使用
pyglet.text.decode_attributed
需要一些时间。但考虑到完成后游戏参考可能有一百个 'pages',在运行前解码(解码整个字典或 json)将花费大量的赛前时间。因此,预解码或动态解码(这意味着某些文本,如果我不进行高效编码,可能会被冗余地重新编码)?线程在 pyglet 上不可靠... - 呈现 并稍后切换
pyglet.text.layout.ScrollableTextLayout
文档的内容在大块文本上需要 1-2 秒,如果文本之前没有解码则更多; - 或者可能有任何 其他库 可用于在 pyglet 的上下文中呈现文本(进行一些调整)......但是,请考虑在当前格式中我'我既可以在 "Reference" 视图中显示全部内容,也可以从中提取少量文本作为工具提示,例如...
- 一些最后的考虑:性能在这里很重要,因为我的目标是低规格机器。该游戏将是图形 roguelike / 2d rpg,需要超过 libtcod/curses,但没有 3d 图形,这就是我现在使用 pyglet 的原因。但具体来说,格式化文本方面让我很困扰。
存储空间
如果我是你,我会将文本保留为 原始格式 ,将其读入相应的 dictionary
结构中,然后将其转储到 pickle 二进制。它的阅读和使用速度都快得惊人,而且它占用的空间更少 space。
解码
这是需要以某种方式完成的事情。
最初只是简单地使用 loading... 屏幕进行初始设置就可以了,但稍后您可以优化它并仅加载少数初始内容并将其余内容加载到后台,同时用户正在摆弄菜单之类的东西。
通常你不能序列化 GL 库的东西(有些部分你可以,但有时很棘手)。
所以你最好的办法是把启动时需要加载的东西分开,然后把剩下的打包成顺序解码。
皮格莱特
现在,每个人都有自己的宗教信仰。我的是 Python 和 Pyglet。
话虽如此,你确定你真的需要 Pyglet 吗?我的意思是,如果您只打算使用文本,也许 Pygame 甚至 UI 工具包(例如 TkInter 或 Kiwy)是更好的选择?
Pyglet 真的很多样化,可以轻松处理复杂的东西,但它也是一项非常繁重且手工繁琐的工作。通常,如果您打算做以前从未做过的疯狂事情,这将很有帮助。例如,您自己的 gfx 引擎或无法通过其他方式完成的自定义按钮。
2d
你提到这是一项要求,我不确定为什么,因为你是有远见的人。
但是看看我昨天回答的另一个关于如何提高性能的问题。
它详细介绍了如何高效渲染内容以及如何设置精灵 class 以配合您的需要。
我之前玩过一个 2d/side-scroller/rpg 游戏并使用过 Pyglet,但只是因为我觉得手动繁琐的工作比使用其他预定义的库更自在..
如果你知道为什么你不会后悔前面的辛勤工作,那就去吧!但这就是我们可以为您提供的全部帮助,因为您实际上并没有请求任何代码帮助本身。
祝你好运!