我昨天刚开始我的第一个 PyGame 项目,但我找不到如何正确使用 Mask 实体在移动的 Surface 上应用。
我为动画表面制作了一个特定的类
class LabelObject():
def __init__(self, surface, x, y, endX, speed, idleTime):
self.surface = surface
self.x = x
self.y = y
self.endX = endX
self.speed = speed
self.idleTime = idleTime
self.alpha = 255
self.timer_start = 0
self.timer_end = 0
self.pos = self.surface.get_rect(x=self.x,y=self.y)
def move(self):
self.timer_start += 1
if self.timer_start > self.idleTime:
if self.pos.right > self.endX:
self.pos.x += self.speed
elif self.pos.x < self.x:
self.timer_end += 1
if self.timer_end > self.idleTime:
self.alpha -= 25
if self.timer_end > self.idleTime + 11:
self.pos = self.surface.get_rect(x=self.x, y=self.y)
self.timer_start = 0
self.timer_end = 0
self.alpha = 255
self.surface.set_alpha(self.alpha)
这个类的重点是检查表面是否超出给定区域,然后向左滑动以能够完全阅读其中呈现的文本。
在我的主循环中,我可以像这样将它粘贴到屏幕上
label = LabelObject(textSurface,20,10,100,-0.5,30)
while not over:
for event in pygame.event.get():
if event.type == pygame.QUIT
over = True
screen.fill((0,0,0))
label.move()
screen.blit(label.surface, label.pos)
pygame.display.update()
这很好用,但我需要在它上面应用一个不必移动的面具。对于此示例,掩码的 Rect 将为(20, 10, 100-20, label.surface.get_height())
. 我在网上看到了一些关于 Mask 的例子,但是当 mask 是静态的并且表面是移动的时,我没有找到使用它的方法。
编辑:我尝试在 blit 函数中使用 area 选项,但有些奇怪,区域和 Surface 移动不同步。
EDIT2:最后这里是带有区域选项的良好 blit 功能。只需要使用静态位置制作 blit,并使用动画位置制作区域:
self.screen.blit(label.surface, (label.x,label.y), area=pygame.Rect(label.x-label.pos.x, 0, label.endX-label.x, label.surface.get_height()))