Jak programovat hry na pythonu pomocí knihovny pygame

Tento článek je určen pro ty, kteří jsou již obeznámeni s programovacím jazykem Pythonu a umožňuje přečíst knihovnu Pygame pro tento jazyk. Jako vizuální příklad je zde zobrazen jednoduchý proces programování hry, ve kterém hráč musí darovat z skákání míče.

Kroky

Část 1 z 8:
Instalace pygame
jeden. Stáhnout pygame. Postupujte podle odkazu a najděte verzi knihovny vhodnou pro vaši platformu: http: // Pygame.Org / Download.shtml .
  • 2. Spustit instalační program.
  • 3. Ujistěte se, že instalace byla úspěšně dokončena. Otevřete terminál Python. Zadejte "import pygame". Pokud se nezobrazí chybová hlášení, pak byl Pygame úspěšně nainstalován.
    Import pygame
  • Část 2 z 8:
    Vytvoření hlavní herní okno
    jeden. Vytvořit nový soubor.
  • 2. Import pygame. Pygame je knihovna, která implementuje přístup k programování jazykového jazyka Python. Pokud se chcete dozvědět více o tom, jak tyto funkce fungují, jsou informace k dispozici na Pygame. https: // Pygame.Org / docs /
    Import pygamefrom pygame.Místní import *
  • 3. Zadejte velikost okna hry. Vytvořte globální proměnnou pro velikosti oken, aby se odkazoval na to z různých částí hry. Pro pohodlí jsou tyto parametry lepší specifikovat na začátku souboru, takže v případě potřeby bylo snadnější změnit v budoucnu. Pro složitější projekty bude vhodnější provést taková data v samostatném souboru.
    Rozlišení = (400 300)
  • 4. Určete několik barev. Barvy v pygame jsou definovány ve formátu RGBA v rozmezí od 0 do 255. Hodnota alfa (a) může být vynechána, ale zbytek barev (červená, zelená a modrá) je nutná pro plnění.
    Bílá = (255,255,255) černá = (0.0.0) červená = (255.0.0)
  • Pět. Inicializujte hlavní obrazovku. Použijte rozlišovací proměnnou definovanou dříve.
    Obrazovka = pygame.Zobrazit.SET_MODE (rozlišení)
  • 6. Vytvořte cyklus hry. Nastavte opakování určitých akcí v každém rámci hry. Vytvořte cyklus, který bude důsledně provádět všechny tyto akce.
    Zatímco TRUE:
  • 7. Určete barvu výplně obrazovky.
    Obrazovka.Výplň (bílá)
  • osm. Zobrazte obrazovku. Pokud spustíte program v této fázi, obrazovka je namalována s bílým, a pak program zastaví nouze. Příčina selhání bude, že operační systém odešle události programu a program jednoduše nepokračuje. Když program akumuluje příliš mnoho neošetřených událostí, vzniká selhání.
    Zatímco TRUE:...Pygame.Zobrazit.Flip ()
  • devět. Implementovat zpracování událostí. Získejte seznam všech událostí, které vznikly mezi rámečky kreslení. V našem příkladu byste měli obávat zpracování pouze jedné výstupní události (ukončení). To nastane, když uživatel zavře okno hry. Zpracování událostí zabrání selhání programu od vzhledu přílišných událostí.
    Zatímco TRUE:...Pro akci v Pygame.událost.Získejte (): Pokud událost.Typ == Quit: Pygame.Ukončit ()
  • Obrázek s názvem programpygameepart1.jpg
    10. Zkuste program! Nyní by měl programový kód vypadat takto:
    Import pygamefrom pygame.Místní obyvatele Import * Rozlišení = (400 300) Bílý = (255,255,255) Black = (0.0.0) RED = (255,0,0) Obrazovka = pygame.Zobrazit.SET_MODE (rozlišení) Zatímco TRUE: Obrazovka.Vyplnit (bílý) pygame.Zobrazit.Flip () pro událost v pygame.událost.Získejte (): Pokud událost.Typ == Quit: Pygame.Ukončit ()
  • Část 3 z 8:
    Vytváření herních objektů
    jeden. Vytvořte novou třídu objektů a jeho návrháře. Nastavte všechny vlastnosti objektu. Také definujte výchozí hodnoty pro každou z vlastností.
    Třída míč: def __init __ (self, xpos = rozlišení [0] / 2, ypos = rozlišení [1] / 2, xvel = 1, yvel = 1, rad = 15): self.x = xposself.Y = yposself.Dx = xvelself.dy = yvelself.Poloměr = Radself.Typ = "míč"
  • 2. Určete výkres objektu. Použijte vlastnosti objektu uvedené v konstruktoru pro zobrazení míče jako kruh na povrchu přenášené do funkce do funkce. Povrch bude obrazovka, kterou jste vytvořili dříve definováním jeho rozměrů.
    Def remíza (self, povrch): pygame.Kreslit.Kruh (povrch, černá, (já.X, já.y), sebe.POLOMĚR)
  • 3. Vytvořte instanci třídy a přidejte úlohu do herní cyklus, abyste nakreslili míč v každé iteraci cyklu.
    Míč = míč (), zatímco true:...Míč.Remíza (obrazovka)
  • 4. Proveďte pohyb objektu. Vytvořit funkci, která aktualizuje polohu objektu. Zavolejte tuto funkci v každé iteraci cyklu.
    Třída míč:...Def aktualizace (self): self.X + = self.Dxself.Y + = self.Dy
  • Pět. Limit frekvence rámce. Míč se bude pohybovat velmi rychle, protože herní cyklus se opakuje stovky krát za sekundu. Použijte časovač pygame pro omezení frekvence změny rámce na 60 fps.
    • Hodiny = pygame.Čas.Hodiny () Zatímco TRUE:...HODINY.Zaškrtnutí (60)
  • Udržujte misku na obrazovce. Přidání kontroly do funkce aktualizace stavu změnit směr pohybu míče, pokud dosáhne hranic obrazovky.
      Třída míč:...DEF UPDATE (SELF):...Pokud (já.X <= 0 or self.x >= Rozlišení [0]): sebe.DX * = -1IF (já.y <= 0 or self.y >= Rozlišení [1]): sebe.DY * = -1
  • Zkuste program! Nyní by měl programový kód vypadat takto:
    Obrázek s názvem PrograchygamePart2.jpg
      Import pygamefrom pygame.Místní obyvatele Import * Rozlišení = (400 300) Bílý = (255,255,255) Black = (0.0.0) RED = (255,0,0) Obrazovka = pygame.Zobrazit.SET_MODE (rozlišení) Class Ball: DEF __init __ (self, xpos = rozlišení [0] / 2, ypos = rozlišení [1] / 2, xvel = 1, yvel = 1, rad = 15): self.x = xposself.Y = yposself.Dx = xvelself.dy = yvelself.Poloměr = Radself.Typ = "míč" def remíza (self, povrch): pygame.Kreslit.Kruh (povrch, černá, (já.X, já.y), sebe.RADIUS) DEF UPDATE: SELF.X + = self.Dxself.Y + = self.Dyif (já.X <= 0 or self.x >= Rozlišení [0]): sebe.DX * = -1IF (já.Y <= 0 or self.y >= Rozlišení [1]): sebe.dy * = -1ball = míč () hodiny = pygame.Čas.Hodiny () Zatímco True: Obrazovka.Vyplňte (bílý) míč.Draw (Screen) míč.Aktualizace () pygame.Zobrazit.Flip () Hodiny.Zaškrtněte (60) pro událost v pygame.událost.Získejte (): Pokud událost.Typ == Quit: Pygame.Ukončit ()
  • Část 4 z 8:
    Strukturní hry
    jeden. Použijte třídy pro strukturování. V budoucnu se hra stane složitější. Použijte objektově orientované programovací techniky ke strukturním kódům.
  • 2. Převést herní cyklus do třídy. Od chvíle, kdy hra již obsahuje data, včetně herních objektů a funkcí, má smysl nahradit herní cyklus do třídy.
    Class Game ():
  • 3. Přidat návrháře. S ním popíráte několik objektů používaných ve hře, vytvořit obrazovku, časovač a inicializovat pygame. Pygame musí být inicializován za účelem dalšího používání těchto možností jako text nebo zvuku.
    Class Game (): DEF __INIT __ (self): pygame.V SOBĚ.Obrazovka = pygame.Zobrazit.SET_MODE (rozlišení).Hodiny = pygame.Čas.Hodiny ()
  • 4. Nastavte zpracování událostí ve funkci.
    Class Game ():...DEF ŘÍZENÍ (SELF): Pro událost v pygame.událost.Získejte (): Pokud událost.Typ == Quit: Pygame.Ukončit ()
  • Pět. Proveďte herní cyklus s funkcí. Funkce zpracování událostí volání v každé iteraci cyklu.
    Class Game ():...Def běh (self): zatímco true: self.Řízení () self.Obrazovka.Vyplňte (bílé).HODINY.Zaškrtněte (60) pygame.Zobrazit.Flip ()
  • 6. Nastavte zpracování více herních objektů. V této fázi herní kód způsobí aktualizaci a překreslení jednotlivých objektů v každém snímku. S tímto přístupem bude herní kód docela objemný a nepořádný, zejména pokud existuje mnoho objektů ve hře. Je moudřejší nejprve přidat objekty do pole a potom aktualizovat a překreslit všechny objekty v poli v každé iteraci cyklu. Nyní můžete snadno vytvořit nový objekt ve hře a určit další výchozí pozici pro něj.
    Class game (): def __init __ (self):...Já.GameObjects = [] já.GameObjects.APPEND (BALL ()).GameObjects.Přidat (míč (100))...Def běh (self): zatímco true: self.Řízení () pro gameobj v sebe.GameObjects: Gameobj.Aktualizace () self.Obrazovka.Vyplňte (bílý) pro gameobj v sebe.GameObjects: Gameobj.Remíza (já.Obrazovky).HODINY.Zaškrtněte (60) pygame.Zobrazit.Flip ()
  • Obrázek s názvem programpygameepart3.jpg
    7. Zkuste program! Nyní by měl programový kód vypadat takto:
    Import pygamefrom pygame.Místní obyvatele Import * Rozlišení = (400 300) Bílý = (255,255,255) Black = (0.0.0) RED = (255,0,0) Obrazovka = pygame.Zobrazit.SET_MODE (rozlišení) Class Ball: DEF __init __ (self, xpos = rozlišení [0] / 2, ypos = rozlišení [1] / 2, xvel = 1, yvel = 1, rad = 15): self.x = xposself.Y = yposself.Dx = xvelself.dy = yvelself.Poloměr = Radself.Typ = "míč" def remíza (self, povrch): pygame.Kreslit.Kruh (povrch, černá, (já.X, já.y), sebe.RADIUS) DEF UPDATE: SELF.X + = self.Dxself.Y + = self.Dyif (já.X <= 0 or self.x >= Rozlišení [0]): sebe.DX * = -1IF (já.Y <= 0 or self.y >= Rozlišení [1]): sebe.DY * = -1Class game (): def __init __ (self): pygame.V SOBĚ.Obrazovka = pygame.Zobrazit.SET_MODE (rozlišení).Hodiny = pygame.Čas.Hodiny () self.GameObjects = [] já.GameObjects.APPEND (BALL ()).GameObjects.APPEND (BALL (100)) DEF ŘÍZENÍ (SELF): Pro událost v pygame.událost.Získejte (): Pokud událost.Typ == Quit: Pygame.Quit () def běh (self): zatímco true: self.Řízení () pro gameobj v sebe.GameObjects: Gameobj.Aktualizace () self.Obrazovka.Vyplňte (bílý) pro gameobj v sebe.GameObjects: Gameobj.Remíza (já.Obrazovky).HODINY.Zaškrtněte (60) pygame.Zobrazit.Flip () hra ().Běh ()
  • Část 5 z 8:
    Přidání objektu "přehrávače"
    jeden. Vytvořte třídu hráče a jeho návrhářka. Musíte vytvořit další kruh řízený pohybem myši. Inicializujte své parametry v designéra. Jedinou důležitou hodnotou bude poloměr.
    Hráč třídy: DEF __INIT __ (self, rad = 20): sebe.x = 0self.Y = 0self.Poloměr = rad
  • 2. Určete výkres objektu hráče. To je taženo podobně tak, jak byly kresleny další hry.
    Hráč třídy:...Def remíza (self, povrch): pygame.Kreslit.Kruh (povrch, červená, (já.X, já.y), sebe.POLOMĚR)
  • 3. Přidat ovládání myši pro objekt přehrávače. V každém rámci hry musíte zkontrolovat polohu ukazatele myši a vztahovat polohu objektu hráče s tímto bodem.
    Hráč třídy:...DEF UPDATE (SELF): kabel = pygame.Myš.get_pos () self.X = kabel [0] self.Y = kabel [1]
  • 4. Přidejte objekt přehrávače do pole GameObjects. Vytvořte novou instanci objektu a přidejte jej do seznamu GameObjects.
    Class game (): def __init __ (self):...Já.GameObjects.APPEND (Hráč ())
  • Obrázek s názvem programpygameepart4.jpg
    Pět. Zkuste program! Nyní by měl programový kód vypadat takto:
    Import pygamefrom pygame.Místní obyvatele Import * Rozlišení = (400 300) Bílý = (255,255,255) Black = (0.0.0) RED = (255,0,0) Obrazovka = pygame.Zobrazit.SET_MODE (rozlišení) Class Ball: DEF __init __ (self, xpos = rozlišení [0] / 2, ypos = rozlišení [1] / 2, xvel = 1, yvel = 1, rad = 15): self.x = xposself.Y = yposself.Dx = xvelself.dy = yvelself.Poloměr = Radself.Typ = "míč" def remíza (self, povrch): pygame.Kreslit.Kruh (povrch, černá, (já.X, já.y), sebe.RADIUS) DEF UPDATE: SELF.X + = self.Dxself.Y + = self.Dyif (já.X <= 0 or self.x >= Rozlišení [0]): sebe.DX * = -1IF (já.Y <= 0 or self.y >= Rozlišení [1]): sebe.DY * = -1Class Player: DEF __INIT __ (self, rad = 20): sebe.x = 0self.Y = 0self.Poloměr = Radself.Typ = "Hráč" Def Draw (Self, Povrch): Pygame.Kreslit.Kruh (povrch, červená, (já.X, já.y), sebe.RADIUS) DEF UPDATE (SELF): kabel = pygame.Myš.get_pos () self.X = kabel [0] self.Y = Cord [1] Class Game (): DEF __INIT __ (self): pygame.V SOBĚ.Obrazovka = pygame.Zobrazit.SET_MODE (rozlišení).Hodiny = pygame.Čas.Hodiny () self.GameObjects = [] já.GameObjects.Připojit (hráče)).GameObjects.APPEND (BALL ()).GameObjects.APPEND (BALL (100)) DEF ŘÍZENÍ (SELF): Pro událost v pygame.událost.Získejte (): Pokud událost.Typ == Quit: Pygame.Quit () def běh (self): zatímco true: self.Řízení () pro gameobj v sebe.GameObjects: Gameobj.Aktualizace () self.Obrazovka.Vyplňte (bílý) pro gameobj v sebe.GameObjects: Gameobj.Remíza (já.Obrazovky).HODINY.Zaškrtněte (60) pygame.Zobrazit.Flip () hra ().Běh ()
  • Část 6 z 8:
    Vytvoření interakce objektů
    jeden. Změnit funkce Update Update. Chcete-li implementovat interakci objektů, je nutné jim poskytnout přístup k sobě navzájem. Přidejte nový parametr do funkce aktualizace pro přenos dat GameObjects Seznam dat. Parametr musí být přidán do tříd přehrávačů a míčových funkcí. Pokud máte spoustu tříd, dědictví pomůže uložit seznam parametrů stejný.
    Třída míč:...DEF aktualizace (self, gameobjects):...Hráč třídy:...DEF aktualizace (self, gameobjects):
  • 2. Zadejte Hráč kolize kontroly s míčky. Podívejte se na všechny objekty a definujte je mezi nimi, které se týkají kuliček. Poté použijte poloměry objektů a vzorec pro určení vzdálenosti, zkontrolujte, zda se objekty srazily. Zkontrolujte kolize mezi kruhy je snadné. To je hlavní důvod, proč jako příklad v této hře, čísla jiné formy nejsou použity.
    Hráč třídy:...DEF aktualizace (self, gameobjects):...Pro gameobj v gameObjects: jestliže gameobj.Typ == "míč": Pokud (gameobj.X - já.X) ** 2 + (gameobj.Y - já.Y) ** 2 <= (gameObj.radius + self.radius)**2:
  • Obrázek s názvem programpygameepart5.jpg
    3. Nastavte konec hry, když hráč kolize s míčem. V této fázi jednoduše nastavte cestu ven z hry.
    If (gameobj.X - já.X) ** 2 + (gameobj.Y - já.y) ** 2 <= (gameObj.radius + self.radius)**2:pygame.quit()
  • 4. Zkuste program! Nyní by měl programový kód vypadat takto:
    Import pygamefrom pygame.Místní import * Rozlišení = (400, 300) bílá = (255,255,255) Black = (0,0,0,0) RED = (255,0,0,0) Obrazovka = pygame.Zobrazit.SET_MODE (rozlišení) Class Ball: DEF __init __ (self, xpos = rozlišení [0] / 2, ypos = rozlišení [1] / 2, xvel = 1, yvel = 1, rad = 15): self.x = xposself.Y = yposself.Dx = xvelself.dy = yvelself.Poloměr = Radself.Typ = "míč" def remíza (self, povrch): pygame.Kreslit.Kruh (povrch, černá, (já.X, já.y), sebe.RADIUS) DEF aktualizace (self, gameobjects): self.X + = self.Dxself.Y + = self.Dyif (já.X <= 0 or self.x >= Rozlišení [0]): sebe.DX * = -1IF (já.y <= 0 or self.y >= Rozlišení [1]): sebe.DY * = -1Class Player: DEF __INIT __ (self, rad = 20): sebe.x = 0self.Y = 0self.Poloměr = Radself.Typ = "Hráč" Def Draw (Self, Povrch): Pygame.Kreslit.Kruh (povrch, červená, (já.X, já.y), sebe.RADIUS) DEF Update (Self, GameObjects): Cord = Pygame.Myš.get_pos () self.X = kabel [0] self.Y = kabel [1] pro gameobj v gameobjects: jestliže gameobj.Typ == "míč": Pokud (gameobj.X - já.X) ** 2 + (gameobj.Y - já.y) ** 2 <= (gameObj.radius + self.radius)**2:pygame.quit()class game():def __init__(self):pygame.init()self.screen = pygame.display.set_mode(resolution)self.clock = pygame.time.Clock()self.gameObjects = []self.gameObjects.append(Player())self.gameObjects.append(Ball())self.gameObjects.append(Ball(100))def handleEvents(self):for event in pygame.event.get():if event.type == QUIT:pygame.quit()def run(self):while True:self.handleEvents()for gameObj in self.gameObjects:gameObj.update(self.gameObjects)self.screen.fill(white)for gameObj in self.gameObjects:gameObj.draw(self.screen)self.clock.tick(60)pygame.display.flip()game().run()
  • Část 7 z 8:
    Přidání herního ovladače pro vytvoření objektů
    jeden. Vytvořte třídu herní řadiče. Herní řadiče jsou zodpovědní za průběh hry. Shodují se s třídou hry samotnou, která je zodpovědná za výkres a aktualizaci všech herních objektů. Regulátor bude periodicky přidat nový míč na obrazovku a komplikovat hru. Přidejte návrháře a inicializujte některé výchozí hodnoty. Interval bude znamenat dobu, kterými bude přidán nový míč.
    Třída gameController: def __init __ (self, interval = 5): sebe.Inter = intervaly.Další = pygame.Čas.get_ticks () + (2 * 1000) self.Typ = "herní regulátor"
  • 2. Přidat funkci aktualizace. Zkontroluje, kolik času uplynulo, protože přidání předchozí míče nebo od začátku hry. Pokud doba překročí určený interval, časovač bude resetován a byl přidán nový míč.
    Třída GameController:...Def aktualizace (self, gameobjects): Pokud self.další < pygame.time.get_ticks():self.next = pygame.time.get_ticks() + (self.inter * 1000)gameObjects.append(Ball())
  • 3. Instalace náhodných rychlostí pro míče. Chcete-li, aby se hra chová jinak, je nutné jej použít k použití náhodných čísel pro parametr rychlosti. Teď bude rychlost míčů určena plovoucím desetinným číslem, ne celým číslem.
    Třída GameController:...Def aktualizace (self, gameobjects): Pokud self.další < pygame.time.get_ticks():self.next = pygame.time.get_ticks() + (self.inter * 1000)gameObjects.append(Ball(xVel=random()*2, yVel=random()*2))
  • 4. Opravte funkci výkresu. Draw Funkce nefunguje s plovoucími středníky (float). Proto je nutné předtím vyjádřit pozici míče v celých číslech.
    Třída míč:...Def remíza (self, povrch): pygame.Kreslit.Kruh (povrch, černá, (int (já.x), int (já.y)), sebe.POLOMĚR)
  • Pět. Určete způsob výkresu pro herní řadič. Vzhledem k tomu, že se jedná také o herní objekt, v hlavním hernímu cyklu bude pokus o to kreslit. Proto pro regulátor je nutné určit funkci výkresu, která nedělá nic, aby nedošlo k neúspěchu hry.
    Třída GameController:...DEF DRAW (SELF, SCREEN): PASS
  • 6. Přidejte herní řadič v gulebjects a odstraňte 2 míče. Hra musí přidat nový míč každých 5 sekund.
    Class game (): def __init __ (self):...Já.GameObjects = [] já.GameObjects.AppendRoller (GameController ()).GameObjects.APPEND (Hráč ())
  • Obrázek s názvem programpygameepart6.jpg
    7. Zkuste program! Nyní by měl programový kód vypadat takto:
    Import PygameFrom Random Import RandomDrom pygame.Místní obyvatele Import * Rozlišení = (400 300) Bílý = (255,255,255) Black = (0.0.0) RED = (255,0,0) Obrazovka = pygame.Zobrazit.SET_MODE (rozlišení) Class Ball: DEF __init __ (self, xpos = rozlišení [0] / 2, ypos = rozlišení [1] / 2, xvel = 1, yvel = 1, rad = 15): self.x = xposself.Y = yposself.Dx = xvelself.dy = yvelself.Poloměr = Radself.Typ = "míč" def remíza (self, povrch): pygame.Kreslit.Kruh (povrch, černá, (int (já.x), int (já.y)), sebe.RADIUS) DEF aktualizace (self, gameobjects): self.X + = self.Dxself.Y + = self.Dyif (já.X <= 0 or self.x >= Rozlišení [0]): sebe.DX * = -1IF (já.Y <= 0 or self.y >= Rozlišení [1]): sebe.DY * = -1Class Player: DEF __INIT __ (self, rad = 20): sebe.x = 0self.Y = 0self.Poloměr = Radself.Typ = "Hráč" Def Draw (Self, Povrch): Pygame.Kreslit.Kruh (povrch, červená, (já.X, já.y), sebe.RADIUS) DEF Update (Self, GameObjects): Cord = Pygame.Myš.get_pos () self.X = kabel [0] self.Y = kabel [1] pro gameobj v gameobjects: jestliže gameobj.Typ == "míč": Pokud (gameobj.X - já.X) ** 2 + (gameobj.Y - já.Y) ** 2 <= (gameObj.radius + self.radius)**2:pygame.quit()class GameController:def __init__(self, interval = 5):self.inter = intervalself.next = pygame.time.get_ticks() + (2 * 1000)self.type = "game controller"def update(self, gameObjects):if self.next < pygame.time.get_ticks():self.next = pygame.time.get_ticks() + (self.inter * 1000)gameObjects.append(Ball(xVel=random()*2, yVel=random()*2))def draw(self, screen):passclass game():def __init__(self):pygame.init()self.screen = pygame.display.set_mode(resolution)self.clock = pygame.time.Clock()self.gameObjects = []self.gameObjects.append(GameController())self.gameObjects.append(Player())def handleEvents(self):for event in pygame.event.get():if event.type == QUIT:pygame.quit()def run(self):while True:self.handleEvents()for gameObj in self.gameObjects:gameObj.update(self.gameObjects)self.screen.fill(white)for gameObj in self.gameObjects:gameObj.draw(self.screen)self.clock.tick(60)pygame.display.flip()game().run()
  • Část 8 z 8:
    Přidání účtu a dokončení hry
    jeden. Přidat účet do třídy herní řadiče. Vytvořte objekt třídy písma a proměnnou skóre. Objekt písma musí být nakreslen v každém snímku pro zobrazení běžného účtu a zvyšuje jej v každém snímku při aktualizaci.
    Class GameController: DEF __INIT __ (self, interval = 5):...Já.Skóre = 0self.Scoretext = pygame.písmo.Písmo (Žádný, 12) DEF aktualizace (self, gameobjects):...Já.Skóre + = 1def Draw (self, obrazovka): Obrazovka.Blit (já.Scoretext.Činí (str (já).Skóre), pravdivé, černé), (5,5))
  • 2. Změňte proces dokončení hry. Odstranit jednoduchou cestu ven z hry, když hráč kolize s míčem. Místo toho vytvořte proměnnou ve třídě přehrávače, která bude kontrolována hraním. Když se proměnná gameoveover stane pravdou, musíte zastavit aktualizaci objektů. Všechny objekty jsou zamrzlé místo, takže hráč bude schopen pochopit, co se stalo, a uvidí jeho účet. Objekty budou stále zobrazeny na obrazovce, ale jednoduše přestanou aktualizovat.
    Hráč třídy: DEF __INIT __ (self, rad = 20):...Já.Gameover = Falsedef aktualizace (self, gameobjects):...Pro gameobj v gameObjects: jestliže gameobj.Typ == "míč": Pokud (gameobj.X - já.X) ** 2 + (gameobj.Y - já.y) ** 2 <= (gameObj.radius + self.radius)**2:self.gameOver = Trueclass game():def __init__(self):...self.gameOver = Falsedef run(self):while True:self.handleEvents()if not self.gameOver:for gameObj in self.gameObjects:gameObj.update(self.gameObjects)if gameObj.type == "player":self.gameOver = gameObj.gameOver
  • Obrázek s názvem programpygamefinal.jpg
    3. Zkuste program! Závěrečný kód programu by měl vypadat takto:
    Import PygameFrom Random Import RandomDrom pygame.Místní obyvatele Import * Rozlišení = (400 300) Bílý = (255,255,255) Black = (0.0.0) RED = (255,0,0) Obrazovka = pygame.Zobrazit.SET_MODE (rozlišení) Class Ball: DEF __init __ (self, xpos = rozlišení [0] / 2, ypos = rozlišení [1] / 2, xvel = 1, yvel = 1, rad = 15): self.x = xposself.Y = yposself.Dx = xvelself.dy = yvelself.Poloměr = Radself.Typ = "míč" def remíza (self, povrch): pygame.Kreslit.Kruh (povrch, černá, (int (já.x), int (já.y)), sebe.RADIUS) DEF aktualizace (self, gameobjects): self.X + = self.Dxself.Y + = self.Dyif (já.X <= 0 or self.x >= Rozlišení [0]): sebe.DX * = -1IF (já.y <= 0 or self.y >= Rozlišení [1]): sebe.DY * = -1Class Player: DEF __INIT __ (self, rad = 20): sebe.x = 0self.Y = 0self.Poloměr = Radself.Typ = "hráč".Gameover = Falsedef Draw (self, povrch): pygame.Kreslit.Kruh (povrch, červená, (já.X, já.y), sebe.RADIUS) DEF Update (Self, GameObjects): Cord = Pygame.Myš.get_pos () self.X = kabel [0] self.Y = kabel [1] pro gameobj v gameobjects: jestliže gameobj.Typ == "míč": Pokud (gameobj.X - já.X) ** 2 + (gameobj.Y - já.y) ** 2 <= (gameObj.radius + self.radius)**2:self.gameOver = Trueclass GameController:def __init__(self, interval = 5):self.inter = intervalself.next = pygame.time.get_ticks() + (2 * 1000)self.type = "game controller"self.score = 0self.scoreText = pygame.font.Font(None, 12)def update(self, gameObjects):if self.next < pygame.time.get_ticks():self.next = pygame.time.get_ticks() + (self.inter * 1000)gameObjects.append(Ball(xVel=random()*2, yVel=random()*2))self.score += 1def draw(self, screen):screen.blit(self.scoreText.render(str(self.score), True, black), (5,5))class game():def __init__(self):pygame.init()self.screen = pygame.display.set_mode(resolution)self.clock = pygame.time.Clock()self.gameObjects = []self.gameObjects.append(GameController())self.gameObjects.append(Player())self.gameOver = Falsedef handleEvents(self):for event in pygame.event.get():if event.type == QUIT:pygame.quit()def run(self):while True:self.handleEvents()if not self.gameOver:for gameObj in self.gameObjects:gameObj.update(self.gameObjects)if gameObj.type == "player":self.gameOver = gameObj.gameOverself.screen.fill(white)for gameObj in self.gameObjects:gameObj.draw(self.screen)self.clock.tick(60)pygame.display.flip()game().run()
  • Podobné publikace