python - Pygame Text : Instead of colour, 让文字显示图片,或动画

标签 python python-3.x pygame

看起来像这样的东西,但我希望图像和文本可编辑。

Something that looks like this but I want the image and text editable

而不是像这样:

title = menuFont.render("COMPUTER INFORMATION!", 1, BLACK) 
screen.blit(title, Rect(50, 100, 400, 400))

文本中的颜色是否可以改为图像或动画?

编辑: 对于那些好奇的人...当我导入图像时,我不得不稍微更改代码的末尾

screen.blit(texture, (50, 50))
screen.fill(BG_COLOR)
screen.blit(text_surface, (50, 170))
pg.display.update()
clock.tick(30)

screen.fill 出现在纹理之后...请注意:)

最佳答案

要为您的文本添加纹理,您可以先将文本渲染为白色,然后将纹理 blit 到它上面并将 pygame.BLEND_RGB_MULT 作为 special_flags 参数传递以使用乘法混合模式。纹理只会出现在文本表面的不透明部分。

此外,请确保您的纹理大于文本表面,否则文本的某些部分将不受影响。

import pygame as pg


pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray32')
FONT = pg.font.Font(None, 50)

# I create a grid texture for demonstration purposes here.
# Just load your image with pygame.image.load instead.
texture = pg.Surface((200, 100))
texture.fill((200, 100, 0))
for x in range(0, 201, 5):
    pg.draw.line(texture, (0, 0, 0), (x, 0), (x, 200))
for y in range(0, 101, 5):
    pg.draw.line(texture, (0, 0, 0), (0, y), (200, y))

# Render the text and use pure white as the color.
text_surface = FONT.render('Hello world!', True, (255, 255, 255))
# Now blit the texture onto the text surface and pass BLEND_RGB_MULT as
# the special_flags argument, so that only the opaque parts are affected.
text_surface.blit(texture, (0, 0), special_flags=pg.BLEND_RGB_MULT)

done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True

    screen.fill(BG_COLOR)
    screen.blit(texture, (50, 50))
    screen.blit(text_surface, (50, 170))
    pg.display.flip()
    clock.tick(30)

pg.quit()

这是动画版。您必须加载动画的单独帧,并对每一帧执行与上述相同的操作。将生成的表面放入列表中,然后在主循环中播放它们。

import pygame as pg


pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray32')
FONT = pg.font.Font(None, 50)

# I create a grid texture for demonstration purposes here.
# Just load your image with pygame.image.load instead.
texture = pg.Surface((200, 100))
texture.fill((200, 100, 0))
for x in range(0, 201, 5):
    pg.draw.line(texture, (0, 0, 0), (x, 0), (x, 200))
for y in range(0, 101, 5):
    pg.draw.line(texture, (0, 0, 0), (0, y), (200, y))

# Render the text and use pure white as the color.
text_surface = FONT.render('Hello world!', True, (255, 255, 255))

frames = []
for i in range(5):
    surf = text_surface.copy()  # We need a fresh copy of the text.
    # Now blit the texture onto the text surface and pass BLEND_RGB_MULT as
    # the special_flags argument, so that only the opaque parts are affected.
    # The y-position is shifted by -1 each iteration.
    surf.blit(texture, (0, -1*i), special_flags=pg.BLEND_RGB_MULT)
    frames.append(surf)

frame_counter = 0
frame_timer = 0
dt = 0

done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True

    frame_timer += dt  # Add the passed time.
    if frame_timer >= 150:  # If 150 milliseconds have passed...
        frame_timer = 0  # Reset the timer.
        frame_counter += 1  # Increment the counter.
        frame_counter %= len(frames)  # Keep it in the correct range.

    screen.fill(BG_COLOR)
    # Now use `frame_counter` as the list index and blit the surface.
    screen.blit(frames[frame_counter], (50, 170))
    pg.display.flip()
    dt = clock.tick(60)  # `dt` is the passed time in milliseconds.

pg.quit()

关于python - Pygame Text : Instead of colour, 让文字显示图片,或动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50165177/

相关文章:

python - 在pygame中实现曲线上的碰撞检测

python - 当我使用 pygame.transform.rotate() 时,它会移动我的图像,这样,如果连续使用,它将离开屏幕。为什么?

Python 创建 XML 文件

php - 在 Python 中使用 flask 进行 Hmac 验证(在 PHP 和 RUBY 中有引用)

连接本地MySQL数据库的Python 3.2脚本

python - wxPython (Phoenix) 中的全局事件处理程序

Pygame 鼠标事件中的 Python 时间计数器

python - 重新分配 Pandas df 中的列值

python - 如何从类似字符串的列访问值?

python - 在 AWS Lambda 上使用 Python 将 MS Word(.doc 和 .docx)文件转换为 HTML