Bygg spill med Python 3 og Pygame Del 2

Oversikt

Dette er del to av en femdelers serie av opplæringsprogrammer om å lage spill med Python 3 og Pygame. I første del presenterte jeg serien, dekket grunnleggende om spillprogrammering, introduserte Pygame, og undersøkte spillarkitekturen. 

I denne delen ser vi på TextObject Klassen brukes til å gjengi tekst på skjermen. Vi lager hovedvinduet, inkludert et bakgrunnsbilde, og så lærer vi hvordan vi tegner gjenstander som murstein, ball og padle. 

TextObject-klassen

De TextObject klassen er laget for å vise tekst på skjermen. Saken kan gjøres ut fra et designsynspunkt at det skal være en underklasse av GameObject som det er også et visuelt objekt, og du vil kanskje flytte den. Men jeg ville ikke introdusere dype klassehierarkier, når all teksten som Breakout viser på skjermen forblir satt. 

De TextObject lager et skriftobjekt. Det gjør teksten til en egen tekstoverflate som deretter blits (gjengis) på hovedflaten. Et interessant aspekt av TextObject er at den ikke har noen fast tekst. I stedet blir det en funksjon som kalles text_func () det kalles hver gang det gjøres. 

Dette gjør at vi kan oppdatere visning av liv og score i Breakout bare ved å gi en funksjon som returnerer dagens liv og nåværende poengsum, i stedet for å holde oversikt over hvilke tekstobjekter som viser liv og score og oppdatere teksten hver gang de endres. Dette er et pent trick fra funksjonell programmering, og for større spill kan det hjelpe deg med å holde alt fint og ryddig. 

importer pygame klasse TextObject: def __init __ (selv, x, y, text_func, farge, font_name, font_size): self.pos = (x, y) self.text_func = text_func self.color = color self.font = pygame.font. SysFont (font_name, font_size) self.bounds = self.get_surface (text_func ()) def tegne (selv, overflate, sentralisert = False): text_surface, self.bounds = \ self.get_surface (self.text_func ()) hvis sentralisert: pos = (self.pos [0] - self.bounds.width // 2, self.pos [1]) annet: pos = self.pos surface.blit (text_surface, pos) def get_surface (selv tekst): text_surface = self.font.render (tekst, False, self.color) returnere text_surface, text_surface.get_rect () def oppdatering (selv): pass

Opprette hovedvinduet

Pygame spill kjører i vinduer. Du kan få dem til å kjøre fullskjerm også. Slik viser du et tomt Pygame-vindu. Du kan allerede se mange av elementene jeg diskuterte tidligere. Først, Pygame i det() kalles, og deretter blir hovedtrekkflaten og klokken opprettet. 

Neste er hovedløkken, som konsekvent fyller skjermen med ensartet grå og kaller klokken sett kryss() metode med rammefrekvensen.

importer pygame pygame.init () skjerm = pygame.display.set_mode ((800, 600)) klokke = pygame.time.Clock () mens True: screen.fill ((192, 192, 192)) pygame.display.update () clock.tick (60)

Bruke et bakgrunnsbilde

Vanligvis er en jevn farge bakgrunn ikke veldig spennende. Pygame gjør bildene veldig bra. For Breakout splittet jeg og gikk for et fancy ekte plassbilde fra NASA. Koden er veldig lik. Først, like før hovedløkken, laster det bakgrunnsbildet ved hjelp av pygame.image.load () funksjon. Deretter, i stedet for å fylle skjermen med farge, "blits" (kopier bitene) bildet til skjermen i posisjon (0,0). Effekten er at bildet vises på skjermen.

importer pygame pygame.init () screen = pygame.display.set_mode ((800, 600)) klokke = pygame.time.Clock () background_image = pygame.image.load ('images / background.jpg') mens True: skjerm .blit (background_image, (0, 0)) pygame.display.update () clock.tick (60)

Tegningsformer

Pygame kan tegne noe. De pygame.draw Modulen har funksjoner for å tegne følgende former:

  • rect 
  • polygon
  • sirkel
  • ellipse
  • bue
  • linje
  • linjer
  • anti-aliased linje 
  • anti-aliased linjer

I Breakout er alle objekter (unntatt teksten) bare figurer. La oss se på draw () -metoden til de forskjellige Breakout-objektene.

Tegningstein

Teglstein er murstein. De er bare rektangler. Pygame gir pygame.draw.rect () funksjon, som tar en overflate, en farge og en Rect-gjenstand (venstre, topp, bredde og høyde) og gjør et rektangel. Hvis den valgfrie breddeparameteren er større enn null, tegner den omrisset. Hvis bredden er null (som er standard), tegner det et solidt rektangel.

Legg merke til at Murstein klassen er en underklasse av GameObject og får alle sine egenskaper, men det har også en farge det klarer seg selv (fordi det kan være spillobjekter som ikke har en enkelt farge). Ignorer spesialeffekt feltet for nå.

importere pygame fra game_object import GameObject klasse Brick (GameObject): def __init __ (selv, x, y, w, h, farge, special_effect = Ingen): GameObject .__ init __ (selv, x, y, w, h) self.color = farge self.special_effect = special_effect def draw (selv, overflate): pygame.draw.rect (overflate, selv.farger, selvforbindelser)

Tegne ballen

Ballen i Breakout er bare en sirkel. Pygame gir pygame.draw.circle () funksjon som tar farge-, senter-, radius- og alternativbreddeparameteren som er standard til null. Som med pygame.draw.rect () funksjon, hvis bredden er null, trekkes en solid sirkel. The Ball er også en avledet klasse av GameObject. 

Siden ballen alltid beveger seg (i motsetning til mursteinene), har den også en hastighet som er passert på GameObject grunnklassen som skal administreres. Ballklassen har en liten vridning fordi dets x og y parametere angir senteret, mens x og y parametrene passerer til GameObject Grunnklassen er det øverste venstre hjørnet av grenseboksen. For å konvertere fra sentrum til øverste venstre hjørne, er alt som trengs, subtraherende radius. 

importere pygame fra game_object import GameObject klasse Ball (GameObject): def __init __ (selv, x, y, r, farge, hastighet): GameObject .__ init __ (selv, x - r, y - r, r * 2, r * 2, hastighet) self.radius = r self.diameter = r * 2 self.color = farge def draw (selv, overflate): pygame.draw.circle (overflate, self.color, self.center, self.radius)

Tegne Padle

Padlen er enda et rektangel som faktisk beveger seg til venstre og høyre som svar på at spilleren trykker piltastene. Det betyr at posisjonen til padlen kan forandres fra en ramme til den neste, men når det gjelder tegning, er det bare et rektangel som må gjengis i gjeldende posisjon, uansett hva det er. Her er den aktuelle koden:

import pygame import config som c fra game_object import GameObject klassen Paddle (GameObject): def __init __ (selv, x, y, w, h, farge, offset): GameObject .__ init __ (selv, x, y, w, h) selv. farge = farge self.offset = offset self.moving_left = False self.moving_right = False def trekke (selv, overflate): pygame.draw.rect (overflate, self.color, self.bounds)

Konklusjon

I denne delen har du lært om TextObject-klassen og hvordan du gjengir tekst på skjermen. Du har også blitt kjent med å tegne gjenstander som murstein, ball og padle.

I mellomtiden, husk at vi har masse Python-innhold tilgjengelig for salg og for studier i Envato Market.

I del tre ser du hvordan hendelseshåndtering fungerer, og hvordan Pygame lar deg fange opp og reagere på hendelser som nøkkelpresser, musebevegelser og museklikk. Da vil vi dekke gameplayemner som å flytte ballen, sette ballens fart og flytte padle.