我正在尝试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时,它应该会发炎到精灵表面,但至少不会消失。
答案 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.