object_renderer.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import pygame as pg
  2. from settings import *
  3. class ObjectRenderer:
  4. def __init__(self, game):
  5. self.game = game
  6. self.screen = game.screen
  7. self.wall_textures = self.load_wall_textures()
  8. self.sky_image = self.get_texture('resources/textures/sky.png', (WIDTH, HALF_HEIGHT))
  9. self.sky_offset = 0
  10. self.blood_screen = self.get_texture('resources/textures/blood_screen.png', RES)
  11. self.digit_size = 90
  12. self.digit_images = [self.get_texture(f'resources/textures/digits/{i}.png', [self.digit_size] * 2)
  13. for i in range(11)]
  14. self.digits = dict(zip(map(str, range(11)), self.digit_images))
  15. self.game_over_image = self.get_texture('resources/textures/game_over.png', RES)
  16. self.win_image = self.get_texture('resources/textures/win.png', RES)
  17. def draw(self):
  18. self.draw_background()
  19. self.render_game_objects()
  20. self.draw_player_health()
  21. def win(self):
  22. self.screen.blit(self.win_image, (0, 0))
  23. def game_over(self):
  24. self.screen.blit(self.game_over_image, (0, 0))
  25. def draw_player_health(self):
  26. health = str(self.game.player.health)
  27. for i, char in enumerate(health):
  28. self.screen.blit(self.digits[char], (i * self.digit_size, 0))
  29. self.screen.blit(self.digits['10'], ((i + 1) * self.digit_size, 0))
  30. def player_damage(self):
  31. self.screen.blit(self.blood_screen, (0, 0))
  32. def draw_background(self):
  33. self.sky_offset = (self.sky_offset + 4.5 * self.game.player.rel) % WIDTH
  34. self.screen.blit(self.sky_image, (-self.sky_offset, 0))
  35. self.screen.blit(self.sky_image, (-self.sky_offset + WIDTH, 0))
  36. # floor
  37. pg.draw.rect(self.screen, FLOOR_COLOR, (0, HALF_HEIGHT, WIDTH, HEIGHT))
  38. def render_game_objects(self):
  39. list_objects = sorted(self.game.raycasting.objects_to_render, key=lambda t: t[0], reverse=True)
  40. for depth, image, pos in list_objects:
  41. self.screen.blit(image, pos)
  42. @staticmethod
  43. def get_texture(path, res=(TEXTURE_SIZE, TEXTURE_SIZE)):
  44. texture = pg.image.load(path).convert_alpha()
  45. return pg.transform.scale(texture, res)
  46. def load_wall_textures(self):
  47. return {
  48. 1: self.get_texture('resources/textures/1.png'),
  49. 2: self.get_texture('resources/textures/2.png'),
  50. 3: self.get_texture('resources/textures/3.png'),
  51. 4: self.get_texture('resources/textures/4.png'),
  52. 5: self.get_texture('resources/textures/5.png'),
  53. }