Advertisement
Guest User

KGF logo pygame

a guest
Jan 4th, 2023
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.23 KB | None | 0 0
  1. import math
  2. import time
  3. from functools import lru_cache
  4. import random
  5.  
  6. import pygame
  7.  
  8. import pygame.gfxdraw
  9.  
  10. draw_circle = pygame.draw.circle
  11.  
  12. pygame.init()
  13. pygame.key.set_repeat(500, 100)
  14.  
  15. W, H = (900,) * 2
  16. FPS = 60
  17.  
  18. SPEED = 5
  19.  
  20. FONT_SIZE = 350
  21. TEXT = 'K.G.F'
  22. # TEXT = '100-made/50-in/50-pygame'
  23. TRAIL_LENGTH = 50
  24. TRAIL_SPEED = 4
  25. LINE_THICKNESS = 3
  26. START_SCALE = 1.5 * 4
  27. END_SCALE = 1
  28. SCALE_TRANSITION = 10
  29. PARTICLES_PER_FLAME = 5
  30.  
  31. window = pygame.display.set_mode((W, H), pygame.NOFRAME)
  32. screen = pygame.Surface((W, H))
  33. clock = pygame.time.Clock()
  34.  
  35. # font = pygame.font.Font('font.otf', FONT_SIZE)
  36. _color = (80, 20, 10)
  37.  
  38.  
  39. def get_surf(_text):
  40.     s = pygame.Surface((W, H), pygame.SRCALPHA)
  41.     y = 0
  42.     for i in _text.split('/'):
  43.         try:
  44.             k = int(i.split('-')[0])
  45.             font = pygame.font.Font('font.otf', k)
  46.             surf = font.render(i.split('-')[1], True, 'white')
  47.         except ValueError:
  48.             font = pygame.font.Font('font.otf', FONT_SIZE)
  49.             surf = font.render(i, True, 'white')
  50.         # pygame.draw.rect(surf, 'white', (0, 0, *surf.get_size()), 5)
  51.         # surf.fill('white')
  52.         s.blit(surf, surf.get_rect(midtop=(W // 2, y)))
  53.         y += surf.get_height()
  54.     return s.subsurface(s.get_bounding_rect())
  55.  
  56.  
  57. # text = font.render(TEXT, True, 'white')
  58. text = get_surf(TEXT)
  59.  
  60. texture = pygame.image.load('texture-dark.png').convert()
  61. text.blit(texture, (0, 0), special_flags=pygame.BLEND_RGBA_MULT)
  62. text.set_colorkey((0, 0, 0))
  63. text = text.convert_alpha()
  64.  
  65. # text_overlay = pygame.Surface(text.get_size())
  66. text_overlay_alpha = 255
  67. # text_overlay.set_alpha(text_overlay_alpha)
  68.  
  69. text_gold_overlay = pygame.Surface(text.get_size())
  70. text_gold_overlay.set_colorkey((0, 0, 0))
  71.  
  72. offset_x = W / 2 - text.get_width() / 2
  73. offset_y = H / 2 - text.get_height() / 2 - 20
  74.  
  75. mask = pygame.mask.from_surface(text)
  76. masks = mask.connected_components()
  77. outlines = [i.outline() for i in masks]
  78. for i in outlines:
  79.     for j in range(len(i)):
  80.         i[j] = (i[j][0] + offset_x, i[j][1] + offset_y)
  81.  
  82.  
  83. @lru_cache(maxsize=200)
  84. def get_diluted_color(r, g, b, k):
  85.     return r // k, g // k, b // k
  86.  
  87.  
  88. @lru_cache(maxsize=200)
  89. def get_point_color(value):
  90.     r, g, b = 255, 50, 0
  91.     k = 0.7
  92.     r += value * k
  93.     g += value * k
  94.     # b += value * k
  95.     r = round(r)
  96.     g = round(g)
  97.     b = round(b)
  98.     if r > 255:
  99.         r = 255
  100.     if g > 255:
  101.         g = 255
  102.     if b > 255:
  103.         b = 255
  104.     return r, g, b
  105.  
  106.  
  107. class FlameParticle:
  108.     alpha_layer_qty = 2
  109.     alpha_glow_difference_constant = 1
  110.  
  111.     def __init__(self, x=W // 2, y=H // 2, r=5, rate=5.0):
  112.         self.x = x
  113.         self.y = y
  114.         self.r = r
  115.         self.original_r = r
  116.         self.alpha_layers = FlameParticle.alpha_layer_qty
  117.         self.alpha_glow = FlameParticle.alpha_glow_difference_constant
  118.         max_surf_size = 2 * self.r * self.alpha_layers * self.alpha_layers * self.alpha_glow
  119.         self.surf = pygame.Surface((max_surf_size, max_surf_size), pygame.SRCALPHA)
  120.         # self.burn_rate = 0.1 * random.randint(1, 4)
  121.         self.burn_rate = random.uniform(0.1, 0.4) / (5 / rate)
  122.         self.alive = True
  123.         self.dx = 5 / self.r ** 1.5
  124.         self.rate = rate
  125.  
  126.     def update(self, dt):
  127.         # self.y -= 5 - self.r
  128.         self.y -= self.rate * dt / self.r
  129.         self.dx = self.rate / self.r ** 1.5
  130.         self.dx += random.randint(-self.r, self.r)
  131.         self.x += self.dx * dt
  132.         # self.x += random.randint(-self.r, self.r)
  133.         self.original_r -= self.burn_rate * dt
  134.         self.r = round(self.original_r)
  135.         if self.r <= 0:
  136.             self.alive = False
  137.             self.r = 1
  138.  
  139.     @staticmethod
  140.     @lru_cache(100)
  141.     def get_color_yellow(radius):
  142.         # return 50
  143.         return 200 - round(radius) * 40
  144.  
  145.     def draw(self, surf):
  146.         # max_surf_size = 2 * self.r * self.alpha_layers * self.alpha_layers * self.alpha_glow
  147.         self.surf.fill((0, 0, 0, 0))
  148.         # self.surf = pygame.Surface((max_surf_size, max_surf_size), pygame.SRCALPHA)
  149.         for i in range(self.alpha_layers, -1, -1):
  150.             alpha = 255 - i * (255 // self.alpha_layers - 5)
  151.             if alpha <= 0:
  152.                 alpha = 0
  153.             radius = self.r * i * i * self.alpha_glow
  154.             draw_circle(self.surf, (255, self.get_color_yellow(self.r), 0, alpha), (self.surf.get_width() / 2, self.surf.get_height() / 2), radius)
  155.         surf.blit(self.surf, self.surf.get_rect(center=(self.x, self.y)))
  156.  
  157.  
  158. class Flame:
  159.     def __init__(self, x=W // 2, y=H // 2, rate=5):
  160.         self.x = x
  161.         self.y = y
  162.         self.flame_intensity = PARTICLES_PER_FLAME
  163.         self.flame_particles = []
  164.         self.timer = time.time()
  165.         self.alive = True
  166.         self.c = 10
  167.         self.rate = rate
  168.         for i in range(self.flame_intensity):
  169.             self.flame_particles.append(FlameParticle(self.x + random.randint(-5, 5), self.y, self.radius(), self.rate))
  170.  
  171.     @staticmethod
  172.     def radius():
  173.         return random.randint(1, 5)
  174.  
  175.     def draw_flame(self, surf, dt):
  176.         c = 0
  177.         for i in self.flame_particles:
  178.             i.update(dt)
  179.             i.draw(surf)
  180.             if i.original_r <= 0:
  181.                 i.alive = False
  182.                 self.c += 1
  183.                 c += 1
  184.         self.flame_particles = [i for i in self.flame_particles if i.alive]
  185.         if self.c > 5:
  186.             if not self.flame_particles:
  187.                 self.alive = False
  188.         else:
  189.             pass
  190.             # self.flame_particles.extend([FlameParticle(self.x + random.randint(-5, 5), self.y, self.radius()) for _ in range(c)])
  191.  
  192.  
  193. class BackgroundFlameParticle:
  194.     alpha_layer_qty = 2
  195.     alpha_glow_difference_constant = 1
  196.  
  197.     def __init__(self, x=W // 2, y=H // 2, r=5, rate=5.0):
  198.         self.x = random.randint(-250, W)
  199.         self.y = y + random.randint(-50, 50)
  200.         self.r = r
  201.         self.original_r = r
  202.         self.alpha_layers = FlameParticle.alpha_layer_qty
  203.         self.alpha_glow = FlameParticle.alpha_glow_difference_constant
  204.         max_surf_size = 2 * self.r * self.alpha_layers * self.alpha_layers * self.alpha_glow
  205.         self.surf = pygame.Surface((max_surf_size, max_surf_size), pygame.SRCALPHA)
  206.         # self.burn_rate = 0.1 * random.randint(1, 4)
  207.         self.burn_rate = random.uniform(0.1, 0.4) / (5 / rate)
  208.         self.alive = True
  209.         self.dx = 5 / self.r ** 1.5
  210.         self.rate = rate
  211.         self.dr = random.uniform(-0.5, 5)
  212.  
  213.     def update(self, dt):
  214.         # self.y -= 5 - self.r
  215.         self.y -= 10 * dt / self.r
  216.         self.dx = 5 / self.r ** 1.5
  217.         # self.dx += random.uniform(-self.r / 4, self.r / 4)
  218.         # self.dx += self.dr * math.sin(time.time())
  219.         self.dx += self.dr
  220.         # self.dx += random.randint(-self.r // 2, self.r // 2)
  221.         self.x += self.dx * dt
  222.         # self.x += random.randint(-self.r, self.r)
  223.         self.original_r -= self.burn_rate * dt
  224.         self.r = round(self.original_r)
  225.         if self.r <= 0:
  226.             self.alive = False
  227.             self.r = 1
  228.  
  229.     @staticmethod
  230.     @lru_cache(100)
  231.     def get_color_yellow(radius):
  232.         # return 50
  233.         return 0
  234.         return 200 - round(radius) * 40
  235.  
  236.     def draw(self, surf):
  237.         # max_surf_size = 2 * self.r * self.alpha_layers * self.alpha_layers * self.alpha_glow
  238.         self.surf.fill((0, 0, 0, 0))
  239.         # self.surf = pygame.Surface((max_surf_size, max_surf_size), pygame.SRCALPHA)
  240.         for i in range(self.alpha_layers, -1, -1):
  241.             alpha = 255 - i * (255 // self.alpha_layers - 5)
  242.             if alpha <= 0:
  243.                 alpha = 0
  244.             radius = self.r * i * i * self.alpha_glow
  245.             draw_circle(self.surf, (200, self.get_color_yellow(self.r), 0, alpha), (self.surf.get_width() / 2, self.surf.get_height() / 2), radius)
  246.         surf.blit(self.surf, self.surf.get_rect(center=(self.x, self.y)))
  247.  
  248.  
  249. class BackgroundFlame:
  250.     def __init__(self, x=W // 2, y=H, rate=5.0):
  251.         self.x = x
  252.         self.y = y
  253.         self.flame_intensity = PARTICLES_PER_FLAME
  254.         self.flame_particles = []
  255.         self.timer = time.time()
  256.         self.alive = True
  257.         self.c = 10
  258.         self.rate = rate
  259.         self.frame = 0
  260.         for i in range(self.flame_intensity):
  261.             self.flame_particles.append(BackgroundFlameParticle(self.x + random.randint(-5, 5), self.y, self.radius(), self.rate))
  262.  
  263.     @staticmethod
  264.     def radius():
  265.         return random.randint(1, 3)
  266.  
  267.     def draw_flame(self, surf, dt):
  268.         c = 0
  269.         for i in self.flame_particles:
  270.             i.update(dt)
  271.             i.draw(surf)
  272.             if i.original_r <= 0:
  273.                 i.alive = False
  274.                 self.c += 1
  275.                 c += 1
  276.         self.flame_particles = [i for i in self.flame_particles if i.alive]
  277.         if self.frame % 50 == 0:
  278.             self.flame_particles.append(BackgroundFlameParticle(self.x + random.randint(-5, 5), self.y, self.radius(), self.rate))
  279.         self.frame += 1
  280.         if len(self.flame_particles) > 50:
  281.             if not self.flame_particles:
  282.                 self.alive = False
  283.         else:
  284.             pass
  285.             # self.flame_particles.extend([FlameParticle(self.x + random.randint(-5, 5), self.y, self.radius()) for _ in range(c)])
  286.  
  287.  
  288. def main_game():
  289.     global text_overlay_alpha, text, screen, text_gold_overlay
  290.     m = max([len(i) for i in outlines])
  291.     values = [0 for _ in outlines]
  292.     flames = [Flame(W // 2, H // 2)]
  293.     c = 0
  294.     to_add = []
  295.     size = START_SCALE
  296.     line_width = 5
  297.     dt = 1
  298.     alpha_dt = 2
  299.     background_flames = []
  300.     bg = pygame.image.load('bg.png').convert()
  301.     while True:
  302.         size += (END_SCALE - size) * dt / SCALE_TRANSITION
  303.         if size < END_SCALE:
  304.             size = END_SCALE
  305.         events = pygame.event.get()
  306.         for e in events:
  307.             if e.type == pygame.QUIT:
  308.                 quit()
  309.             if e.type == pygame.KEYDOWN:
  310.                 if e.key == pygame.K_ESCAPE:
  311.                     quit()
  312.                 if e.key == pygame.K_r:
  313.                     text_gold_overlay = pygame.Surface(text.get_size())
  314.                     line_width = 5
  315.                     text_overlay_alpha = 255
  316.                     size = START_SCALE
  317.                     values = [0 for _ in outlines]
  318.                     flames = [Flame(W // 2, H // 2)]
  319.                     c = 0
  320.                     alpha_dt = 2
  321.                 if e.key == pygame.K_e:
  322.                     values = [0 for _ in outlines]
  323.                     flames = [Flame(W // 2, H // 2)]
  324.                     c = 0
  325.                     text_overlay_alpha = 0
  326.                     alpha_dt = -2
  327.         # display.fill(0)
  328.         # screen.fill(0)
  329.         screen.blit(bg, (0, 0))
  330.         for i in background_flames:
  331.             i.draw_flame(screen, dt)
  332.  
  333.         _text = text.copy()
  334.         _text.blit(text_gold_overlay, (0, 0), special_flags=pygame.BLEND_RGB_ADD)
  335.         _text.set_alpha(255 - text_overlay_alpha)
  336.         screen.blit(_text, (offset_x, offset_y))
  337.         # if text_overlay_alpha:
  338.         # screen.blit(text_overlay, (offset_x, offset_y), special_flags=pygame.BLEND_RGBA_SUB)
  339.         text_overlay_alpha -= alpha_dt * dt
  340.         if text_overlay_alpha < 0:
  341.             text_overlay_alpha = 0
  342.         # text_overlay.set_alpha(text_overlay_alpha)
  343.  
  344.         flames = [i for i in flames if i.alive]
  345.         flames.extend(to_add)
  346.         to_add.clear()
  347.         for i in range(len(values)):
  348.             if values[i] > m:
  349.                 values[i] += 5
  350.                 line_width -= 0.01
  351.                 if line_width < 1:
  352.                     line_width = 1
  353.             try:
  354.                 start = values[i] - TRAIL_LENGTH
  355.                 if start < 0:
  356.                     start = 0
  357.                 points = outlines[i][start:values[i] + 2]
  358.                 k = len(points)
  359.                 draw_line = pygame.draw.line
  360.                 for _i in range(k - 1):
  361.                     draw_line(screen, get_point_color(k - _i), points[_i], points[_i + 1], line_width.__round__() * 0 + LINE_THICKNESS)
  362.                 c += 1
  363.                 if c % 3 == 0:
  364.                     c = 0
  365.                     try:
  366.                         x, y = outlines[i][values[i]]
  367.                         to_add.append(Flame(x, y, rate=5))
  368.                     except IndexError:
  369.                         pass
  370.                 if c % 2 == 0:
  371.                     x, y = outlines[i][values[i]]
  372.                     r1 = 5
  373.                     draw_circle(text_gold_overlay, get_diluted_color(255, 255, 0, 5), (x - offset_x, y - offset_y), r1)
  374.                 values[i] += round(TRAIL_SPEED * dt)
  375.             except (ValueError, IndexError):
  376.                 pass
  377.  
  378.         for i in flames:
  379.             i.draw_flame(screen, dt)
  380.  
  381.         background_flames = [i for i in background_flames if i.alive]
  382.         if len(background_flames) < 20:
  383.             background_flames.append(BackgroundFlame(rate=0.1))
  384.  
  385.         screen1 = pygame.transform.scale_by(screen, size)
  386.         window.blit(screen1, screen1.get_rect(center=(W / 2, H / 2)))
  387.         pygame.display.update()
  388.         dt = FPS * clock.tick(FPS * 0) / 1000
  389.         if dt > 5:
  390.             dt = 5
  391.         # print(clock.get_fps())
  392.  
  393.  
  394. main_game()
  395.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement