Advertisement
Windspar

Pygame Space Invaders Unfinish

Aug 18th, 2021
1,735
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.46 KB | None | 0 0
  1. import pygame
  2.  
  3. class State:
  4.     def __init__(self, engine):
  5.         self.engine = engine
  6.  
  7.     def on_draw(self, surface): pass
  8.     def on_event(self, event): pass
  9.     def on_update(self, delta, ticks): pass
  10.  
  11.     def on_quit(self):
  12.         self.engine.running = False
  13.  
  14.     def next_state(self, state):
  15.         self.engine.next_state = state
  16.  
  17. class DisplayEngine:
  18.     def __init__(self, caption, width, height, flags=0):
  19.         pygame.display.set_caption(caption)
  20.         self.surface = pygame.display.set_mode((width, height), flags)
  21.         self.rect = self.surface.get_rect()
  22.         self.clock = pygame.time.Clock()
  23.         self.running = False
  24.         self.delta = 0
  25.         self.fps = 60
  26.  
  27.         self.state = State(self)
  28.         self.next_state = None
  29.  
  30.     def mainloop(self, in_state):
  31.         if in_state:
  32.             self.state = in_state
  33.  
  34.         self.running = True
  35.         while self.running:
  36.             if self.next_state:
  37.                 self.state = self.next_state
  38.                 self.next_state = None
  39.  
  40.             for event in pygame.event.get():
  41.                 if event.type == pygame.QUIT:
  42.                     self.state.on_quit()
  43.                 else:
  44.                     self.state.on_event(event)
  45.  
  46.             self.state.on_draw(self.surface)
  47.             self.state.on_update(self.delta,
  48.                                  pygame.time.get_ticks())
  49.  
  50.             pygame.display.flip()
  51.             self.delta = self.clock.tick(self.fps) * 0.001
  52.  
  53. class Entity(pygame.sprite.Sprite):
  54.     def __init__(self, image, position, anchor):
  55.         super().__init__()
  56.         self.image = image
  57.         self.rect = self.image.get_rect(**{anchor: position})
  58.         self.position = pygame.Vector2(self.rect.center)
  59.  
  60.     def move(self, x, y):
  61.         self.position += (x, y)
  62.         self.rect.center = self.position
  63.  
  64.     def move_vector(self, vector):
  65.         self.position += vector
  66.         self.rect.center = self.position
  67.  
  68. class AnimateEntity(Entity):
  69.     def __init__(self, images, frame, frame_rate, position, anchor):
  70.         super().__init__(images[frame], position, anchor)
  71.         self.frame_rate = frame_rate
  72.         self.images = images
  73.         self.frame = frame
  74.         self.ticks = 0
  75.  
  76.     def update(self, delta):
  77.         self.ticks += delta
  78.         if self.ticks > self.frame_rate:
  79.             self.ticks -= self.frame_rate
  80.             self.frame = (self.frame + 1) % len(self.images)
  81.             self.image = self.images[self.frame]
  82.  
  83. class Images:
  84.     def __init__(self):
  85.         self.aliens = []
  86.         self.player = pygame.Surface((20, 10))
  87.         self.player.fill(pygame.Color("gray40"))
  88.         self.create_alien1()
  89.         self.create_alien2()
  90.  
  91.     def add(self, alien, animate):
  92.         self.aliens.append((
  93.             pygame.transform.scale2x(alien),
  94.             pygame.transform.scale2x(animate)
  95.         ))
  96.  
  97.     def create_alien1(self):
  98.         alien = self.create_surface((9, 9))
  99.         eye = pygame.Color(0, 0, 0, 0)
  100.         color = pygame.Color("orange")
  101.         pygame.draw.line(alien, color, (3, 0), (5, 0))
  102.         pygame.draw.line(alien, color, (2, 1), (6, 1))
  103.         pygame.draw.line(alien, color, (1, 2), (7, 2))
  104.         pygame.draw.line(alien, color, (0, 3), (8, 3))
  105.         pygame.draw.line(alien, color, (0, 4), (8, 4))
  106.         pygame.draw.rect(alien, eye, (2, 3, 2, 2))
  107.         pygame.draw.rect(alien, eye, (5, 3, 2, 2))
  108.         pygame.draw.line(alien, color, (1, 5), (7, 5))
  109.         alien.set_at((2, 6), color)
  110.         alien.set_at((4, 6), color)
  111.         alien.set_at((6, 6), color)
  112.         alien.set_at((1, 7), color)
  113.         alien.set_at((4, 7), color)
  114.         alien.set_at((7, 7), color)
  115.         animate = alien.copy()
  116.         alien.set_at((0, 8), color)
  117.         alien.set_at((8, 8), color)
  118.         animate.set_at((2, 8), color)
  119.         animate.set_at((6, 8), color)
  120.  
  121.         self.add(alien, animate)
  122.  
  123.     def create_alien2(self):
  124.         alien = self.create_surface((8, 8))
  125.         eye = pygame.Color(0, 0, 0, 0)
  126.         color = pygame.Color("skyblue")
  127.         alien.set_at((2, 0), color)
  128.         alien.set_at((5, 0), color)
  129.         pygame.draw.line(alien, color, (3, 1), (4, 1))
  130.         pygame.draw.line(alien, color, (2, 2), (5, 2))
  131.         pygame.draw.line(alien, color, (1, 3), (6, 3))
  132.         alien.set_at((2, 3), eye)
  133.         alien.set_at((5, 3), eye)
  134.         pygame.draw.line(alien, color, (1, 4), (6, 4))
  135.         pygame.draw.line(alien, color, (2, 5), (5, 5))
  136.         pygame.draw.line(alien, color, (3, 6), (4, 6))
  137.         animate = alien.copy()
  138.         pygame.draw.line(alien, color, (0, 2), (0, 7))
  139.         pygame.draw.line(alien, color, (7, 2), (7, 7))
  140.         alien.set_at((1, 7), color)
  141.         alien.set_at((6, 7), color)
  142.  
  143.         pygame.draw.line(animate, color, (0, 1), (0, 6))
  144.         pygame.draw.line(animate, color, (7, 1), (7, 6))
  145.         animate.set_at((1, 6), color)
  146.         animate.set_at((6, 6), color)
  147.  
  148.         self.add(alien, animate)
  149.  
  150.     def create_surface(self, size):
  151.         surface = pygame.Surface(size, pygame.SRCALPHA)
  152.         surface.fill((0, 0, 0, 0))
  153.         return surface
  154.  
  155. class Intro(State):
  156.     def __init__(self, engine):
  157.         super().__init__(engine)
  158.         self.images = Images()
  159.         font = pygame.font.Font(None, 30)
  160.         self.space = font.render("SPACE", 1, pygame.Color("yellow"))
  161.         self.invaders = font.render("INVADERS", 1, pygame.Color("yellow"))
  162.         pos = self.engine.rect.centerx, 100
  163.         self.space_rect = self.space.get_rect(midtop=pos)
  164.         pos = self.engine.rect.centerx, 100 + font.get_linesize()
  165.         self.invaders_rect = self.invaders.get_rect(midtop=pos)
  166.  
  167.     def on_draw(self, surface):
  168.         surface.fill(pygame.Color("black"))
  169.         surface.blit(self.space, self.space_rect)
  170.         surface.blit(self.invaders, self.invaders_rect)
  171.  
  172.     def on_event(self, event):
  173.         if event.type == pygame.KEYDOWN:
  174.             self.next_state(Game(self.engine, self.images))
  175.  
  176. class Game(State):
  177.     def __init__(self, engine, images, level=0):
  178.         super().__init__(engine)
  179.         self.level = level
  180.         self.images = images
  181.         self.aliens = pygame.sprite.Group()
  182.         self.player_bullets = pygame.sprite.Group()
  183.         position = self.engine.rect.centerx, self.engine.rect.bottom - 40
  184.         self.player = Entity(images.player, position, "midbottom")
  185.         self.build_level()
  186.  
  187.     def build_level(self):
  188.         if self.level == 0:
  189.             for x in range(11):
  190.                 position = 30 + x * 30, 100
  191.                 images = self.images.aliens[1]
  192.                 alien1 = AnimateEntity(images, x % 2, 1, position, "midtop")
  193.                 position = 30 + x * 30, 140
  194.                 alien2 = AnimateEntity(images, (x + 1) % 2, 1, position, "midtop")
  195.                 position = 30 + x * 30, 180
  196.                 images = self.images.aliens[0]
  197.                 alien3 = AnimateEntity(images, x % 2, 1, position, "midtop")
  198.                 position = 30 + x * 30, 220
  199.                 alien4 = AnimateEntity(images, (x + 1) % 2, 1, position, "midtop")
  200.                 self.aliens.add(alien1, alien2, alien3, alien4)
  201.  
  202.     def on_draw(self, surface):
  203.         surface.fill(pygame.Color("black"))
  204.         self.aliens.draw(surface)
  205.  
  206.     def on_update(self, delta, ticks):
  207.         self.aliens.update(delta)
  208.  
  209. if __name__ == "__main__":
  210.     pygame.init()
  211.     engine = DisplayEngine("Space Invaders", 30 * 12, 400)
  212.     engine.mainloop(Intro(engine))
  213.     pygame.quit()
  214.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement