0%

🎮 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.

python

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()