overactive

Untitled

Oct 20th, 2018
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.17 KB | None | 0 0
  1. import pygame
  2. import time
  3. import sys
  4. import random
  5. import math
  6.  
  7. WIDTH, HEIGHT = 800, 600
  8. WHITE = (255, 255, 255)
  9. BLACK = (0,0,0)
  10. PINK = (255, 0, 120)
  11. BAR = 60
  12.  
  13. #### SETTINGS ###
  14. PLAYER_SPEED = pygame.math.Vector2(0, 0)
  15. ROTATION_SPEED = 3
  16. LASER_SPEED = 4
  17. OFFSET = pygame.math.Vector2(WIDTH / 2, HEIGHT / 2)
  18. ASTEROIDS_COUNT = 30
  19. MAX_LIFE = 3
  20. #### SETTINGS ###
  21.  
  22. pygame.init()
  23. canvas = pygame.display.set_mode((WIDTH,HEIGHT))
  24. font = pygame.font.SysFont("Calibri", 30)
  25. pygame.display.set_caption('Asterodis')
  26. clock = pygame.time.Clock()
  27.  
  28. def quitGame():
  29.     pygame.quit()
  30.     sys.exit(0)
  31.  
  32. def drawScore():
  33.     global score
  34.  
  35.     life_text = font.render("{} / {} ".format(ship.life, MAX_LIFE), 1, WHITE)
  36.     rect_life = life_text.get_rect()
  37.     rect_life.x = BAR/2
  38.     rect_life.centery = HEIGHT - BAR/2
  39.     canvas.blit(life_text, (rect_life.x, rect_life.y))
  40.  
  41.     score_text = font.render("{}".format(score), 1, WHITE)
  42.     rect_score = score_text.get_rect()
  43.     rect_score.right = WIDTH - BAR/2
  44.     rect_score.centery = HEIGHT - BAR/2
  45.     canvas.blit(score_text, (rect_score.x, rect_score.y))
  46.  
  47. class Ship():
  48.     def __init__(self, r):
  49.         self.life = MAX_LIFE
  50.         self.r = r
  51.         self.apex = [pygame.math.Vector2(-self.r, self.r), pygame.math.Vector2(self.r, self.r), pygame.math.Vector2(0, -self.r)]
  52.         self.newApex = [0, 0, 0]
  53.         self.center = OFFSET
  54.         self.speed = PLAYER_SPEED
  55.  
  56.     def rotate(self, angle):
  57.         self.apex[0] = self.apex[0].rotate(angle)
  58.         self.apex[1] = self.apex[1].rotate(angle)
  59.         self.apex[2] = self.apex[2].rotate(angle)
  60.         self.newApex = [self.apex[0] + self.center, self.apex[1] + self.center, self.apex[2] + self.center]    
  61.         return(self.apex[2], self.newApex[2] - self.apex[2])
  62.    
  63.     def move(self, direction):
  64.         self.theta = self.apex[2].angle_to(pygame.math.Vector2(self.r, 0)) * math.pi / 180
  65.         self.speed += direction * 0.3 #dzielimy bo zapierdala za bardzo
  66.         self.speed *= 0.95
  67.         self.center += self.speed
  68.  
  69.     def edge(self):
  70.         if self.center.x > WIDTH + self.r:
  71.             self.center.x = -self.r
  72.         elif self.center.x < -self.r :
  73.             self.center.x = WIDTH + self.r
  74.  
  75.         if self.center.y > HEIGHT + self.r:
  76.             self.center.y = -self.r
  77.         elif self.center.y < -self.r :
  78.             self.center.y = HEIGHT + self.r
  79.    
  80.     def show(self):
  81.         self.rocket = pygame.draw.polygon(canvas, PINK, self.newApex, 2)
  82.  
  83.     def die(self, asteroids):
  84.         for a in asteroids:
  85.             if self.rocket.colliderect(a.asteroid):
  86.                 self.life -= 1
  87.                 self.apex = [pygame.math.Vector2(-self.r, self.r), pygame.math.Vector2(self.r, self.r), pygame.math.Vector2(0, -self.r)]
  88.                 self.newApex = [0, 0, 0]
  89.                 self.center = pygame.math.Vector2(WIDTH / 2, HEIGHT / 2)               
  90.                 asteroids.clear()
  91.                
  92. class Asteroid():
  93.     def __init__(self, x = 0, y = 0, r = 0, collapsCnt = 0):
  94.         if x == 0 and y == 0 and r == 0:
  95.             self.x = random.randint(-1000, 1000)
  96.             self.y = random.randint(-1000, 1000)
  97.             self.r = random.randint(40, 70)
  98.         else:
  99.             self.x = x
  100.             self.y = y
  101.             self.r = r
  102.        
  103.         self.collapsCnt = collapsCnt   
  104.         self.asteroid = pygame.Rect(self.x, self.y, self.r, self.r)
  105.        
  106.         speedX = random.randint(1 , 2)
  107.         speedY = random.randint(1 , 2)
  108.         dirX = random.choice([-1, 1])
  109.         dirY = random.choice([-1, 1])
  110.  
  111.         self.speedX = speedX * dirX
  112.         self.speedY = speedY * dirY
  113.  
  114.     def update(self):
  115.         self.asteroid.x += self.speedX
  116.         self.asteroid.y += self.speedY
  117.  
  118.         if 1000 <= self.asteroid.right <= 1000 + self.speedX:
  119.             self.speedX *= -1
  120.         elif self.asteroid.left <= -1000:
  121.             self.speedX *= -1
  122.  
  123.         if 1000 <= self.asteroid.bottom <= 1000 + self.speedY:
  124.             self.speedY *= -1
  125.         elif self.asteroid.top <= -1000:
  126.             self.speedY *= -1
  127.    
  128.     def collapse(self):
  129.         x1, y1 = self.asteroid.topleft
  130.         x2, y2 = self.asteroid.bottomright
  131.         r = self.r * 0.6
  132.         self.collapsCnt += 1
  133.  
  134.         return x1, y1, x2, y2, r, self.collapsCnt
  135.  
  136.     def show(self):
  137.         pygame.draw.rect(canvas, WHITE, self.asteroid, 1)
  138.  
  139. class Laser():
  140.     def __init__(self, start, offset):
  141.         self.startVector = start
  142.         self.offset = offset
  143.         self.x = int(start.x)
  144.         self.y = int(start.y)
  145.         self.alpha = self.startVector.angle_to(pygame.math.Vector2(30, 0)) * math.pi / 180
  146.    
  147.     def create(self):
  148.         self.las = pygame.Rect(self.x, self.y, 6, 6)
  149.        
  150.     def shot(self):
  151.         self.x += LASER_SPEED * math.cos(self.alpha)
  152.         self.y += LASER_SPEED * -math.sin(self.alpha)
  153.         self.create()
  154.    
  155.     def show(self):
  156.         self.las.x += self.offset.x
  157.         self.las.y += self.offset.y
  158.         pygame.draw.rect(canvas, WHITE, self.las)
  159.  
  160.     def delate(self, asteroids):
  161.         laserDelate = False
  162.        
  163.         if self.las.left <= 0 or self.las.right >= WIDTH or self.las.top <= 0 or self.las.bottom >= HEIGHT:
  164.             laserDelate = True
  165.         for a in asteroids:
  166.             if self.las.colliderect(a.asteroid):
  167.                 laserDelate = True
  168.        
  169.         return(laserDelate)
  170.  
  171. asteroids = []
  172. lasers = []
  173. ship = Ship(30)
  174.  
  175. startTime =  time.time()
  176.  
  177. def theGame():
  178.     global score
  179.     global startTime
  180.  
  181.     current = time.time()
  182.     score = int(current - startTime)
  183.     canvas.fill((BLACK))
  184.     drawScore()
  185.  
  186.     if len(asteroids) == 0:
  187.         for i in range(ASTEROIDS_COUNT):
  188.             asteroids.append(Asteroid())
  189.    
  190.     angle = 0
  191.     direction = pygame.math.Vector2(0, 0)
  192.  
  193.     keys = pygame.key.get_pressed()
  194.     if keys[pygame.K_w]:
  195.         direction = pygame.math.Vector2(math.cos(ship.theta), -math.sin(ship.theta))
  196.     if keys[pygame.K_d]:
  197.         angle = 1 * ROTATION_SPEED
  198.     elif keys[pygame.K_a]:
  199.         angle = -1 * ROTATION_SPEED
  200.    
  201.     start, offset = ship.rotate(angle)
  202.     ship.move(direction)
  203.     ship.edge()
  204.     ship.show()
  205.     ship.die(asteroids)
  206.  
  207.     for laser in lasers:
  208.         laser.shot()
  209.         laser.show()
  210.         if laser.delate(asteroids):
  211.             lasers.remove(laser)
  212.        
  213.         for i in range(len(asteroids)):
  214.             shotAsteroid = laser.las.colliderect(asteroids[i].asteroid)
  215.             if shotAsteroid == 1:
  216.  
  217.                 if asteroids[i].collapsCnt < 1:
  218.                     print(asteroids[i].collapsCnt)
  219.                     x1, y1, x2, y2, r, collapsCnt = asteroids[i].collapse()
  220.                     asteroids.append(Asteroid(x1, y1, r, collapsCnt))
  221.                     asteroids.append(Asteroid(x2, y2, r, collapsCnt))
  222.                     del asteroids[i]
  223.                     break
  224.                 elif shotAsteroid >= 1:
  225.                     del asteroids[i]
  226.                     asteroids.append(Asteroid())
  227.                     break
  228.  
  229.     for i in range(len(asteroids)):
  230.         asteroids[i].update()
  231.         asteroids[i].show()
  232.  
  233.     for event in pygame.event.get():
  234.         if event.type == pygame.QUIT:
  235.             quitGame()
  236.         if event.type == pygame.KEYDOWN:
  237.             if event.key == 32:
  238.                 lasers.append(Laser(start, offset))
  239.    
  240.     while ship.life <= 0:
  241.         canvas.fill((0,0,0,))
  242.  
  243.         line1 = 'The End'
  244.         line2 = 'Your score: ' + str(score)
  245.         line3 = 'press P to play again'
  246.         line4 = 'press Q to quit'
  247.  
  248.         textSet1 = font.render(line1, True, (PINK))
  249.         textSet2 = font.render(line2, True, (PINK))
  250.         textSet3 = font.render(line3, True, (PINK))
  251.         textSet4 = font.render(line4, True, (PINK))
  252.  
  253.         canvas.blit(textSet1,(20,20))
  254.         canvas.blit(textSet2,(20,80))
  255.         canvas.blit(textSet3,(20,140))
  256.         canvas.blit(textSet4,(20,200))
  257.         pygame.display.flip()
  258.        
  259.         for event in pygame.event.get():
  260.             if event.type == pygame.QUIT:
  261.                 quitGame()
  262.             if event.type == pygame.KEYDOWN:
  263.                 if event.key == pygame.K_p:
  264.                     ship.life = MAX_LIFE
  265.                     score = 0
  266.                     startTime = time.time()
  267.                     return
  268.                 elif event.key == pygame.K_q:
  269.                     quitGame()
  270.     pygame.display.flip()  
  271.     clock.tick(60)
  272.  
  273. while True:
  274.     theGame()
Advertisement
Add Comment
Please, Sign In to add comment