Я только вчера начал свой первый проект PyGame и не могу найти, как правильно использовать сущность Mask для применения на движущейся поверхности.
Я сделал специальный класс для анимированных поверхностей
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())
. Я вижу несколько примеров маски в сети, но я не нашел способа использовать ее, когда маска статична, а поверхность движется.
РЕДАКТИРОВАТЬ: Я попытался использовать параметр области в функции blit, но есть что-то странное, область и движение поверхности не синхронизируются.
РЕДАКТИРОВАТЬ2: И, наконец, вот хорошая функция 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()))
self.pos
(экземплярpygame.Rect
), вам не нужныself.x
иself.y
, потому что у вас естьself.pos.x
,self.pos.y
,self.pos.width
,self.pos.right
(вместоself.pos[0]+self.pos[2]
),self.pos.center
и т. д. Вы можете использоватьget_rect(x=self.x, y=self.y)
вместоget_rect().move(self.x, self.y)
- person furas   schedule 26.12.2015self.pos.x += self.speed
вместоself.pos = self.pos.move(self.speed, 0)
- person furas   schedule 26.12.2015pygame.Surface.subsurface(offset_x,....)
сoffset_x += speed
, чтобы получить часть полного изображения - person furas   schedule 26.12.2015