在pygame中有效地屏蔽表面

时间:2015-02-26 03:53:07

标签: python pygame

我需要使用pygame绘制一个充满随机灰色和黑色轮廓的圆圈。这应该是它的样子:

enter image description here

每帧的半径增加expansion_speed * dt,表面每秒更新60次,因此实现(如果可能的话)需要快速。我尝试了masking存储的纹理,但这太慢了。我的下一个想法是从这个存储的纹理中读取像素,并在最后和当前表面之间只读取replace the difference。我也尝试了这个,但无法将这个想法转化为代码。

那怎么办呢?

2 个答案:

答案 0 :(得分:0)

查看我之前相关question的更新。它有一些关于性能的信息。您可以尝试在全屏模式下启用硬件加速,但我从未亲自尝试过,因此无法提供正确的建议。只需使用两个不同的颜色键从噪声中提取圆圈并将整个表面放到显示器上。请注意,如果您的Noise表面的像素与colorkey颜色相同,那么它们也会变得透明 我想这个例子就是你想要的,用鼠标移动圆圈并按住CTRL键改变半径 图片:
2xtile1.png 2xtile2.png

import os, pygame
pygame.init()
w = 800
h = 600
DISP = pygame.display.set_mode((w, h), 0, 24)
clock = pygame.time.Clock( ) 

tile1 = pygame.image.load("2xtile1.png").convert()
tile2 = pygame.image.load("2xtile2.png").convert()
tw = tile1.get_width()
th = tile1.get_height()
Noise = pygame.Surface ((w,h))
Background = pygame.Surface ((w,h))
for py in range(0, h/th + 2) :
    for px in range(0, w/tw + 2):
        Noise.blit(tile1, (px*(tw-1), py*(th-1) ) )
        Background.blit(tile2, (px*(tw-1), py*(th-1) ) )

color_key1 = (0, 0, 0)
color_key2 = (1, 1, 1)
Circle = pygame.Surface ((w,h))
Circle.set_colorkey(color_key1)
Mask = pygame.Surface ((w,h))
Mask.fill(color_key1)
Mask.set_colorkey(color_key2)

strokecolor = (10, 10, 10)
DISP.blit(Background,(0,0))

def put_circle(x0, y0, r, stroke):
    pygame.draw.circle(Mask, strokecolor, (x0,y0), r, 0)
    pygame.draw.circle(Mask, color_key2, (x0,y0), r - stroke, 0)
    Circle.blit(Noise,(0,0))
    Circle.blit(Mask,(0,0))
    dirtyrect  = (x0 - r, y0 - r, 2*r, 2*r)
    Mask.fill(color_key1, dirtyrect)
    DISP.blit(Circle, (0,0))

X = w/2
Y = h/2
R = 100
stroke = 2
FPS = 25
MainLoop = True
pygame.mouse.set_visible(False)
pygame.event.set_grab(True)

while MainLoop :
    clock.tick(FPS)
    pygame.event.pump()
    Keys = pygame.key.get_pressed()
    MR  = pygame.mouse.get_rel()        # get mouse shift
    if Keys [pygame.K_ESCAPE] :
        MainLoop = False
    if Keys [pygame.K_LCTRL] :
        R = R + MR[0]
        if R <= stroke : R = stroke
    else :
        X = X + MR[0] 
        Y = Y + MR[1] 
    DISP.blit(Background,(0,0))
    put_circle(X, Y, R, stroke)
    pygame.display.flip( )

pygame.mouse.set_visible(True)
pygame.event.set_grab(False)
pygame.quit( )

答案 1 :(得分:0)

很多年前,我们在Pygame项目中遇到了字体渲染挑战。

有人为比赛创建了一个动画静态文本,但速度太慢了。

我们把头放在一起,制作了更快的版本。第一步是创建一个带有随机噪声的小图像。类似64x64的东西。如果您的最终图像足够大以注意到平铺,则可能需要更大的图像。

每个帧都使用随机偏移量对平铺噪声进行blit。然后你用掩模拍摄一张图像,在你的情况下是一个倒圆圈,并将其画在上面。这应该会给你一个只包含未屏蔽噪音的最终图像。

结果很好。在我们的例子中,噪音只是在抖动时并不明显。这可能是因为文本没有大的无遮挡区域。我担心你的大圈会让这个伎俩变得明显。我想如果你真的有一个足够大的平铺图像,它仍然可以工作。

结果和最终源代码仍然在Pygame网站上在线, http://www.pygame.org/pcr/static_text/index.php

static text