🎮 Pygame – Spēļu izstrāde
Pygame ir populāra Python bibliotēka 2D spēļu un multimediju lietotņu izstrādei. Tā nodrošina logu, grafiku, skaņu, tastatūras/peles apstrādi un daudz ko citu.
Instalācija un spēles cilpa
Teksts
# Instalēt Pygame
pip install pygame
# Pārbaude
python -c "import pygame; print(pygame.__version__)"
import pygame
import sys
# Inicializācija
pygame.init()
# Logs
PLATUMS, AUGSTUMS = 800, 600
ekrāns = pygame.display.set_mode((PLATUMS, AUGSTUMS))
pygame.display.set_caption("Mana pirmā spēle")
# Pulkstenis (FPS kontrolei)
pulkstenis = pygame.time.Clock()
FPS = 60
# Galvenā spēles cilpa
while True:
# 1. Notikumu apstrāde
for notikums in pygame.event.get():
if notikums.type == pygame.QUIT: # Aizvērt logu
pygame.quit()
sys.exit()
if notikums.type == pygame.KEYDOWN:
if notikums.key == pygame.K_ESCAPE: # Escape = iziet
pygame.quit()
sys.exit()
# 2. Loģika (tiks pievienota vēlāk)
# 3. Zīmēšana
ekrāns.fill((30, 30, 30)) # Fona krāsa (R, G, B)
# 4. Atjaunot ekrānu
pygame.display.flip()
# 5. Ierobežot FPS
pulkstenis.tick(FPS)
Zīmēšana
Teksts
import pygame
pygame.init()
ekrāns = pygame.display.set_mode((700, 500))
pulkstenis = pygame.time.Clock()
# Krāsas (R, G, B)
BALTS = (255, 255, 255)
MELNS = (0, 0, 0 )
SARKANS = (220, 50, 50 )
ZAĻŠ = (50, 200, 50 )
ZILS = (50, 100, 220)
DZELTENS = (255, 220, 0)
running = True
while running:
for e in pygame.event.get():
if e.type == pygame.QUIT:
running = False
ekrāns.fill(MELNS)
# Taisnstūris: (virsma, krāsa, (x, y, platums, augstums), [apmale])
pygame.draw.rect(ekrāns, SARKANS, (50, 50, 150, 80))
pygame.draw.rect(ekrāns, ZAĻŠ, (50, 160, 150, 80), 3) # Tikai mala
# Aplis: (virsma, krāsa, (cx, cy), rādiuss, [apmale])
pygame.draw.circle(ekrāns, ZILS, (400, 120), 60)
pygame.draw.circle(ekrāns, BALTS, (400, 120), 60, 2)
# Elipse
pygame.draw.ellipse(ekrāns, DZELTENS, (500, 50, 150, 100))
# Līnija: (virsma, krāsa, sākums, beigas, [biezums])
pygame.draw.line(ekrāns, BALTS, (0, 250), (700, 250), 2)
# Polilīnija
pygame.draw.lines(ekrāns, SARKANS, False,
[(100, 300), (200, 400), (300, 320), (400, 420)], 3)
# Daudzstūris
pygame.draw.polygon(ekrāns, ZAĻŠ,
[(550, 280), (650, 350), (600, 450), (500, 450), (450, 350)])
pygame.display.flip()
pulkstenis.tick(60)
pygame.quit()
Kustīgi objekti un tastatūra
Teksts
import pygame, sys
pygame.init()
ekrāns = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Kustīgs kvadrāts")
pulkstenis = pygame.time.Clock()
# Spēlētāja stāvoklis
spēlētājs = pygame.Rect(375, 275, 50, 50) # x, y, platums, augstums
ĀTRUMS = 4
krāsa = (100, 180, 255)
running = True
while running:
for e in pygame.event.get():
if e.type == pygame.QUIT: running = False
# Tastatūras nospiedumi (get_pressed = gluda kustība)
taustiņi = pygame.key.get_pressed()
if taustiņi[pygame.K_UP] or taustiņi[pygame.K_w]: spēlētājs.y -= ĀTRUMS
if taustiņi[pygame.K_DOWN] or taustiņi[pygame.K_s]: spēlētājs.y += ĀTRUMS
if taustiņi[pygame.K_LEFT] or taustiņi[pygame.K_a]: spēlētājs.x -= ĀTRUMS
if taustiņi[pygame.K_RIGHT] or taustiņi[pygame.K_d]: spēlētājs.x += ĀTRUMS
# Robežu pārbaude (neiziet ārpus ekrāna)
spēlētājs.clamp_ip(ekrāns.get_rect())
# Zīmēt
ekrāns.fill((20, 20, 40))
pygame.draw.rect(ekrāns, krāsa, spēlētājs, border_radius=8)
# Pozīcijas teksts
fonts = pygame.font.SysFont(None, 24)
uzraksts = fonts.render(f"x={spēlētājs.x} y={spēlētājs.y}", True, (200,200,200))
ekrāns.blit(uzraksts, (10, 10))
pygame.display.flip()
pulkstenis.tick(60)
pygame.quit()
Sprites un grupu pārvaldība
Teksts
import pygame, sys, random
pygame.init()
ekrāns = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Sprites demo")
pulkstenis = pygame.time.Clock()
# Sprite klase
class Zvaigzne(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
# Izveidot virsmu (zīmēt uz tās)
r = random.randint(3, 10)
self.image = pygame.Surface((r*2, r*2), pygame.SRCALPHA)
krāsa = (random.randint(180, 255),
random.randint(180, 255),
random.randint(50, 255))
pygame.draw.circle(self.image, krāsa, (r, r), r)
self.rect = self.image.get_rect()
# Sākotnējā pozīcija
self.rect.x = random.randint(0, 780)
self.rect.y = random.randint(-600, 0)
self.ātrums = random.randint(1, 5)
def update(self):
self.rect.y += self.ātrums
if self.rect.top > 600: # Nokritusi zemāk par ekrānu
self.rect.y = random.randint(-50, -5)
self.rect.x = random.randint(0, 780)
# Izveidot grupu
zvaigznes = pygame.sprite.Group()
for _ in range(100):
zvaigznes.add(Zvaigzne())
running = True
while running:
for e in pygame.event.get():
if e.type == pygame.QUIT: running = False
# Atjaunot visus sprites
zvaigznes.update()
# Zīmēt
ekrāns.fill((10, 10, 30))
zvaigznes.draw(ekrāns) # Zīmē visus sprites grupā
# FPS rādītājs
fps_fonts = pygame.font.SysFont(None, 28)
fps_txt = fps_fonts.render(f"FPS: {int(pulkstenis.get_fps())}", True, (255,255,255))
ekrāns.blit(fps_txt, (10, 10))
pygame.display.flip()
pulkstenis.tick(60)
pygame.quit()
Sadursmes un mini-spēle
🚀 Tālākā attīstība
- Skaņa: pygame.mixer.Sound("audio.wav").play()
- Attēli: pygame.image.load("sprite.png")
- Fizika: pymunk bibliotēka
- Tīkls: pygame-ce + sockets daudzspēlētāju spēlēm
Teksts
import pygame, sys, random
pygame.init()
ekrāns = pygame.display.set_mode((600, 500))
pygame.display.set_caption("Savāc punktus!")
pulkstenis = pygame.time.Clock()
fonts = pygame.font.SysFont("Arial", 28, bold=True)
mazi_fonts = pygame.font.SysFont("Arial", 20)
class Spēlētājs(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((40, 40), pygame.SRCALPHA)
pygame.draw.rect(self.image, (80, 160, 255), (0, 0, 40, 40), border_radius=8)
self.rect = self.image.get_rect(center=(300, 250))
def update(self):
t = pygame.key.get_pressed()
if t[pygame.K_UP]: self.rect.y -= 4
if t[pygame.K_DOWN]: self.rect.y += 4
if t[pygame.K_LEFT]: self.rect.x -= 4
if t[pygame.K_RIGHT]: self.rect.x += 4
self.rect.clamp_ip(ekrāns.get_rect())
class Punkts(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
r = random.randint(8, 16)
self.image = pygame.Surface((r*2, r*2), pygame.SRCALPHA)
pygame.draw.circle(self.image, (255, 200, 0), (r, r), r)
self.rect = self.image.get_rect(
x=random.randint(20, 560),
y=random.randint(20, 460)
)
spēlētājs_g = pygame.sprite.GroupSingle(Spēlētājs())
punkti_g = pygame.sprite.Group([Punkts() for _ in range(8)])
rezultāts = 0
running = True
while running:
for e in pygame.event.get():
if e.type == pygame.QUIT: running = False
spēlētājs_g.update()
# Sadursmes pārbaude
savāktie = pygame.sprite.spritecollide(spēlētājs_g.sprite, punkti_g, True)
rezultāts += len(savāktie)
for _ in savāktie:
punkti_g.add(Punkts()) # Jauns punkts katram savāktajam
ekrāns.fill((15, 15, 35))
punkti_g.draw(ekrāns)
spēlētājs_g.draw(ekrāns)
r_txt = fonts.render(f"Punkti: {rezultāts}", True, (255, 230, 100))
ekrāns.blit(r_txt, (10, 10))
u_txt = mazi_fonts.render("Bultiņas = kustība", True, (150, 150, 150))
ekrāns.blit(u_txt, (10, 470))
pygame.display.flip()
pulkstenis.tick(60)
pygame.quit()