Аркадная игра на PyGame

Астероиды

Теперь самое время добавить астероиды. Для них нам так же потребуется описать собственный класс, но в отличие от игрока, они не будут реагировать на клавиши, а всегда будут двигаться вниз.

Кстати, нам снова понадобится картинка, можно взять нашу.

import pygame
import random
from pygame.transform import scale

# создаем Астероид, расширяющий класс Спрайт
class Asteroid(pygame.sprite.Sprite):
    # конструктор, в который передаются стартовые координаты
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)

        # загружаем картинку с астероидом и масштабируем под размер 50 на 50
        self.image = scale(pygame.image.load("asteroid.png"), (50, 50))
        # задаем прямоугольную область 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

        # если астероид за границей карты - он умирает
        if self.rect.y > 900:
            self.kill()

class Spaceship(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)

        self.rect = pygame.Rect(x, y, 50, 100)
        self.image = scale(pygame.image.load("ship.png"), (50, 100))
        self.xvel = 0

    def draw(self, screen):
        screen.blit(self.image, (self.rect.x, self.rect.y))

    def update(self, left, right):
        if left:
            self.xvel -= 3

        if right:
            self.xvel += 3
        if not (left or right):
            self.xvel = 0
        self.rect.x += self.xvel

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Asteroids")

sky = scale(pygame.image.load("sky.jpg"), (800, 600))

ship = Spaceship(400, 400)

left = False
right = False

# создадим группу спрайтов, в которой будут храниться все астероиды
asteroids = pygame.sprite.Group()

while True:
    # с некоторой вероятность будем добавлять астероиды сверху экрана
    if random.randint(1, 1000) > 900:
        # выбираем координату по оси x
        asteroid_x = random.randint(-100, 700)
        # выбираем точку за верхней граничей экрана
        asteroid_y = -100
        # создаем астероид
        asteroid = Asteroid(asteroid_x, asteroid_y)
        # и добавляем его в группу
        asteroids.add(asteroid)

    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)
    # просим корабль нарисоваться
    ship.draw(screen)

    # перемещаем и рисуем каждый астероид в группе
    for asteroid in asteroids:
        asteroid.update()
        asteroid.draw(screen)

    pygame.display.update()

Назад Вперед