Míčové hry

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:


Výchozí kód. 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í.

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?