Na psaní her určitě použijeme radši knihovnu Pygame. Z webu Pygame.org stáhněte pygame-1.9.2a0.win32-py3.2.msi (nebo jiný, jestli máte jiný operační systém nebo jinou verzi Pythonu než 3.2) a nainstalujte ho. Pokud pracujete na školních počítačích, stáhněte místo toho vhodný soubor z webu C. Gohlkeho, přejmenujte instalátor na koncovku .zip, otevřete ho vhodným správcem archivů (například 7Zip) a rozbalte složku pygame
vcelku do složky, kde píšete svůj skript. Nebo tuhle složku zkopírujte ze sdílení ve škole.
Následující ukázka využívá soubor ball.png
, ten musí být uložený ve stejné složce jako váš skript. Můžete použít následující obrázek míče, který jsem stáhnul z Wikipedie:
import pygame
import pygame.locals as pl
pygame.init()
clock = pygame.time.Clock()
screenrect = pl.Rect(0, 0, 640, 480)
screen = pygame.display.set_mode(screenrect.size)
pygame.display.set_caption('Kravinky v Pygame')
black = pygame.Color(0, 0, 0)
white = pygame.Color(255, 255, 255)
ball = pygame.image.load('ball.png')
ballrect = ball.get_rect()
background = pygame.Surface(screenrect.size)
background.fill(white)
screen.blit(background, (0,0))
alive = True
while alive:
for event in pygame.event.get():
if event.type == pl.QUIT or (event.type == pl.KEYDOWN and event.key == pl.K_ESCAPE):
alive = False
elif event.type == pl.MOUSEMOTION:
# kresleni na obrazovku, kdyz je zmacknute leve, mazani, kdyz prave
left, middle, right = pygame.mouse.get_pressed()
if left:
pygame.draw.circle(background, black, event.pos, 5, 0)
pygame.draw.circle(screen, black, event.pos, 5, 0)
elif right:
pygame.draw.circle(background, white, event.pos, 5, 0)
pygame.draw.circle(screen, white, event.pos, 5, 0)
keystate = pygame.key.get_pressed()
horz = keystate[pl.K_RIGHT] - keystate[pl.K_LEFT]
vert = keystate[pl.K_DOWN] - keystate[pl.K_UP]
# vymazeme plochu, kde byl mic posledne
screen.blit(background, ballrect, ballrect)
# posuneme mic
ballrect = ballrect.move(horz, vert)
# vykreslime mic na nove pozici
screen.blit(ball, ballrect)
pygame.display.update()
clock.tick(30) # 30 FPS
pygame.quit()
Vysvětlení.
pl.Rect
) je obdélník umístěný někde v rovině. Má vlastnosti x
, y
, což jsou čísla, a size
, což je dvojice čísel (šířka, výška). V kódu vyjadřuje velikost obrazovky a pozici a velikost míče. Metoda Rect.move(dx, dy)
navrací nový obdélník posunutý o dané hodnoty.ball
, obrázek načtený z disku, druhak jako viditelná plocha okna screen
a zatřetí jako plocha background
, kterou jsme si vytvořili navíc a na kterou může uživatel kreslit. Užitečná je metoda Surface.blit(zdroj, kam, odkud)
, která z daného objektu zdroj
typu Surface
vezme obdélník z pozice odkud
a vykreslí ho do obdélníku na pozici kam
ve svém vlastním objektu. Druhý a třetí parametr můžeme vynechat.Clock.tick(fps)
, která zaručí, že hra nebude mít víc než daný počet FPS (frame per second). Podrobněji, funkce si pamatuje, kdy byla volaná naposledy, a její výpočet skončí teprve ve chvíli, kdy je mezi voláními 1/fps
vteřin. Ta funkce ale samozřejmě nic nepočítá – slouží právě k tomu, abychom zbytečně nežhavili procesor.Příklad. Zařiďte, aby míč měl setrvačnost: šipky tedy nezpůsobují přímo pohyb, ale jen mění rychlost míče v příslušném směru.
Nejlepší bude zavést si nějaké proměnné pro vodorovnou a svislou složku rychlosti. Snažte se, aby se k pozici míče přičítala (a ne odečítala), pomůže to přehlednosti.
Příklad. Nechte míč odrážet od všech čtyř okrajů. Buďto bezeztrátově, nebo s nějakým zbržděním. Začněte levým a horním okrajem, až to bude fungovat, přidejte pravý a dolní.
Pozici míče máte v proměnné ballrect
, její složky zjistíte jako ballrect.x
a ballrect.y
. Narozdíl od toho, velikost obdélníku je obyčejná dvojice čísel, takže například šířku míče zjistíte jako ballrect.size[0]
a výšku okna zjistíte jako screenrect.size[1]
.
Příklad. Přidejte gravitaci, která bude působit trvale směrem dolů (a na všech místech stejně).
Příklad. Přidělejte míč neviditelnou pružinou k současné poloze myši.
Polohu myši bude nejlepší si pamatovat v nějakých proměnných a měnit ji při každé události MOUSEMOTION
. Zjistíte ji z proměnných event.pos[0]
, event.pos[1]
.
Na míč má působit síla ve směru k poloze myši, která bude nějakým rozumným způsobem úměrná jeho vzdálenosti. Záleží to na velikosti okna, ale docela pěkně funguje přímá úměrnost s koeficientem 0.1
. Až to bude fungovat, zařiďte, aby se míč přitahoval k myši svým středem (a ne svým levým horním rohem). Gravitace vám míč posouvá trochu směrem dolů, můžete ji zase smazat.
Aby míč nepružil tak otravně moc, můžete mu přidat tření vzduchu: v každém kroku jeho rychlost přenásobit něčím kladným menším než 1.
Funguje odstředivá síla, jak má? Umíte míč rozhoupat tak, aby běhal kolem kurzoru myši po kružnici? Umíte ho potom zase zastavit, i když vypnete tření? Co vám připadá nejdůležitější, co mechanice míče chybí oproti reálu?