Advertisement
cookertron

Space Invaders - Python Pygame

Apr 20th, 2020
1,477
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.87 KB | None | 0 0
  1. import pygame
  2. import base64
  3. import time, math, random, os, sys
  4. import urllib.parse, urllib.request
  5.  
  6. spritesheet_url = "rwpnG"
  7. spritesheet_filename = "spritesheet.png"
  8.  
  9. # set up pygame and the display surfaces
  10. SCALE = 4
  11. DW, DH = 320 * SCALE, 200 * SCALE
  12. HDW = int(DW / 2)
  13. FPS = 60
  14.  
  15. def downloader(url, fn):
  16.     PASTEEE_URL = "http://paste.ee/r/{}"
  17.     USER_AGENT = "SpaceInvaders"
  18.     HEADER = {'user-agent':USER_AGENT}
  19.  
  20.     req = urllib.request.Request(PASTEEE_URL.format(url), None, HEADER)
  21.     try:
  22.         res = urllib.request.urlopen(req)
  23.     except urllib.error.URLError as e:
  24.         print("Download unsuccessful... {}".format(e.reason))
  25.         return False
  26.     else:
  27.         buffer = res.read().decode('utf-8')
  28.         data = base64.b64decode(buffer)
  29.  
  30.         fileHandle = open(fn, "wb")
  31.         fileHandle.write(data)
  32.         fileHandle.flush()
  33.         fileHandle.close()
  34.     return True
  35.  
  36. INVADER_UPDATE_TIME = FPS
  37. INVADER_SPEED = 4 * SCALE
  38.  
  39. INVADER_COLUMNS = 11
  40. INVADER_ROWS = 5
  41. INVADER_WIDTH = 11 * SCALE
  42. INVADER_HEIGHT = 8 * SCALE
  43. INVADER_MARGIN = 9 * SCALE
  44. INVADER_TOTAL_WIDTH = INVADER_WIDTH + INVADER_MARGIN
  45.  
  46. INVADER_SPRITE_RECTS = [[0, 0, INVADER_WIDTH, INVADER_HEIGHT], [INVADER_WIDTH, 0, INVADER_WIDTH, INVADER_HEIGHT]]
  47.  
  48. INVADERS_LEFT_MARGIN = 50 * SCALE
  49. INVADERS_TOP_MARGIN = 20 * SCALE
  50.  
  51. class invaders:
  52.     class invader:
  53.         def __init__(s, x, y):
  54.             s.x = x
  55.             s.y = y
  56.  
  57.     def __init__(s):
  58.         global INVADER_SPEED, INVADER_UPDATE_TIME, INVADER_TOTAL_WIDTH, INVADER_COLUMNS, INVADER_ROWS
  59.         global INVADERS_LEFT_MARGIN, INVADERS_TOP_MARGIN
  60.  
  61.         s.container = []
  62.  
  63.         for index in range(INVADER_COLUMNS * INVADER_ROWS):
  64.             x = index % INVADER_COLUMNS
  65.             y = int(index / INVADER_COLUMNS)
  66.             s.container += [s.invader(INVADERS_LEFT_MARGIN + x * INVADER_TOTAL_WIDTH, INVADERS_TOP_MARGIN + y * INVADER_TOTAL_WIDTH)]
  67.  
  68.         s.state = s.moveRight
  69.         s.stateAfterDescent = None
  70.  
  71.         s.frame = 0
  72.         s.updateTime = INVADER_UPDATE_TIME
  73.         s.updateTick = INVADER_UPDATE_TIME
  74.  
  75.     def draw(s):
  76.         global INVADER_WIDTH, INVADER_HEIGHT, INVADER_SPRITE_RECTS
  77.         global PRIMARY, SPRITESHEET, SCALE
  78.  
  79.         for invader in s.container:
  80.             PRIMARY.blit(SPRITESHEET, (invader.x, invader.y), INVADER_SPRITE_RECTS[s.frame])
  81.    
  82.     def update(s):
  83.         global INVADER_UPDATE_TIME
  84.         global DW
  85.  
  86.         if s.updateTick:
  87.             s.updateTick -= 1
  88.             return
  89.  
  90.         s.frame = 1 - s.frame
  91.         s.updateTick = s.updateTime
  92.         s.state()
  93.  
  94.     def moveRight(s):
  95.         global INVADER_SPEED, INVADER_WIDTH
  96.         global DW
  97.  
  98.         x = 0
  99.         for invader in s.container:
  100.             invader.x += INVADER_SPEED
  101.             if invader.x > x: x = invader.x
  102.         if x +INVADER_WIDTH >= DW - INVADER_SPEED:
  103.             s.state = s.descend
  104.             s.stateAfterDescent = s.moveLeft
  105.        
  106.     def moveLeft(s):
  107.         global INVADER_SPEED
  108.         global DW
  109.  
  110.         x = DW
  111.         for invader in s.container:
  112.             invader.x -= INVADER_SPEED
  113.             if invader.x < x: x = invader.x
  114.         if x <= INVADER_SPEED:
  115.             s.state = s.descend
  116.             s.stateAfterDescent = s.moveRight
  117.  
  118.     def descend(s):
  119.         global INVADER_HEIGHT
  120.         for invader in s.container:
  121.             invader.y += INVADER_HEIGHT
  122.         s.state = s.stateAfterDescent
  123.  
  124.  
  125. # download the spritesheet from paste.ee
  126. if not os.path.exists(spritesheet_filename):
  127.     choice = input("Do you want to download [{}] from paste.ee (y/n)?".format(spritesheet_filename))
  128.     if choice.lower() == "y" or choice.lower() == "yes":
  129.         if downloader(spritesheet_url, spritesheet_filename):
  130.             print("Download Successfull!")
  131.         else:
  132.             sys.exit()
  133.     else:
  134.         print("You can't continue without downloading spritesheet first sorry!")
  135.         sys.exit()
  136.  
  137. # initilise pygame and create surfaces
  138. pygame.init()
  139. PRIMARY = pygame.display.set_mode((DW, DH))
  140. CLOCK = pygame.time.Clock()
  141.  
  142. # load the spritesheet and scale
  143. SPRITESHEET = pygame.image.load("spritesheet.png").convert()
  144. SPRITESHEET_WIDTH, SPRITESHEET_HEIGHT = SPRITESHEET.get_size()
  145. SPRITESHEET = pygame.transform.scale(SPRITESHEET, (SPRITESHEET_WIDTH * SCALE, SPRITESHEET_HEIGHT * SCALE))
  146. SPRITESHEET.set_colorkey([0, 0, 0]) # set the backcolor is the spritesheet to transparent
  147.  
  148. INVADERS = invaders()
  149.  
  150. while True:
  151.     start = time.time()
  152.     e = pygame.event.get()
  153.     k = pygame.key.get_pressed()
  154.  
  155.     # quit?
  156.     if k[pygame.K_ESCAPE]: break
  157.  
  158.     # clear the sprite surface
  159.     PRIMARY.fill([0, 0, 0])
  160.  
  161.     # draw invader sprites
  162.     INVADERS.draw()
  163.  
  164.     # update ship, bullets and invaders
  165.     INVADERS.update()
  166.  
  167.     # update the primary display surface
  168.     pygame.display.update()
  169.  
  170.     CLOCK.tick(FPS) # keep time
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement