Jocuri de construcție cu Python 3 și Pygame Partea 2

Prezentare generală

Aceasta este o parte a unei serii de tutoriale cu cinci părți despre realizarea de jocuri cu Python 3 și Pygame. În prima parte, am introdus seriile, am acoperit programele de bază, am introdus Pygame și am examinat arhitectura jocurilor. 

În această parte, ne vom uita la TextObject clasa folosită pentru a face text pe ecran. Vom crea fereastra principală, inclusiv o imagine de fundal, și apoi vom învăța cum să atragă obiecte precum cărămizi, minge și lopată. 

Clasa TextObject

TextObject clasa este proiectat pentru a afișa text pe ecran. Cazul ar putea fi făcut din punct de vedere al designului că ar trebui să fie o subclasă de GameObject deoarece este și un obiect vizual și poate doriți să îl mutați. Dar nu am vrut să introduc ierarhii de clasă profunde, atunci când tot textul pe care ecranul Breakout afișează pe ecran rămâne pus. 

TextObject creează un obiect de font. Ea face textul într-o suprafață separată a textului care este apoi împrăștiată (reprodusă) pe suprafața principală. Un aspect interesant al TextObject este că nu are text fixat. În schimb, devine o funcție numită text_func () care este numit de fiecare dată când face. 

Acest lucru ne permite să actualizăm afișarea vieții și a punctajului în Breakout doar prin furnizarea unei funcții care returnează viața curentă și scorul actual, în loc să ținem evidența obiectelor text care afișează vieți și scor și actualizând textul lor de fiecare dată când se schimbă. Acesta este un truc elegant de la programarea funcțională, iar pentru jocurile mai mari vă poate ajuta să păstrați totul frumos și ordonat. 

importă clasa pygame TextObject: def __init __ (auto, x, y, text_func, culoare, font_name, font_size): self.pos = (x, y) auto.text_func = text_func self.color = culoare self.font = pygame.font. SysFont (font_name, font_size) auto.bounds = auto.get_surface (text_func ()) def draw (auto, suprafață, centralizat = False): text_surface, self.bounds = \ self.get_surface (self.text_func pos = (self.pos [0] - self.bounds.width // 2, self.pos [1]) alt: pos = self.pos surface.blit (text_surface, pos) def get_surface (auto, text): text_surface = auto.font.render (text, False, auto.color) retur text_surface, text_surface.get_rect () def actualizare (auto): trece

Crearea ferestrei principale

Jocurile Pygame rulează în ferestre. Le puteți face să ruleze și pe ecran complet. Iată cum afișați o fereastră goală Pygame. Puteți vedea deja multe dintre elementele pe care le-am discutat mai devreme. În primul rând, Pygame init () este apelat, iar apoi se creează suprafața principală de desen și ceasul. 

Următorul este buclă principală, care umple în mod consistent ecranul cu un gri uniform și sună ceasul tick () cu rata cadrelor.

importul pygame pygame.init () screen = pygame.display.set_mode ((800, 600)) clock = pygame.time.Clock () în timp ce True: screen.fill ((192, 192, 192)) pygame.display.update () clock.tick (60)

Utilizarea unei imagini de fundal

De obicei, un fundal uniform de culoare nu este foarte interesant. Pygame face foarte bine imaginile. Pentru Breakout, am scuipat și am plecat pentru o imagine fantastică a spațiului real de la NASA. Codul este foarte asemănător. Mai întâi, chiar înaintea bucla principală, se încarcă imaginea de fundal utilizând pygame.image.load () funcţie. Apoi, în loc să umpleți ecranul cu culori, acesta "blits" (copiați biți) imaginea pe ecran în poziție (0,0). Efectul este că imaginea este afișată pe ecran.

import pygame pygame.init () screen = pygame.display.set_mode ((800, 600)) ceas = pygame.time.Clock () background_image = pygame.image.load ('images / background.jpg' .blit (background_image, (0, 0)) Pygame.display.update () clock.tick (60)

Forme de desen

Pygame poate trage orice. pygame.draw modulul are funcții pentru desenarea următoarelor forme:

  • RECT 
  • poligon
  • cerc
  • elipsă
  • arc
  • linia
  • linii
  • linia anti-aliată 
  • linii anti-aliate

În Breakout, toate obiectele (cu excepția textului) sunt doar forme. Să analizăm metoda draw () a diferitelor obiecte Breakout.

Desenarea cărămizilor

Caramizile sunt cărămizi. Ele sunt doar dreptunghiuri. Pygame oferă pygame.draw.rect () care are o suprafață, o culoare și un obiect Rect (stânga, vârful, lățimea și înălțimea) și face un dreptunghi. Dacă parametrul lățime opțional este mai mare decât zero, acesta desenează conturul. Dacă lățimea este zero (care este cea implicită), ea desenează un dreptunghi solid.

Rețineți că Cărămidă clasa este o subclasă de GameObject și are toate proprietățile sale, dar are și o culoare pe care o administrează ea însăși (pentru că pot exista obiecte de joc care nu au o singură culoare). Ignorați efect special pentru moment.

importă pygame de la importul game_object GameObject clasa Caramida (GameObject): def __init __ (auto, x, y, w, h, culoare, special_effect = Nici unul): GameObject .__ init __ self, color self.special_effect = defecțiune specială draw (auto, suprafață): pygame.draw.rect (suprafață, self.color, self.bounds)

Desenarea mingii

Mingea în Breakout este doar un cerc. Pygame oferă pygame.draw.circle () care are culoarea, centrul, raza și parametrul lățimii opțiunilor, care este setat la zero. Ca și în cazul pygame.draw.rect () funcția, în cazul în care lățimea este zero, atunci este tras un cerc solid. Mingea este, de asemenea, o clasă derivată din GameObject. 

Deoarece mingea se mișcă întotdeauna (spre deosebire de cărămizi), are și o viteză care este trecută pe GameObject clasa de bază să fie gestionată. Clasa Ball are un mic răsucire, deoarece parametrii x și y denotă centrul său, în timp ce parametrii x și y au trecut la GameObject clasa de bază sunt colțul din stânga sus al casetei delimitate. Pentru a converti de la centru la colțul din stânga sus, este nevoie doar de scăderea razei. 

Pictogramă de import de la game_object Import GameObject Clasa Ball (GameObject): def __init __ (auto, x, y, r, culoare, viteză): GameObject .__ init __ (auto, x - r, y - viteză) self.radius = r self.diameter = r * 2 self.color = desenul culorii (auto, suprafață): pygame.draw.circle (suprafață, auto.color, auto.center, auto.radius)

Desenarea paletei

Paleta este încă un dreptunghi care se mișcă într-adevăr la stânga și la dreapta ca răspuns la apăsarea tastelor săgeți de către jucător. Aceasta înseamnă că poziția paletei se poate schimba de la un cadru la altul, dar în ceea ce privește desenul, este vorba doar de un dreptunghi care trebuie redat la poziția actuală, oricare ar fi acesta. Aici este codul relevant:

importă configurația de import a lui pygame ca și c de la game_object import GameObject clasa Paddle (GameObject): def __init __ (auto, x, y, w, h, culoare, offset): GameObject .__ init __ (auto, x, y, w). color = culoare self.offset = offset self.moving_left = False self.moving_right = False def draw (auto, suprafață): pygame.draw.rect (suprafață, self.color, self.bounds)

Concluzie

În această parte, ați învățat despre clasa TextObject și despre modul de redare a textului pe ecran. De asemenea, te-ai familiarizat cu obiecte de desen cum ar fi cărămizi, minge și cu zbaturi.

Între timp, rețineți că avem o mulțime de conținut Python disponibil pentru vânzare și pentru studiu pe piața Envato.

În partea a treia, veți vedea cum funcționează gestionarea evenimentelor și modul în care Pygame vă permite să interceptați și să reacționați la evenimente precum apăsările de taste, mișcarea mouse-ului și clicurile de mouse. Apoi, vom acoperi subiecte de joc cum ar fi mutarea mingii, stabilirea vitezei mingii și mutarea paletei.  


Cod