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.
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
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)
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)
Pygame kan tegne noe. De pygame.draw
Modulen har funksjoner for å tegne følgende former:
I Breakout er alle objekter (unntatt teksten) bare figurer. La oss se på draw () -metoden til de forskjellige Breakout-objektene.
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)
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)
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)
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.