如何更改pygame中一段文本的颜色

2023-12-02

我正在用 pygame 创建一个游戏,当您键入该字母时,该字母的颜色会发生变化。就像 nitrotype.com 一样。但问题是我不知道如何改变单个字母的颜色。 我无法清除屏幕然后执行此操作,因为那样会改变整条线的颜色。 因此,我要么需要一种方法来改变单个字母的颜色,要么需要一种一次只在屏幕上放置一个字母的方法。但是我不知道如何统一放置字母(使结束句居中)。请有人在这里帮助我。要么告诉我如何改变单个字母的颜色,要么如何以完美的方式放置单个字母,然后改变它们的颜色。

import pygame as pg
import pygame

pg.init()
screenHeight, screenWidth = 600, 800
gameDisplay = pg.display.set_mode((screenWidth, screenHeight))
pg.display.set_caption("Nitrotype")

black = (255, 255, 255)
white = (0, 0, 0)
gameDisplay.fill(white)
pg.display.update()

gameOn = True
with open("text.txt", "r") as f:
    contents = f.read()

def msgToScreen(msg, color, size):
    cur = []
    strings = []
    words = msg.split(" ")
    for i in words:
        cur.append(i)
        if len(" ".join(cur)) >= 35:
            strings.append(" ".join(cur))
            cur = []
    if cur != []:strings.append(" ".join(cur))
    
    curY = 20
    
    for string in strings:
        font = pg.font.SysFont(None, size)
        text = font.render(string, True, color)
        text_rect = text.get_rect(center=(screenWidth/2, curY))
        gameDisplay.blit(text, text_rect)
        curY += 40
    
    return text

textOnScreen = msgToScreen(contents, black, 50)

pg.display.update()

curIdx = 0
keyCombination = {"a":pg.K_a, "b":pg.K_b, "c":pg.K_c, "d":pg.K_d, "e":pg.K_e, "f":pg.K_f,
                "g":pg.K_g, "h":pg.K_h, "i":pg.K_i, "j":pg.K_j, "k":pg.K_k, "l":pg.K_l,
                "m":pg.K_m, "n":pg.K_n, "o":pg.K_o, "p":pg.K_p, "q":pg.K_q, "r":pg.K_r,
                "s":pg.K_s, "t":pg.K_t, "u":pg.K_u, "v":pg.K_v, "w":pg.K_w, "x":pg.K_x,
                "y":pg.K_y, "z":pg.K_z}
while gameOn:
    for event in pygame.event.get():
        if event.type == pg.QUIT:
            gameOn = False
        if event.type == pg.KEYDOWN:
            if event.key == keyCombination[contents[curIdx].lower()]:
                #Here is where the color of the current letter should change
                curIdx += 1

pg.quit()


您无法在字体渲染期间更改单个字母的颜色;您必须逐个字母地呈现文本。

您可以使用render()将每个字母渲染到其自己的表面并将它们传输到屏幕上,但您必须手动计算每个字母应该去的位置。

如果您使用新的,会更容易一些freetype模块,其中有很多方便的功能Font类如origin, get_rect and get_metrics它可以计算每个字母有多大。

这是我一起编写的一个简单示例。它并不完美,但你会明白的。

import pygame
import pygame.freetype
from itertools import cycle

def main():
    pygame.init()
    screen = pygame.display.set_mode((800, 600))

    # just some demo data for you to type
    data = cycle(['This is an example.', 'This is another, longer sentence.'])
    current = next(data)
    current_idx = 0 # points to the current letter, as you have already guessed
    
    font = pygame.freetype.Font(None, 50)
    # the font in the new freetype module have an origin property.
    # if you set this to True, the render functions take the dest position 
    # to be that of the text origin, as opposed to the top-left corner
    # of the bounding box
    font.origin = True
    font_height = font.get_sized_height()
    
    # we want to know how much space each letter takes during rendering.
    # the item at index 4 is the 'horizontal_advance_x'
    M_ADV_X = 4
    
    # let's calculate how big the entire line of text is
    text_surf_rect = font.get_rect(current)
    # in this rect, the y property is the baseline
    # we use since we use the origin mode
    baseline = text_surf_rect.y
    # now let's create a surface to render the text on
    # and center it on the screen
    text_surf = pygame.Surface(text_surf_rect.size)
    text_surf_rect.center = screen.get_rect().center
    # calculate the width (and other stuff) for each letter of the text
    metrics = font.get_metrics(current)

    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return
            if e.type == pygame.KEYDOWN:
                if e.unicode == current[current_idx].lower():
                    # if we press the correct letter, move the index
                    current_idx += 1
                    if current_idx >= len(current):
                        # if the sentence is complete, let's prepare the
                        # next surface
                        current_idx = 0
                        current = next(data)
                        text_surf_rect = font.get_rect(current)
                        baseline = text_surf_rect.y
                        text_surf = pygame.Surface(text_surf_rect.size)
                        text_surf_rect.center = screen.get_rect().center
                        metrics = font.get_metrics(current)

        # clear everything                        
        screen.fill('white')
        text_surf.fill('white')
        
        x = 0
        # render each letter of the current sentence one by one
        for (idx, (letter, metric)) in enumerate(zip(current, metrics)):
            # select the right color
            if idx == current_idx:
                color = 'lightblue'
            elif idx < current_idx:
                color = 'lightgrey'
            else:
                color = 'black'
            # render the single letter
            font.render_to(text_surf, (x, baseline), letter, color)
            # and move the start position
            x += metric[M_ADV_X]
          
        screen.blit(text_surf, text_surf_rect)
        pygame.display.flip()

if __name__ == '__main__':
    main()

使用第二个按钮可以轻松地将文本居中Surface并使用Rect class' center财产。

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更改pygame中一段文本的颜色 的相关文章

  • 为神经网络打乱两个 numpy 数组

    我有两个 numpy 数组用于输入数据 X 和输出数据 y X np array 2 3 sample 1 x 16 4 dtype float sample 2 x y np array 1 0 sample 1 y 0 1 dtype
  • 安装tensorflow的正确命令

    当尝试在 Anaconda 上安装 Tensorflow 时 我尝试了两种类型的命令 conda install tensorflow gpu工作得很好 然而 当尝试conda install c anaconda tensorflow g
  • 为什么 pandas 在简单的数学运算上比 numpy 更快?

    最近 我观察到 pandas 的乘法速度更快 我在下面的例子中向您展示了这一点 如此简单的操作怎么可能做到这一点 这怎么可能呢 pandas 数据帧中的底层数据容器是 numpy 数组 测量 我使用形状为 10k 10k 的数组 数据框 i
  • 在 Jupyter Notebook 中设置环境变量的不同方法

    在某些情况下 我在 Windows 10 计算机上使用 Jupyter 笔记本 我想通过设置环境变量 GOOGLE APPLICATION CREDENTIALS 来向 GCP 进行身份验证 我想知道 这两种设置环境变量的方式有什么区别 当
  • 如何在seaborn热图标签中使用科学计数法?

    我正在尝试在 python 中使用seaborn 获取热图 不幸的是 即使数字非常大 它也没有使用科学记数法 我想知道是否有任何简单的方法可以转换为科学记数法或任何其他合理的格式 这是显示问题的一段代码 import seaborn as
  • 在 PhotoImage 下调整图像大小

    我需要调整图像大小 但我想避免使用 PIL 因为我无法使其在 OS X 下工作 不要问我为什么 无论如何 因为我对 gif pgm ppm 感到满意 所以 PhotoImage 类对我来说没问题 photoImg PhotoImage fi
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 打印一份拥有多个家庭的人员名单,每个家庭都有多个电话号码

    我有一类 Person 它可以有多个 Home 每个 Home 都有一个或多个电话号码 我已经定义了类 但现在我正在尝试创建一个视图 其中列出每个人的所有家庭以及每个家庭地址的所有电话号码 类似于 john smith 123 fake s
  • Python:“直接”调用方法是否实例化对象?

    我是 Python 新手 在对我的对象进行单元测试时 我注意到一些 奇怪 的东西 class Ape object def init self print ooook def say self s print s def main Ape
  • Jupyter笔记本突然变得很慢

    我以前在anaconda环境下运行jupyter运行得很好 显示警告后 IOPub data rate exceeded The notebook server will temporarily stop sending output to
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 如何在 Python 中跟踪日志文件?

    我想在 Python 中提供 tail F 或类似内容的输出 而无需阻塞或锁定 我找到了一些非常旧的代码来做到这一点here http code activestate com recipes 436477 filetailpy 但我认为现
  • 在 for 循环中访问 itertools 产品的元素

    我有一个列表列表 是附加 itertools 产品的一些其他结果的结果 我想要的是能够使用 for 循环访问列表列表中列表的每个元素 但我无法访问所有元素 我只能访问最后一个列表的元素 结果是一个非常巨大的列表列表 例如 1 2 4 3 6
  • 通过新数据更新绘图,而不是在 Jupyter 笔记本中制作新绘图

    我有一些问题 希望你能帮我解决 我需要使用下拉小部件创建交互式绘图 我可以在其中选择并绘制感兴趣的数据 我通过以下方式做到这一点 import plotly graph objects as go import ipywidgets as
  • 旧版本的 spaCy 在尝试安装模型时抛出“KeyError: 'package'”错误

    我在 Ubuntu 14 04 4 LTS x64 上使用 spaCy 1 6 0 和 python3 5 为了安装 spaCy 的英文版本 我尝试运行 这给了我错误消息 ubun ner 3 NeuroNER master src pyt
  • 在 python 中使用高精度时间戳

    嘿 我正在使用 python 处理日期时间 我想知道解析这个时间戳的最佳方法是什么 时间戳是ISO标准 这里是一个例子 2010 06 19T08 17 14 078685237Z 现在到目前为止我已经使用过 time datetime d
  • PYTHON:从 txt 文件中删除 POS 标签

    我有以下 txt 文件 其中包含 POS 词性 http en wikipedia org wiki Part of speech tagging 每个单词的标签 不用 jj到 说 vb 我 ppss是 bedz愤怒 jj在 在 dt无与伦
  • 当训练和测试的特征数量不同时,如何处理生产环境中的One-Hot Encoding?

    在做某些实验时 我们通常在 70 上进行训练 在 33 上进行测试 但是 当您的模型投入生产时会发生什么 可能会发生以下情况 训练集 Ser Type Of Car 1 Hatchback 2 Sedan 3 Coupe 4 SUV 经过
  • 防止 Ada DLL 中的名称损坏

    有没有一种简单的方法可以防止在创建 Ada DLL 时 Ada 名称被破坏 这是我的 adb 代码 with Ada Text IO package body testDLL is procedure Print Call is begin

随机推荐

  • IOS 中的自定义字体未反映在设备上

    我跟着这个tutorial自定义字体显示在我的故事板上 但是当我执行我的应用程序 在模拟器或设备上 时 字体没有反映出来 谁能帮忙 这就是我所做的 1 downloaded a ttf file and copied it to my pr
  • 监控 JQuery 发出的所有 AJAX 请求?

    有没有办法监视页面上使用 JQuery 发出的所有 ajax 请求 并使用每个请求的结果调用回调函数 例如我发出 ajax 请求 get foo foo bar get bar bar foo 然后 每次完成这些 ajax 请求时 我都会调
  • Robolectric:“未找到 AndroidManifest.xml”和“无法找到资源 ID #0x7f09001b”

    我正在使用 Robolectric 进行一些测试 但遇到了一个无法解决的问题 当我运行测试时 AndroidManifest 出现以下错误 警告 在 AndroidManifest xml 中找不到清单文件 仅回退到 Android 操作系
  • 获取 iPhone 中的运营商详细信息

    如何获取 iPhone 当前使用的运营商详细信息 如 Airtel 或 Idea 等 是否有可能获得这些详细信息 或者有什么方法可以识别我们当前正在使用哪个运营商 我正在开发一个基于运营商的应用程序 如果用户更改他的 SIM 运营商 那么该
  • 如何将 symfony yaml 配置文件转换为 xml 格式?

    我想要将 Symfony 配置文件作为 XML 文件 我知道 symfony 书中有很多代码示例 但并未显示所有配置类型 有没有办法将 Symfony 演示项目提供的现有 YAML 文件转换为 XML 文件以使用这些文件作为基础 我发现了一
  • 无法确定何时隐藏和显示使用 JQuery 的加载动画

    我有一个加载动画 最初隐藏在我的 application js 文件中 loading field hide 我有一个自动完成字段 我希望动画在用户开始输入时出现 并在自动完成建议结果出现时消失 下面是我的 jquery ui 自动完成插件
  • 如何将 BitArray 转换为单个 int?

    我怎样才能转换BitArray到一个单一的int private int getIntFromBitArray BitArray bitArray if bitArray Length gt 32 throw new ArgumentExc
  • x86 操作码有模式吗? (方向和大小位除外)

    许多重要的 x86 指令 例如 MOV 和 ADD 的操作码部分将最后两位标准化为方向位和数据大小位 此处灰色显示的操作码部分是否有任何模式 例如 对于 ADD 某些指令使用代码 000000 而其他指令则使用代码 100000 None
  • 在 Android 中使用 SQLCipher 加密/解密现有数据库

    我使用下面的代码来加密和解密我能够加密的数据库 但是当我尝试解密时 我收到以下异常 我引用了这个文档 and 测试用例太仍然面临同样的问题 例外 sqlite returned error code 26 msg file is encry
  • 将图像保存到小程序中的文件中?

    所以事情是这样的 我正在尝试为网页游戏做一个小程序来生成 自定义 头像 这个头像是针对一个国家的军队的 所以头像取决于用户选择的图像 并且图片上的框架也代表用户所属的四边形 所以我的计划是让他们从计算机上的文件中进行选择 然后他们选择他们所
  • 在 CakePHP 3 中按关联模型的条件查找

    我有两张桌子orders and sub orders 他们的协会是 orders gt hasMany SubOrders foreignKey gt order id 两个表都有invoice no and sub invoice中的列
  • Postgresql 是否在事务中隐式包装 select 语句?

    PostgreSQL 实际上将每个 SQL 语句都视为在事务中执行 如果您不发出 BEGIN 命令 则每个单独的语句都有一个隐式的 BEGIN 和 如果成功 COMMIT 围绕它 From 教程交易 这是否意味着即使 select 语句也会
  • 仅当有免费工人可用时如何生成未来

    我正在尝试将从大文件行中提取的信息发送到某个服务器上运行的进程 为了加快速度 我想并行地使用一些线程来执行此操作 使用 Python 2 7 向后移植并发期货我试过这个 f open big file with ThreadPoolExec
  • 如何避免 UWP TCP 客户端出现延迟?

    我正在尝试在 python 服务器 第一台 PC 和 UWP 客户端应用程序 第二台 PC 之间创建 TCP 客户端 服务器程序 我想模拟一个每 10 毫秒发送一条消息的快速 python 服务器和一个具有更新功能的较慢的 UWP 应用程序
  • 一般而言,cv::Mat 或 cv::Mat 向量的 omp 缩减

    In other words this equilavent to cv Mat1f mat 5 n i e a matrix 5xn std vector
  • 在 R 中以对数比例绘制包含零的数据的散点图

    我正在尝试使用 对 绘制一些散点图对 我的数据框看起来像 gt e X Y Z 0 0 0 2 3 4 0 3 4 3 3 3 这里有一个完全标准的数据框 我用它来绘制我的散点图 同样没有什么花哨的 pairs X Y Z data e l
  • 使用 win32com 和 python 的 Excel

    我想知道如何使用 python 的 win32com 客户端读取整个列 而不需要从 Excel 工作表进行迭代 您可以使用以下命令读取整列 而无需从工作表中迭代Range收藏 你应该从不使用Cells如果性能有任何问题 Python 使用
  • 返回派生类型时“接口未实现”

    下面的代码 public interface ISomeData IEnumerable
  • 是否可以在引擎的帮助下进行自定义排序(不是升序或降序)?

    我有一个数据要排序 但它应该是由我的规则定义的自定义排序 例如 我需要按以下顺序打印值 B C A D 它不是升序或降序排序 是否有可能做到这一点 首先 可以通过以下方式进行排序JasperReports引擎 无需查询语言的帮助 例如 SQ
  • 如何更改pygame中一段文本的颜色

    我正在用 pygame 创建一个游戏 当您键入该字母时 该字母的颜色会发生变化 就像 nitrotype com 一样 但问题是我不知道如何改变单个字母的颜色 我无法清除屏幕然后执行此操作 因为那样会改变整条线的颜色 因此 我要么需要一种方