Untitled
unknown
plain_text
25 days ago
4.9 kB
7
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