Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame
- import base64
- import time, math, random, os, sys
- import urllib.parse, urllib.request
- spritesheet_url = "rwpnG"
- spritesheet_filename = "spritesheet.png"
- # set up pygame and the display surfaces
- SCALE = 4
- DW, DH = 320 * SCALE, 200 * SCALE
- HDW = int(DW / 2)
- FPS = 60
- def downloader(url, fn):
- PASTEEE_URL = "http://paste.ee/r/{}"
- USER_AGENT = "SpaceInvaders"
- HEADER = {'user-agent':USER_AGENT}
- req = urllib.request.Request(PASTEEE_URL.format(url), None, HEADER)
- try:
- res = urllib.request.urlopen(req)
- except urllib.error.URLError as e:
- print("Download unsuccessful... {}".format(e.reason))
- return False
- else:
- buffer = res.read().decode('utf-8')
- data = base64.b64decode(buffer)
- fileHandle = open(fn, "wb")
- fileHandle.write(data)
- fileHandle.flush()
- fileHandle.close()
- return True
- INVADER_UPDATE_TIME = FPS
- INVADER_SPEED = 4 * SCALE
- INVADER_COLUMNS = 11
- INVADER_ROWS = 5
- INVADER_WIDTH = 11 * SCALE
- INVADER_HEIGHT = 8 * SCALE
- INVADER_MARGIN = 9 * SCALE
- INVADER_TOTAL_WIDTH = INVADER_WIDTH + INVADER_MARGIN
- INVADER_SPRITE_RECTS = [[0, 0, INVADER_WIDTH, INVADER_HEIGHT], [INVADER_WIDTH, 0, INVADER_WIDTH, INVADER_HEIGHT]]
- INVADERS_LEFT_MARGIN = 50 * SCALE
- INVADERS_TOP_MARGIN = 20 * SCALE
- class invaders:
- class invader:
- def __init__(s, x, y):
- s.x = x
- s.y = y
- def __init__(s):
- global INVADER_SPEED, INVADER_UPDATE_TIME, INVADER_TOTAL_WIDTH, INVADER_COLUMNS, INVADER_ROWS
- global INVADERS_LEFT_MARGIN, INVADERS_TOP_MARGIN
- s.container = []
- for index in range(INVADER_COLUMNS * INVADER_ROWS):
- x = index % INVADER_COLUMNS
- y = int(index / INVADER_COLUMNS)
- s.container += [s.invader(INVADERS_LEFT_MARGIN + x * INVADER_TOTAL_WIDTH, INVADERS_TOP_MARGIN + y * INVADER_TOTAL_WIDTH)]
- s.state = s.moveRight
- s.stateAfterDescent = None
- s.frame = 0
- s.updateTime = INVADER_UPDATE_TIME
- s.updateTick = INVADER_UPDATE_TIME
- def draw(s):
- global INVADER_WIDTH, INVADER_HEIGHT, INVADER_SPRITE_RECTS
- global PRIMARY, SPRITESHEET, SCALE
- for invader in s.container:
- PRIMARY.blit(SPRITESHEET, (invader.x, invader.y), INVADER_SPRITE_RECTS[s.frame])
- def update(s):
- global INVADER_UPDATE_TIME
- global DW
- if s.updateTick:
- s.updateTick -= 1
- return
- s.frame = 1 - s.frame
- s.updateTick = s.updateTime
- s.state()
- def moveRight(s):
- global INVADER_SPEED, INVADER_WIDTH
- global DW
- x = 0
- for invader in s.container:
- invader.x += INVADER_SPEED
- if invader.x > x: x = invader.x
- if x +INVADER_WIDTH >= DW - INVADER_SPEED:
- s.state = s.descend
- s.stateAfterDescent = s.moveLeft
- def moveLeft(s):
- global INVADER_SPEED
- global DW
- x = DW
- for invader in s.container:
- invader.x -= INVADER_SPEED
- if invader.x < x: x = invader.x
- if x <= INVADER_SPEED:
- s.state = s.descend
- s.stateAfterDescent = s.moveRight
- def descend(s):
- global INVADER_HEIGHT
- for invader in s.container:
- invader.y += INVADER_HEIGHT
- s.state = s.stateAfterDescent
- # download the spritesheet from paste.ee
- if not os.path.exists(spritesheet_filename):
- choice = input("Do you want to download [{}] from paste.ee (y/n)?".format(spritesheet_filename))
- if choice.lower() == "y" or choice.lower() == "yes":
- if downloader(spritesheet_url, spritesheet_filename):
- print("Download Successfull!")
- else:
- sys.exit()
- else:
- print("You can't continue without downloading spritesheet first sorry!")
- sys.exit()
- # initilise pygame and create surfaces
- pygame.init()
- PRIMARY = pygame.display.set_mode((DW, DH))
- CLOCK = pygame.time.Clock()
- # load the spritesheet and scale
- SPRITESHEET = pygame.image.load("spritesheet.png").convert()
- SPRITESHEET_WIDTH, SPRITESHEET_HEIGHT = SPRITESHEET.get_size()
- SPRITESHEET = pygame.transform.scale(SPRITESHEET, (SPRITESHEET_WIDTH * SCALE, SPRITESHEET_HEIGHT * SCALE))
- SPRITESHEET.set_colorkey([0, 0, 0]) # set the backcolor is the spritesheet to transparent
- INVADERS = invaders()
- while True:
- start = time.time()
- e = pygame.event.get()
- k = pygame.key.get_pressed()
- # quit?
- if k[pygame.K_ESCAPE]: break
- # clear the sprite surface
- PRIMARY.fill([0, 0, 0])
- # draw invader sprites
- INVADERS.draw()
- # update ship, bullets and invaders
- INVADERS.update()
- # update the primary display surface
- pygame.display.update()
- CLOCK.tick(FPS) # keep time
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement