Аркадная игра на PyGame
Бонус: анимация столкновений
При столкновении астероида и корабля можно попробовать добавить анимацию взрывов на корабле.
Для этого можно взять раскадровку взрыва и разрезать ее на части, например, используя веб-сервис. Получившиеся кадры можно положить в папку explosion.
Кстати, полный код того, что у нас получилось всегда можно будет скачать на гитхабе.
import pygame
import random
from pygame.transform import scale
class Explosion(pygame.sprite.Sprite):
def __init__(self, x, y):
self.rect = pygame.Rect(x, y, 40, 40)
self.images = []
self.index = 0
for i in range(8):
image = scale(pygame.image.load(f"explosion/tile00{i}.png"), (40, 40))
self.images.append(image)
def draw(self, screen):
if self.index < 8:
screen.blit(self.images[self.index], (self.rect.x, self.rect.y))
self.index += 1
class Spaceship(pygame.sprite.Sprite):
def __init__(self, x, y):
self.rect = pygame.Rect(x, y, 50, 100)
self.image = scale(pygame.image.load("ship.png"), (50, 100))
self.xvel = 0
self.life = 100
self.explosions = []
def draw(self, screen):
screen.blit(self.image, (self.rect.x, self.rect.y))
for explosion in self.explosions:
explosion.draw(screen)
def update(self, left, right, asteroids):
if left:
self.xvel += -3
if right:
self.xvel += 3
if not (left or right):
self.xvel = 0
for asteroid in asteroids:
if self.rect.colliderect(asteroid.rect):
self.life -= 1
rx = random.randint(-5, 40)
ry = random.randint(-5, 40)
explosion = Explosion(self.rect.x + rx, self.rect.y + ry)
self.explosions.append(explosion)
self.rect.x += self.xvel
class Asteroid(pygame.sprite.Sprite):
def __init__(self, x, y):
self.image = scale(pygame.image.load("asteroid.png"), (50, 50))
self.rect = pygame.Rect(x, y, 50, 50)
self.yvel = 5
def draw(self, screen):
screen.blit(self.image, (self.rect.x, self.rect.y))
def update(self):
self.rect.y += self.yvel
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Asteroids")
timer = pygame.time.Clock()
sky = scale(pygame.image.load("sky.jpg"), (800, 600))
ship = Spaceship(400, 400)
left = False
right = False
asteroids = []
pygame.font.init()
font = pygame.font.SysFont('Comic Sans MS', 30)
while True:
if random.randint(1, 1000) > 900:
asteroid_x = random.randint(-100, 700)
asteroid_y = -100
asteroid = Asteroid(asteroid_x, asteroid_y)
asteroids.append(asteroid)
timer.tick(60)
for e in pygame.event.get():
if e.type == pygame.KEYDOWN and e.key == pygame.K_LEFT:
left = True
if e.type == pygame.KEYDOWN and e.key == pygame.K_RIGHT:
right = True
if e.type == pygame.KEYUP and e.key == pygame.K_LEFT:
left = False
if e.type == pygame.KEYUP and e.key == pygame.K_RIGHT:
right = False
if e.type == pygame.QUIT:
raise SystemExit("QUIT")
screen.blit(sky, (0, 0))
ship.update(left, right, asteroids)
ship.draw(screen)
for asteroid in asteroids:
asteroid.update()
asteroid.draw(screen)
textsurface = font.render(f'HP: {ship.life}', False, (255, 255, 255))
screen.blit(textsurface, (20, 20))
pygame.display.update()