Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame
- class State:
- def __init__(self, engine):
- self.engine = engine
- def on_draw(self, surface): pass
- def on_event(self, event): pass
- def on_update(self, delta, ticks): pass
- def on_quit(self):
- self.engine.running = False
- def next_state(self, state):
- self.engine.next_state = state
- class DisplayEngine:
- def __init__(self, caption, width, height, flags=0):
- pygame.display.set_caption(caption)
- self.surface = pygame.display.set_mode((width, height), flags)
- self.rect = self.surface.get_rect()
- self.clock = pygame.time.Clock()
- self.running = False
- self.delta = 0
- self.fps = 60
- self.state = State(self)
- self.next_state = None
- def mainloop(self, in_state):
- if in_state:
- self.state = in_state
- self.running = True
- while self.running:
- if self.next_state:
- self.state = self.next_state
- self.next_state = None
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- self.state.on_quit()
- else:
- self.state.on_event(event)
- self.state.on_draw(self.surface)
- self.state.on_update(self.delta,
- pygame.time.get_ticks())
- pygame.display.flip()
- self.delta = self.clock.tick(self.fps) * 0.001
- class Entity(pygame.sprite.Sprite):
- def __init__(self, image, position, anchor):
- super().__init__()
- self.image = image
- self.rect = self.image.get_rect(**{anchor: position})
- self.position = pygame.Vector2(self.rect.center)
- def move(self, x, y):
- self.position += (x, y)
- self.rect.center = self.position
- def move_vector(self, vector):
- self.position += vector
- self.rect.center = self.position
- class AnimateEntity(Entity):
- def __init__(self, images, frame, frame_rate, position, anchor):
- super().__init__(images[frame], position, anchor)
- self.frame_rate = frame_rate
- self.images = images
- self.frame = frame
- self.ticks = 0
- def update(self, delta):
- self.ticks += delta
- if self.ticks > self.frame_rate:
- self.ticks -= self.frame_rate
- self.frame = (self.frame + 1) % len(self.images)
- self.image = self.images[self.frame]
- class Images:
- def __init__(self):
- self.aliens = []
- self.player = pygame.Surface((20, 10))
- self.player.fill(pygame.Color("gray40"))
- self.create_alien1()
- self.create_alien2()
- def add(self, alien, animate):
- self.aliens.append((
- pygame.transform.scale2x(alien),
- pygame.transform.scale2x(animate)
- ))
- def create_alien1(self):
- alien = self.create_surface((9, 9))
- eye = pygame.Color(0, 0, 0, 0)
- color = pygame.Color("orange")
- pygame.draw.line(alien, color, (3, 0), (5, 0))
- pygame.draw.line(alien, color, (2, 1), (6, 1))
- pygame.draw.line(alien, color, (1, 2), (7, 2))
- pygame.draw.line(alien, color, (0, 3), (8, 3))
- pygame.draw.line(alien, color, (0, 4), (8, 4))
- pygame.draw.rect(alien, eye, (2, 3, 2, 2))
- pygame.draw.rect(alien, eye, (5, 3, 2, 2))
- pygame.draw.line(alien, color, (1, 5), (7, 5))
- alien.set_at((2, 6), color)
- alien.set_at((4, 6), color)
- alien.set_at((6, 6), color)
- alien.set_at((1, 7), color)
- alien.set_at((4, 7), color)
- alien.set_at((7, 7), color)
- animate = alien.copy()
- alien.set_at((0, 8), color)
- alien.set_at((8, 8), color)
- animate.set_at((2, 8), color)
- animate.set_at((6, 8), color)
- self.add(alien, animate)
- def create_alien2(self):
- alien = self.create_surface((8, 8))
- eye = pygame.Color(0, 0, 0, 0)
- color = pygame.Color("skyblue")
- alien.set_at((2, 0), color)
- alien.set_at((5, 0), color)
- pygame.draw.line(alien, color, (3, 1), (4, 1))
- pygame.draw.line(alien, color, (2, 2), (5, 2))
- pygame.draw.line(alien, color, (1, 3), (6, 3))
- alien.set_at((2, 3), eye)
- alien.set_at((5, 3), eye)
- pygame.draw.line(alien, color, (1, 4), (6, 4))
- pygame.draw.line(alien, color, (2, 5), (5, 5))
- pygame.draw.line(alien, color, (3, 6), (4, 6))
- animate = alien.copy()
- pygame.draw.line(alien, color, (0, 2), (0, 7))
- pygame.draw.line(alien, color, (7, 2), (7, 7))
- alien.set_at((1, 7), color)
- alien.set_at((6, 7), color)
- pygame.draw.line(animate, color, (0, 1), (0, 6))
- pygame.draw.line(animate, color, (7, 1), (7, 6))
- animate.set_at((1, 6), color)
- animate.set_at((6, 6), color)
- self.add(alien, animate)
- def create_surface(self, size):
- surface = pygame.Surface(size, pygame.SRCALPHA)
- surface.fill((0, 0, 0, 0))
- return surface
- class Intro(State):
- def __init__(self, engine):
- super().__init__(engine)
- self.images = Images()
- font = pygame.font.Font(None, 30)
- self.space = font.render("SPACE", 1, pygame.Color("yellow"))
- self.invaders = font.render("INVADERS", 1, pygame.Color("yellow"))
- pos = self.engine.rect.centerx, 100
- self.space_rect = self.space.get_rect(midtop=pos)
- pos = self.engine.rect.centerx, 100 + font.get_linesize()
- self.invaders_rect = self.invaders.get_rect(midtop=pos)
- def on_draw(self, surface):
- surface.fill(pygame.Color("black"))
- surface.blit(self.space, self.space_rect)
- surface.blit(self.invaders, self.invaders_rect)
- def on_event(self, event):
- if event.type == pygame.KEYDOWN:
- self.next_state(Game(self.engine, self.images))
- class Game(State):
- def __init__(self, engine, images, level=0):
- super().__init__(engine)
- self.level = level
- self.images = images
- self.aliens = pygame.sprite.Group()
- self.player_bullets = pygame.sprite.Group()
- position = self.engine.rect.centerx, self.engine.rect.bottom - 40
- self.player = Entity(images.player, position, "midbottom")
- self.build_level()
- def build_level(self):
- if self.level == 0:
- for x in range(11):
- position = 30 + x * 30, 100
- images = self.images.aliens[1]
- alien1 = AnimateEntity(images, x % 2, 1, position, "midtop")
- position = 30 + x * 30, 140
- alien2 = AnimateEntity(images, (x + 1) % 2, 1, position, "midtop")
- position = 30 + x * 30, 180
- images = self.images.aliens[0]
- alien3 = AnimateEntity(images, x % 2, 1, position, "midtop")
- position = 30 + x * 30, 220
- alien4 = AnimateEntity(images, (x + 1) % 2, 1, position, "midtop")
- self.aliens.add(alien1, alien2, alien3, alien4)
- def on_draw(self, surface):
- surface.fill(pygame.Color("black"))
- self.aliens.draw(surface)
- def on_update(self, delta, ticks):
- self.aliens.update(delta)
- if __name__ == "__main__":
- pygame.init()
- engine = DisplayEngine("Space Invaders", 30 * 12, 400)
- engine.mainloop(Intro(engine))
- pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement