background_manager.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import pygame
  2. change_speed = 2
  3. class DynamicBackground:
  4. def __init__(self, size):
  5. self.image_loaded = False
  6. self.size = size
  7. self.surface = pygame.Surface(self.size).convert()
  8. self.surface.fill((145, 16, 16))
  9. self.surface_image = pygame.Surface(self.size).convert()
  10. self.surface_image.fill((145, 16, 16))
  11. self.surface_image_last = pygame.Surface(self.size).convert()
  12. self.update = True
  13. self.screen_change_percent = 100
  14. def draw_background(self):
  15. self.update_background()
  16. return self.surface.copy()
  17. def draw_background_in_rects(self, surface, rects):
  18. self.update_background()
  19. for rect in rects:
  20. surface.blit(self.surface, rect, area=rect)
  21. def update_background(self):
  22. if self.image_loaded:
  23. if self.screen_change_percent < 255:
  24. self.surface.fill((0, 0, 0))
  25. self.surface_image_last.set_alpha(
  26. 255 - self.screen_change_percent)
  27. self.surface_image.set_alpha(self.screen_change_percent)
  28. self.surface.blit(self.surface_image_last, (0, 0))
  29. self.surface.blit(self.surface_image, (0, 0))
  30. self.screen_change_percent += 5
  31. self.update = True
  32. def should_update(self):
  33. if self.update:
  34. self.update = False
  35. return True
  36. else:
  37. return False
  38. def set_background_image(self, image):
  39. if image is not None:
  40. image_size = get_aspect_scale_size(image, self.size)
  41. target = pygame.transform.smoothscale(image, image_size)
  42. self.surface_image_last = self.surface_image.copy()
  43. pos = (int((self.size[0] - image_size[0])/2),
  44. (int(self.size[1] - image_size[1])/2))
  45. self.surface_image.blit(blur_surf_times(
  46. target, self.size[0]/40, 10), pos)
  47. self.screen_change_percent = 0
  48. self.image_loaded = True
  49. self.update = True
  50. def get_aspect_scale_size(img, new_size):
  51. size = img.get_size()
  52. aspect_x = new_size[0] / float(size[0])
  53. aspect_y = new_size[1] / float(size[1])
  54. if aspect_x > aspect_y:
  55. aspect = aspect_x
  56. else:
  57. aspect = aspect_y
  58. new_size = (int(aspect*size[0]), int(aspect*size[1]))
  59. return new_size
  60. def blur_surf_times(surface, amt, times):
  61. for i in range(times):
  62. surface = blur_surf(surface, amt)
  63. return surface
  64. # http://www.akeric.com/blog/?p=720
  65. def blur_surf(surface, amt):
  66. """
  67. Blur the given surface by the given 'amount'. Only values 1 and greater
  68. are valid. Value 1 = no blur.
  69. """
  70. scale = 1.0/float(amt)
  71. surf_size = surface.get_size()
  72. scale_size = (int(surf_size[0]*scale), int(surf_size[1]*scale))
  73. surf = pygame.transform.smoothscale(surface, scale_size)
  74. surf = pygame.transform.smoothscale(surf, surf_size)
  75. return surf