2015-12-26 31 views
1

我刚刚开始我的第一个PyGame项目,我无法找到如何正确使用蒙版实体应用于移动的Surface。使用PyGame在移动表面上分配静态蒙版

我做了一个特定的类动画面

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) 

这个类的重点是检查面超过给定区域,并向左滑动,以便能够读取整个文本中呈现它。

在我的主循环,我只是它的blit到屏幕这样

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的例子,但是当面具是静止的并且表面在移动时,我没有找到使用它的方法。

编辑:我尝试使用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())) 
+0

如果你有'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) ' – furas

+0

您可以使用'self.pos.x + = self.speed'来代替'self.pos = self.pos.move(self.speed,0)' – furas

+0

@furas感谢您的意见,我会澄清我的班级有你的建议。 – mickaelb91

回答

0

我尝试做subsurface全面实施例至切断整个图像的可见部分。 Rect(sub_image_rect)总是相同的 - 绘制在同一个地方。我只改变偏移来切断图像的不同部分。

我使用文本和字体来生成一些图像 - 并且每个人都可以在没有自己的图像的情况下运行它。

import pygame 

# --- constants --- 

BLACK = ( 0, 0, 0) 
RED = (255, 0, 0) 

# --- classes --- 

class Label(): 

    def __init__(self, text, x, y, width): 

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

     # generate full image 
     self.image = font.render(text, True, RED) 
     self.rect = self.image.get_rect(x=x, y=y) 

     self.width = width 
     self.speed = 1 

     # offset of visible part 
     self.offset_x = 0 
     self.max_offset_x = self.rect.width - self.width 

     # visible part of image 
     self.sub_image = self.image.subsurface((self.offset_x,0), (self.width, self.rect.height)) 
     self.sub_image_rect = self.sub_image.get_rect(x=x, y=y) 


    def move(self): 

     # change offset 
     self.offset_x += self.speed 

     # change move direction 
     if self.offset_x < 0: 
      self.offset_x = 0 
      self.speed = -self.speed 
     elif self.offset_x > self.max_offset_x: 
      self.offset_x = self.max_offset_x 
      self.speed = -self.speed 

     print self.offset_x, self.max_offset_x 
     # visible part of image 
     self.sub_image = self.image.subsurface((self.offset_x, 0),(self.width, self.rect.height)) 

    def draw(self, surface): 
     surface.blit(self.sub_image, self.sub_image_rect) 

# --- main --- 

pygame.init() 
screen = pygame.display.set_mode((800,600)) 

label = Label("Hello World of Python and Pygame!", 100, 100, 200) 

# --- mainloop --- 

fps = pygame.time.Clock() 
running = True 

while running: 

    # --- events --- 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       running = False 

    # --- updates --- 

    label.move() 

    # --- draws --- 

    screen.fill(BLACK) 

    label.draw(screen) 

    fps.tick(25) 
    pygame.display.flip() 

# --- the end --- 

pygame.quit() 

编辑:我与areablit制成的例子。我只有3线改变 - 见# changed代码

import pygame 

# --- constants --- 

BLACK = ( 0, 0, 0) 
RED = (255, 0, 0) 

# --- classes --- 

class Label(): 

    def __init__(self, text, x, y, width): 

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

     # generate full image 
     self.image = font.render(text, True, RED) 
     self.rect = self.image.get_rect(x=x, y=y) 

     self.width = width 
     self.speed = 1 

     # offset of visible part 
     self.offset_x = 0 
     self.max_offset_x = self.rect.width - self.width 

     # visible part of image as 'rect' - 'width' is always the same 
     self.sub_image_rect = self.image.get_rect(x=0, width=self.width) # changed 

    def move(self): 

     # change offset 
     self.offset_x += self.speed 

     # change move direction 
     if self.offset_x < 0: 
      self.offset_x = 0 
      self.speed = -self.speed 
     elif self.offset_x > self.max_offset_x: 
      self.offset_x = self.max_offset_x 
      self.speed = -self.speed 

     # visible part of image - change only `x` 
     self.sub_image_rect.x = self.offset_x # changed 

    def draw(self, surface): 
     surface.blit(self.image, self.rect, area=self.sub_image_rect) # changed 

# --- main --- 

pygame.init() 
screen = pygame.display.set_mode((800,600)) 

label = Label("Hello World of Python and Pygame!", 100, 100, 200) 

# --- mainloop --- 

fps = pygame.time.Clock() 
running = True 

while running: 

    # --- events --- 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       running = False 

    # --- updates --- 

    label.move() 

    # --- draws --- 

    screen.fill(BLACK) 

    label.draw(screen) 

    fps.tick(25) 
    pygame.display.flip() 

# --- the end --- 

pygame.quit() 
+0

我接受你的答案,即使我最终使用了区域选项。了解几种做某事的方法总是很好的。对于这个领域你是对的,我只需要用'label.x'替换'label.pos.x'来使blit成为静态的,就像一个魅力一样。再次感谢您;) – mickaelb91

+0

我也用'area'做了例子 - 因为我以前从未使用'area'。 – furas

+0

是的,谢谢,如果你想看到我的“粗糙”代码,它在Github上;)https://github.com/jbltx/PyAudioTFT – mickaelb91