Untitled

 avatar
unknown
plain_text
16 days ago
4.9 kB
6
Indexable
from pygame import *
from random import randint

PLAYER_WIDTH = 60
PLAYER_HEIGHT = 90

BULLET_WIDTH = 14
BULLET_HEIGHT = 20

FPS = 60


# нам потрібні такі картинки:
img_back = "galaxy.jpg"  # фон гри
img_hero = "rocket.png"  # герой
img_bullet = "bullet.png"

win_width = 1200
win_height = 720
display.set_caption("Shooter")
window = display.set_mode((win_width, win_height))
background = transform.scale(image.load(img_back), (win_width, win_height))

font.init()


# фонова музика
mixer.init()
mixer.music.load('space.ogg')
#mixer.music.play()
fire_sound = mixer.Sound('fire.ogg')

clock = time.Clock()



# клас-батько для інших спрайтів
class GameSprite(sprite.Sprite):
    # конструктор класу
    def __init__(self, player_image, player_x, player_y, size_x, size_y, speed = 5):
        # викликаємо конструктор класу (Sprite):
        sprite.Sprite.__init__(self)
        # кожен спрайт повинен зберігати властивість image - зображення
        self.image = transform.scale(
            image.load(player_image), (size_x, size_y))
        self.speed = speed


        # кожен спрайт повинен зберігати властивість rect - прямокутник, в який він вписаний
        self.rect = self.image.get_rect()
        self.rect.x = player_x
        self.rect.y = player_y

    # метод, що малює героя на вікні
    def reset(self):
        window.blit(self.image, (self.rect.x, self.rect.y))


class Player(GameSprite):
     
    def update(self):
        keys = key.get_pressed()    
       
        if keys[K_d] and self.rect.x <  win_width - PLAYER_WIDTH:
            self.rect.x += self.speed
        if keys[K_a] and self.rect.x > 0:
            self.rect.x -= self.speed
        
    def fire(self):
        bullets.add(
            Bullet(
                img_bullet,self.rect.centerx - BULLET_WIDTH / 2 ,self.rect.top,BULLET_WIDTH,BULLET_HEIGHT,3
                )
        )
    
    
    
class Enemy(GameSprite):
    def update(self):
        self.rect.y += self.speed
        if self.rect.y > win_height:
            self.rect.x = randint(10, win_width-70)
            self.rect.y = -100
            


class Bullet(GameSprite):
    def update(self):
        self.rect.y -= self.speed
        if self.rect.y < 0 - 200:
            self.kill()
        

class HUD:
    def __init__(self):
        self.font = font.SysFont("Impact", 60)
        self.set_score(0)

    def set_score(self, score):
        self.score_text = self.font.render(f"SCORE: {str(score)}", True, (255,255,255))
    
    def draw(self):
        window.blit(self.score_text,(0,0))


monsters = sprite.Group()
bullets = sprite.Group()

hud = HUD()


for i in range(6):
    e = Enemy(        
        "ufo.png",  
        randint(10, win_width-70),
        -100
        ,60,60,
        3
    )
    monsters.add(e)



# створюємо віконце

ship = Player(
    r"rocket.png", 
    win_width/2 - PLAYER_WIDTH/2, 
    win_height-win_height/4, 
    PLAYER_WIDTH, PLAYER_HEIGHT,
    5
    )

# змінна "гра закінчилася": як тільки вона стає True, в основному циклі перестають працювати спрайти
finish = False

score = 0
# Основний цикл гри:
run = True  # прапорець скидається кнопкою закриття вікна


while run:
    # подія натискання на кнопку Закрити
    for e in event.get():
        if e.type == QUIT:
            run = False
        if e.type == KEYDOWN:
            if e.key == K_SPACE:
                ship.fire()
        if e.type == MOUSEBUTTONDOWN:
            pass


    if not finish:
        # оновлюємо фон
        window.blit(background, (0, 0))

        ship.update()
        monsters.update()
        bullets.update()


        collides = sprite.groupcollide(monsters, bullets, True, True)
        for c in collides:
            monster = Enemy( 
                        "ufo.png",  
                        randint(10, win_width-70),
                        -100
                        ,80,60,
                        2
                        )

            monsters.add(monster)
            score += 1
            hud.set_score(score)

        hud.draw()
        monsters.draw(window)
        bullets.draw(window)
        ship.reset()
        display.update()
    # цикл спрацьовує кожні 0.05 секунд
    clock.tick(FPS)
    
Editor is loading...
Leave a Comment