如何blit和图像成精灵而不是屏幕?

时间:2019-05-23 11:29:43

标签: python pygame

我正在尝试blit并将图像和一些文本粘贴到sprite上,但是什么也没有显示。

如果我尝试直接将其blit到屏幕上,它将起作用,但不能正常工作。

class Button(pygame.sprite.Sprite):
def __init__(self, text, pos, screen, text_size):
    self.text = text
    self.text_size = text_size
    self.pos = pos
    self.width = len(text) * text_size
    self.height = 50
    self.screen = screen
    self.timer = 0
    self.underscore = Underscore((self.pos[0] - self.width / 4.5, self.pos[1] + self.text_size), 5)

    super().__init__()

    self.image = pygame.Surface([self.width, self.height])
    self.rect = self.image.get_rect()
    # self.rect = self.pos

    text_render.render_text(self.text, self.image, self.pos, self.text_size, len(self.text) * 10)


def is_clicked(self):
    mouse = pygame.mouse.get_pos()
    self.timer += 30

    if self.pos[0] - self.width / 4 < mouse[0] < self.pos[0] + self.width / 4 and self.pos[1] < mouse[1] < self.pos[1] + self.height:
        pygame.draw.rect(self.screen, white, [self.pos[0] - self.width / 4.5, self.pos[1] + self.text_size, self.width / 2, 5])
        if pygame.mouse.get_pressed()[0] and self.timer > 100:
            self.timer = -300
            return True
    else:
        pygame.draw.rect(self.screen, black, [self.pos[0] - self.width / 4.5, self.pos[1] + self.text_size, self.width / 2, 5])
        return False
    if self.timer < 0:
        pygame.draw.rect(self.screen, gray, [self.pos[0] - self.width / 4.5, self.pos[1] + self.text_size, self.width / 2, 5])


def update(self):
    self.is_clicked()

文字渲染

def render_text(text, surface, pos, size, box_width):
    font = pygame.font.SysFont('Freshandbold.ttf', size)

    y_val = pos[1]
    for line in string_split(text, size, box_width):
        screen_text = font.render(line, True, white)
        surface.blit(screen_text, (pos[0] - box_width, y_val))
        y_val += font.get_linesize() / 1.5

当我将self.screen更改为self.image时,它应该会发炎到精灵表面,但至少不会消失。

1 个答案:

答案 0 :(得分:0)

实际上看起来您画东西的方式是错误的。

所以,我假设您使用的是sprite.Group.draw(),但是我发现该函数的功能非常挑剔。因此,我通常会自己写。

在您的班级中,添加以下功能:

def draw(self):
    self.screen.blit(self.image, self.rect)

然后,在抽奖代码中,将此循环添加到主游戏循环中

for sprite in public.all_sprites: # Put your main sprite group here
    sprite.draw() # Call the sprites draw function which will draw them onto the screen directly.

这应该起作用,因为从技术上讲,您在遍历整个子画面组时直接使每个子画面发亮。

您需要在render_text中返回创建的表面,因此在代码中:

def render_text(text, surface, pos, size, box_width):
    font = pygame.font.SysFont('Freshandbold.ttf', size)

    y_val = pos[1]
    for line in string_split(text, size, box_width):
        screen_text = font.render(line, True, white)
        surface.blit(screen_text, (pos[0] - box_width, y_val))
        y_val += font.get_linesize() / 1.5

    return surface # Return the surface that was created to the draw function.