From b99dbb396c313f4b3130b566c0df42c10eec6084 Mon Sep 17 00:00:00 2001 From: davidovski Date: Thu, 5 Jan 2023 11:35:28 +0000 Subject: Initial Commit --- hud.py | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 hud.py (limited to 'hud.py') diff --git a/hud.py b/hud.py new file mode 100644 index 0000000..179153c --- /dev/null +++ b/hud.py @@ -0,0 +1,152 @@ +from game import Game, GameSprite +from font import Font + + +class ScoreCounterSprite(GameSprite): + """Single digit for a score counter""" + + def __init__(self, game: Game): + """Initialise the score counter + + :param game: The game which this belongs to + :type game: Game + """ + self.number_images = [] + + self.x = 0 + + for i in range(10): + self.number_images.append( + Font.load_text(game.texture_factory, str(i))) + + super().__init__(game, self.number_images[0]) + + def update_image(self): + """Update the digit""" + self.set_image(self.number_images[int(self.x % 10)]) + + def set(self, x): + """Set the image + + :param x: number to set this digit to + """ + self.x = x + self.update_image() + + +class ScoreCounter: + """Sprite to display a number""" + + def __init__(self, game: Game, num_digits, position=(0, 0)) -> None: + """__init__. + + :param game: + :type game: Game + :param num_digits: + :param position: + :rtype: None + """ + self.digits = [] + x, y = position + + self.number = 0 + + for i in range(num_digits): + sprite = ScoreCounterSprite(game) + sprite.set_pos((x+(Font.FONT_SIZE + 1)*i, y)) + self.digits.append(sprite) + + def set(self, number): + """Set the score to be displayed + + :param number: + """ + if number != self.number: + self.number = number + power = 10**len(self.digits) + for digit in self.digits: + power /= 10 + digit.set((number // power) % 10) + + def destroy(self): + """Remove this counter""" + for n in self.digits: + n.destroy() + + def send_to_front(self): + """Move this counter to the foreground""" + for d in self.digits: + d.send_to_front() + + def show(self): + """Make this counter visible""" + for d in self.digits: + d.show() + + def hide(self): + """Make this counter invisible""" + for d in self.digits: + d.hide() + + +class GameHud: + """Object to manage the items visible in the game's heads up display""" + + SCORE_DIGITS = 8 + HP_DIGITS = 2 + + def __init__(self, game) -> None: + """Initialise the HUD + + :param game: The game which this belongs to + """ + + self.game = game + self.score_counter = ScoreCounter(game, GameHud.SCORE_DIGITS, + position=( + game.w + - GameHud.SCORE_DIGITS + * (Font.FONT_SIZE+1), + 1) + ) + + self.hp_symbol = GameSprite(game, game.player.image) + self.hp_symbol.set_pos((1, 1)) + + x_image = Font.load_text(game.texture_factory, "x") + self.x_symbol = GameSprite(game, x_image) + self.x_symbol.set_pos((self.hp_symbol.x+self.hp_symbol.w+1, 1)) + + self.hp_counter = ScoreCounter(game, GameHud.HP_DIGITS, + position=(self.x_symbol.x+1 + + self.x_symbol.w, 1) + ) + + self.items = (self.score_counter, + self.hp_symbol, + self.x_symbol, + self.hp_counter) + + def tick(self): + """Update the hud""" + self.score_counter.set(self.game.score) + self.hp_counter.set( + self.game.player.hp if self.game.player.hp > 0 else 0) + + for x in self.items: + x.send_to_front() + + def destroy(self): + """Remove all the associated objects""" + for x in self.items: + x.destroy() + + def hide(self): + """Make this object invisible""" + for x in self.items: + x.hide() + + def show(self): + """Make this object visible""" + for x in self.items: + x.show() -- cgit v1.2.1