【问题标题】:Is it possible to display a change of color to a pygame Sprite?是否可以显示 pygame Sprite 的颜色变化?
【发布时间】:2021-06-03 03:10:32
【问题描述】:

我有一个通过 Font 生成的 pygame Sprite。它只是一个 16x16 的表面,上面印有一个字母并进行了 blitted。

精灵有一个计时器(它是一个电源),当它接近生命的尽头时,我希望它在每次更新时闪烁随机颜色。我已经成功地使用其他文本做到了这一点,但该文本不是精灵,只是我在记分板上传递的字符串。我认为这将是相同的,但是一旦生成了精灵,无论我如何更改精灵的颜色,更改都不会转化为屏幕(尽管如果我 print(self.color) 我可以在控制台)。

我已经尝试将随机颜色选择器放在类中,并在我的 while 循环中尝试在类之外。我可以很容易地改变颜色,但屏幕上的精灵实际上并没有改变。我没有使用外部精灵图像,只是使用 pygame.Surface 的字体。

这是我的物品类别。

class Item(pygame.sprite.Sprite):
    def __init__(self, name, pos):
        pygame.sprite.Sprite.__init__(self)
        self.name = name
        self.image = pygame.Surface([16, 16])
        self.image.set_colorkey(black)
        self.font = pygame.font.Font("./fonts/myfont.ttf", 16)
        self.pos = pos
        if self.name == "health":
            self.color = (255, 0, 0)
            self.text = self.font.render("H", True, self.color)

        self.lifespan = 200
        self.lifespan_counter = 0
     
        self.image.blit(self.text, (0, 0))

    def update(self):
        # Update timer
        self.lifespan_counter += 0.1
        if self.lifespan_counter >= self.lifespan:
            self.kill()
        # Update position
        self.rect.center = (int(self.pos[0]), int(self.pos[1]))

然后在我的 def main() 底部的 while 循环中,我有这些东西:

        random_color_counter += 1
        if random_color_counter > 3:
            random_color = get_random_color()
            random_color_counter = 0

        screen.fill(background)
        text_box.fill(blue)
        game_box.fill(white)

        # Update the sprites positions and then draw them to game_box surface
        player_sprites.update()
        player_bullet_sprites.update()
        enemy_sprites.update()
        enemy_bullet_sprites.update()
        item_sprites.update()

        player_sprites.draw(game_box)
        player_bullet_sprites.draw(game_box)
        enemy_sprites.draw(game_box)
        enemy_bullet_sprites.draw(game_box)
        item_sprites.draw(game_box)

        ...

        for i in item_sprites:
            game_box.blit(i.image, (int(i.pos[0]), int(i.pos[1])))

        # Refresh everything
        pygame.display.update()

这是选择新颜色的函数。

def get_random_color():
    r = random.randint(0, 255)
    g = random.randint(0, 255)
    b = random.randint(0, 255)
    return r, g, b    

然后我可以在大多数情况下使用颜色 random_color,只是显然不是精灵。

就像我说的那样,这会在它应该的位置(坏人死亡的地方)很好地显示精灵,但我似乎无法将项目精灵的颜色更改为转换到屏幕上。我只是没有看到我做错了什么。

【问题讨论】:

  • " 无论我如何更改精灵的颜色,更改都不会转化为屏幕" - 你在哪里尝试“更改”颜色。我在您的问题中找不到这部分代码。
  • 我尝试的一切都不成功。根据您在上面看到的内容,我应该采取的最佳方法是什么?你会怎么做?
  • 你必须用新的颜色渲染文本。您必须在问题中显示尝试。
  • 非常好。我没有尝试重新渲染文本!它在初始化时渲染,然后终生保持相同​​的颜色。我假设一旦它变成一个精灵,我就可以控制精灵的颜色。看起来我确实问了一个很好的问题,因为我得到了一个很好、简单的答案。非常感谢。很有帮助。
  • 不,你的问题不是“好”。我不得不猜你想要什么。我只能猜测,因为我阅读了很多类似这样的不完整问题,这是一个常见问题。

标签: python pygame sprite


【解决方案1】:

当你想改变文本的颜色时,你必须再次渲染文本并更新文本Surface。写一个change_color方法:

class Item(pygame.sprite.Sprite):
    # [...]

    def change_color(self, color):
        self.image = pygame.Surface([16, 16])
        self.image.set_colorkey(black)
        self.color = color
        self.text = self.font.render("H", True, self.color)
        self.image.blit(self.text, (0, 0))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多