cookertron

Python Pygame - Lighting Efftect

Oct 20th, 2021
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.57 KB | None | 0 0
  1. import pygame
  2. from pygame import Rect
  3. from pygame import Vector2
  4. import lzma, base64
  5. from random import randint
  6. import time
  7.  
  8. class tile:
  9.     def __init__(s, xy):
  10.         global TILE_SIZE
  11.         s.v = Vector2(xy) * TILE_SIZE
  12.         s.r = Rect(s.v, (TILE_SIZE, TILE_SIZE))
  13.         s.oc = (randint(0, 128), randint(0, 128), randint(0, 128))
  14.    
  15.     def draw(s):
  16.         global PDS
  17.         pygame.draw.rect(PDS, s.oc, s.r)
  18.  
  19. class timer:
  20.     def __init__(s, seconds):
  21.         s.ts = time.time()
  22.         s.seconds = seconds
  23.    
  24.     def update(s):
  25.         now = time.time()
  26.         duration = now - s.ts
  27.         frames = int(duration / s.seconds)
  28.         if frames >= 1:
  29.             s.ts = now
  30.         return frames
  31.  
  32. def lerp(start, end, t):
  33.     return start + t * (end - start)
  34.  
  35. def chunks(l, n):
  36.     n = max(1, n)
  37.     return [l[i:i+n] for i in range(0, len(l), n)]
  38.  
  39. def unzip_map(b64lztm, ms):
  40.     tilemapData = lzma.decompress(base64.b64decode(b64lztm))
  41.     tileData = chunks(list(bytes(tilemapData)), ms[0])
  42.     return tileData
  43.  
  44. pygame.init()
  45. PDR = Rect(0, 0, 1280, 720)
  46. PDS = pygame.display.set_mode(PDR.size)
  47.  
  48. LIGHT_COLOR = (255, 255, 255)
  49. LIGHT_RADIUS = 100
  50. LIGHT_SIZE = (LIGHT_RADIUS * 2, LIGHT_RADIUS * 2)
  51. LIGHT_STEP = 1 / LIGHT_RADIUS
  52. CHANGE_LIGHT = timer(2)
  53.  
  54. B64LZ_MAP = b'/Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4I//A+FdAADv+///o7f/QH7h8+istaVmxFJbf3DyyvZOfLJYj4Vfhg0C/LVwslsyx\
  55. fU+fWSBV5qPvpmSwCW4f3Mx6/irI9loI4V4jzH6KJQ6AXt6T36sjPXKxZVHINJzMenuS7mW2MveZBJq87YMTQG9SeDTSFHXKzhXEijwwO4C5p2v\
  56. o3va0lm0mLB4lAJ23s3eG3KIS60vuZp/BZsdrG/jHhs6OPeHZzrMTZ7Vyy9V+94M5v5gic44TX73iPv8ccM0/Xzhg9u2/fZKZKwWvkd0u/XjOvc\
  57. tCRqGztaE0LcCe1d7bAOGgS7hbQjaGNePefAdkBkCOYQHYzzcMVDIRqBKzZ4XCcqr/etuu+m2y4QNUo0cLjpV9P8uZfcnT17D2QDyonxhFJaN8n\
  58. pDXo5ZrsMy0dXLgcBfyR+dwu9g0bDMv+MID4PB+xodDXuuqLXbhrimgU534Hds2qfZ5pAOmOipD6L/hw4rQIbk2+2zBhoAilpiV9MgYprNUAq2r\
  59. zz+c444nWZH6rsELHK8hCi2fSfM07gP2u3xq5S+/KI52soSGx4n2vOBrHmkC7cH7BpUKqBpPIhFt6fhAmp1gC0YZktKqulHSq/ussy4LPVzU06r\
  60. rNED0pxiTYydEVvVcr+DIFsa0VpQA11V5AhhUB7b0R/a/pOwFFtWRE5rucTRFdsiiXlytPbsucVDat7ruspEGL6gTzTQ7+5oEMkzQXVnkY0ylh1\
  61. 8Ek1Xt9wzFUSzAmqchvy8zp9EkdyQuVIpfCTFPF3I8ltRMcSQ+dY1SHCsOMqYuKYA52nruErQvDn1Ec9y2CbHGlW4/UD0JCdzaJkzAVvuvVqNCY\
  62. ido6YmO72Z01T+GRzJGN/VC03bcIB5/q41+963Ze2caDawRuTNsQsEoQtkjmWkYfQ2Uyjgo0Tfg6VjTqNja4SniJEWHkEf6hIYTpauNeYxj2hYx\
  63. XLnrgsPugCkxL8p5zk/GuECXYCIiiL2iJOvnVnbSHxWQUd7dfEZT0HClrPezmWgMvGB/z7yugsQlXzj5RQSf6PsiyiDf6q3t2BmClbxm0dmd58u\
  64. fewS/6KYw++8RgFH+GIl9U+xKxdWi1VIaxEQlFLRsQuadanXG0h+QVWHw+LG/Zwp1ekgDEWeQpIZ5w5Gox/R2DQe/vU1BlmsNVggTT8SyUnYQg1\
  65. /S/ks3WGRBQDmB9VdW397v06wl9K62YCfkcULFRotgPasltMf/pC3MltOOc6yGZl9TtcmMsYIX3VsqKyZMZneLFtDwLRHsAPQEzDjeWlpKbgwG2\
  66. O4znAa0ai+SWKWo48Aj0pL6Ez7kfCIxlDkbIsV9n9JdNaoVwAAAADjYQjsoXP5OwAB/QeAoAIA04tu3rHEZ/sCAAAAAARZWg=='
  67.  
  68. MAP_SIZE = (256, 144)
  69. TILE_SIZE = 5
  70. MAP = unzip_map(B64LZ_MAP, MAP_SIZE)
  71. for row in range(MAP_SIZE[1]):
  72.     for col in range(MAP_SIZE[0]):
  73.         if not MAP[row][col]: continue
  74.         MAP[row][col] = tile((col, row))
  75.         MAP[row][col].draw()
  76.  
  77. # define some colors
  78. BLACK = (0, 0, 0)
  79. WHITE = (255, 255, 255)
  80. RED = (128, 0, 0)
  81.  
  82. quitDemo = False
  83. while not quitDemo:
  84.     events = pygame.event.get()
  85.     for event in events:
  86.         if event.type == pygame.QUIT:    
  87.             quitDemo = True
  88.     if CHANGE_LIGHT.update():
  89.         LIGHT_COLOR = (randint(128, 255), randint(128, 255), randint(128, 255))
  90.        
  91.  
  92.     mp = Vector2(pygame.mouse.get_pos())
  93.     mr = Rect(mp - (LIGHT_RADIUS, LIGHT_RADIUS), LIGHT_SIZE)
  94.     aligned_mp = mp // TILE_SIZE * TILE_SIZE
  95.     aligned_mr = Rect(aligned_mp - (LIGHT_RADIUS, LIGHT_RADIUS), LIGHT_SIZE)
  96.     for x in range(aligned_mr.left, aligned_mr.right, TILE_SIZE):
  97.         for y in range(aligned_mr.top, aligned_mr.bottom, TILE_SIZE):
  98.             if x < 0 or x >= PDR.w or y < 0 or y >= PDR.h: continue
  99.             d = abs(Vector2(x, y).distance_to(mp))
  100.             if d <= LIGHT_RADIUS:
  101.                 t = MAP[y // TILE_SIZE][x // TILE_SIZE]
  102.                 if not t:
  103.                     r = int(lerp(LIGHT_COLOR[0] - 128, 0, LIGHT_STEP * d))
  104.                     g = int(lerp(LIGHT_COLOR[1] - 128, 0, LIGHT_STEP * d))
  105.                     b = int(lerp(LIGHT_COLOR[2] - 128, 0, LIGHT_STEP * d))
  106.                 else:
  107.                     r = int(lerp(LIGHT_COLOR[0], t.oc[0], LIGHT_STEP * d))
  108.                     g = int(lerp(LIGHT_COLOR[1], t.oc[1], LIGHT_STEP * d))
  109.                     b = int(lerp(LIGHT_COLOR[2], t.oc[2], LIGHT_STEP * d))                    
  110.                 pygame.draw.rect(PDS, (r, g, b), (x, y, TILE_SIZE, TILE_SIZE))
  111.  
  112.     pygame.display.update()
  113.     pygame.time.Clock().tick(120)
  114.  
  115.  
Add Comment
Please, Sign In to add comment