Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.77 KB | None | 0 0
  1. from pygame.locals import *
  2. from random import randrange as rand
  3. import pygame
  4. import math
  5.  
  6. DELTA_TIME = 0.0001
  7.  
  8. def rad(n):
  9. return (n/360.0 - int(n/360.0)) * 360
  10.  
  11. class Point:
  12. def __init__(self, x, y):
  13. self.pos = [x, y]
  14.  
  15. self.val = rand(0, 8)
  16.  
  17. self.color = (255, 255, 255)
  18.  
  19. self.spin = rand(1, 360)
  20. self.r = 0
  21. self.vel = 20
  22.  
  23. def update(self):
  24. self.spin = rad(self.spin) * DELTA_TIME
  25.  
  26. range = 5
  27. self.r += rand(int(self.spin-range), int(self.spin+range))
  28.  
  29. self.r = rad(self.r)
  30.  
  31. rr = math.radians(self.r)
  32. self.pos[0] += math.cos(rr) * self.vel * DELTA_TIME
  33. self.pos[1] += math.sin(rr) * self.vel * DELTA_TIME
  34.  
  35. class World:
  36. def __init__(self, scale):
  37. self.points = [
  38. Point(rand(0, scale[0]), rand(0, 30)) for x in xrange(50)
  39. ]
  40. self.map = [[0] * scale[0] for x in xrange(scale[1])]
  41. self.scale = scale
  42. self.can_update = False
  43.  
  44. def update(self):
  45. self.can_update = True
  46.  
  47. def render(self, sf):
  48. sf.fill(0)
  49.  
  50. for p in self.points:
  51. if self.can_update:
  52. p.update()
  53.  
  54. if p.pos[0] < 0: p.pos[0] = self.scale[0] -1
  55. elif p.pos[0] > self.scale[0]: p.pos[0] = 0
  56. if p.pos[1] < 0: p.pos[1] = self.scale[1] -1
  57. elif p.pos[1] > self.scale[1]: p.pos[1] = 0
  58.  
  59. ipos = [int(p.pos[0]), int(p.pos[1])]
  60. self.map[ipos[1]][ipos[0]] = p
  61.  
  62. m = 2
  63. if self.can_update:
  64. r = self.map[ipos[1]-m : ipos[1]+m]
  65. t = []
  66. for x in r: t += x[ipos[0]-m:ipos[0]+m]
  67.  
  68. spin = p.spin
  69. c = 1
  70. for pe in t:
  71. if pe != 0:
  72. spin += pe.spin
  73. c += 1
  74. p.spin = spin / float(c)
  75.  
  76. sf.set_at(ipos, p.color)
  77.  
  78. self.can_update = False
  79.  
  80. class App:
  81. def __init__(self):
  82. self.screen = pygame.display.set_mode((300, 300))
  83. self.render = pygame.Surface((60, 60))
  84. self.world = World([60, 60])
  85.  
  86. self.old_keys = []
  87. self.keys = []
  88.  
  89. self.run = False
  90.  
  91. def update(self):
  92. self.events = pygame.event.get()
  93. self.old_keys = self.keys
  94. self.keys = pygame.key.get_pressed()
  95.  
  96. def key_down(self, k):
  97. return self.keys[k] and not self.old_keys[k]
  98.  
  99. def key_up(self, k):
  100. return not self.keys[k] and self.old_keys[k]
  101.  
  102. def key_press(self, k):
  103. return self.keys[k]
  104.  
  105. def mainloop(self):
  106. global DELTA_TIME
  107. update_in_next = False
  108.  
  109. self.run = True
  110. clock = pygame.time.Clock()
  111. while self.run:
  112. DELTA_TIME = clock.tick() / 1000.0
  113. self.update()
  114.  
  115. if self.key_down(K_s):
  116. update_in_next = True
  117.  
  118. if self.key_press(K_c):
  119. update_in_next = True
  120.  
  121. if update_in_next:
  122. self.world.update()
  123. update_in_next = False
  124.  
  125. for event in self.events:
  126. if event.type == pygame.QUIT:
  127. self.run = False
  128.  
  129. self.world.render(self.render)
  130. sg_rs = pygame.transform.scale(self.render, (300, 300))
  131. self.screen.blit(sg_rs, (0, 0))
  132.  
  133. pygame.display.update()
  134.  
  135. def main():
  136. App().mainloop()
  137.  
  138. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement