python - 如何在字体上绘制轮廓(Pygame)

标签 python fonts pygame outline

如何在字体上绘制轮廓?
我想使用黑色字体,但背景必须是黑色的,所以很难看清字体。

我假设 myfont.render 不支持在字体上绘制轮廓。

还有其他办法吗?

最佳答案

Pygame 不支持开箱即用,但一种方法是以轮廓颜色渲染文本,并将其 blit 到多次移动的结果表面,然后在顶部以所需的颜色渲染文本它。

pgzero使用这种技术;其代码的精简版本如下所示:

import pygame

_circle_cache = {}
def _circlepoints(r):
    r = int(round(r))
    if r in _circle_cache:
        return _circle_cache[r]
    x, y, e = r, 0, 1 - r
    _circle_cache[r] = points = []
    while x >= y:
        points.append((x, y))
        y += 1
        if e < 0:
            e += 2 * y - 1
        else:
            x -= 1
            e += 2 * (y - x) - 1
    points += [(y, x) for x, y in points if x > y]
    points += [(-x, y) for x, y in points if x]
    points += [(x, -y) for x, y in points if y]
    points.sort()
    return points

def render(text, font, gfcolor=pygame.Color('dodgerblue'), ocolor=(255, 255, 255), opx=2):
    textsurface = font.render(text, True, gfcolor).convert_alpha()
    w = textsurface.get_width() + 2 * opx
    h = font.get_height()

    osurf = pygame.Surface((w, h + 2 * opx)).convert_alpha()
    osurf.fill((0, 0, 0, 0))

    surf = osurf.copy()

    osurf.blit(font.render(text, True, ocolor).convert_alpha(), (0, 0))

    for dx, dy in _circlepoints(opx):
        surf.blit(osurf, (dx + opx, dy + opx))

    surf.blit(textsurface, (opx, opx))
    return surf

def main():
    pygame.init()

    font = pygame.font.SysFont(None, 64)

    screen = pygame.display.set_mode((350, 100))
    clock = pygame.time.Clock()

    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return
        screen.fill((30, 30, 30))

        screen.blit(render('Hello World', font), (20, 20))

        pygame.display.update()
        clock.tick(60)

if __name__ == '__main__':
    main()

enter image description here

关于python - 如何在字体上绘制轮廓(Pygame),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54363047/

相关文章:

android - 如何在 View 中显示波斯语(波斯语)数字

html - Google 字体无法在 Safari 中加载

python - 如何在 pygame 中生成多个敌人

python - Conda 删除所有环境(root 除外)

python - 如何获得使用 GridSearchCV 尝试的每个模型的 F1 分数和准确度?

Python 预设参数列表

python - 为什么这不显示两个重叠的直方图?

api - 快速屏幕字体OCR技术还是API?

python - 在Python中为游戏添加计分时钟

python - python 游戏中的房间/屏幕/菜单 Controller 问题 : old rooms are not removed from memory