昨日、最初の 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())
。Web でマスクに関する例をいくつか見ましたが、マスクが静的で表面が動いている場合に使用する方法が見つかりませんでした。
編集: blit 関数で area オプションを使用してみましたが、奇妙な点があり、領域とサーフェスの動きが同期していません。
EDIT2:最後に、area オプションを使用した優れた 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()))