Costruire giochi con Python 3 e Pygame parte 2

Panoramica

Questa è la seconda parte di una serie di tutorial in cinque parti su come creare giochi con Python 3 e Pygame. Nella prima parte, ho introdotto la serie, coperto le basi della programmazione del gioco, introdotto Pygame ed esaminato l'architettura del gioco. 

In questa parte, guarderemo il TextObject classe utilizzata per il rendering del testo sullo schermo. Creeremo la finestra principale, inclusa un'immagine di sfondo, e poi impareremo come disegnare oggetti come mattoni, la palla e la pagaia. 

La classe TextObject

Il TextObject classe è progettata per visualizzare il testo sullo schermo. Il caso potrebbe essere fatto dal punto di vista del design che dovrebbe essere una sottoclasse di GameObject in quanto è anche un oggetto visivo e potresti volerlo spostare. Ma non volevo introdurre gerarchie di classi profonde, quando tutto il testo visualizzato da Breakout sullo schermo rimane inserito. 

Il TextObject crea un oggetto font. Trasforma il testo in una superficie di testo separata che viene poi fusa (renderizzata) sulla superficie principale. Un aspetto interessante del TextObject è che non ha alcun testo fisso. Invece, ottiene una funzione chiamata text_func () viene chiamato ogni volta che rende. 

Questo ci consente di aggiornare la visualizzazione di vite e punteggi in Breakout solo fornendo una funzione che restituisce le vite attuali e il punteggio corrente, invece di tenere traccia di quali oggetti di testo visualizzano vite e punteggi e aggiornano il loro testo ogni volta che cambiano. Questo è un trucco perfetto della programmazione funzionale, e per i giochi più grandi può aiutarti a mantenere tutto in ordine e in ordine. 

import pygame class TextObject: def __init __ (self, x, y, text_func, color, 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 draw (self, surface, centralized = False): text_surface, self.bounds = \ self.get_surface (self.text_func ()) se centralizzato: pos = (self.pos [0] - self.bounds.width // 2, self.pos [1]) else: pos = self.pos surface.blit (text_surface, pos) def get_surface (self, text): text_surface = self.font.render (text, False, self.color) restituisce text_surface, text_surface.get_rect () def update (self): pass

Creazione della finestra principale

I giochi Pygame funzionano in Windows. Puoi anche farli funzionare a schermo intero. Ecco come viene visualizzata una finestra Pygame vuota. Puoi già vedere molti degli elementi che ho discusso in precedenza. In primo luogo, Pygame dentro() viene chiamato, quindi vengono create la superficie di disegno principale e l'orologio. 

Il prossimo è il ciclo principale, che riempie costantemente lo schermo con un grigio uniforme e chiama l'orologio tick () metodo con il frame rate.

import pygame pygame.init () screen = pygame.display.set_mode ((800, 600)) clock = pygame.time.Clock () mentre True: screen.fill ((192, 192, 192)) pygame.display.update () clock.tick (60)

Utilizzando un'immagine di sfondo

Di solito, uno sfondo a colori uniforme non è molto eccitante. Pygame fa molto bene le immagini. Per Breakout, ho fatto una pazzia e sono andato a cercare un'immagine spaziale reale dalla NASA. Il codice è molto simile. Innanzitutto, appena prima del ciclo principale, carica l'immagine di sfondo usando il pygame.image.load () funzione. Quindi, invece di riempire lo schermo con il colore, "blits" (copia i bit) l'immagine sullo schermo in posizione (0,0). L'effetto è che l'immagine viene visualizzata sullo schermo.

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

Forme di disegno

Pygame può disegnare qualsiasi cosa. Il pygame.draw il modulo ha funzioni per disegnare le seguenti forme:

  • rect 
  • poligono
  • cerchio
  • ellisse
  • arco
  • linea
  • Linee
  • linea anti-alias 
  • linee anti-alias

In Breakout, tutti gli oggetti (tranne il testo) sono solo forme. Diamo un'occhiata al metodo draw () dei vari oggetti di Breakout.

Disegno di mattoni

I mattoni sono mattoni. Sono solo rettangoli. Pygame fornisce il pygame.draw.rect () funzione, che prende una superficie, un colore e un oggetto Rect (a sinistra, in alto, in larghezza e in altezza) e esegue il rendering di un rettangolo. Se il parametro width facoltativo è maggiore di zero, disegna il contorno. Se la larghezza è zero (che è il valore predefinito), disegna un rettangolo solido.

Si noti che il mattone la classe è una sottoclasse di GameObject e ottiene tutte le sue proprietà, ma ha anche un colore che gestisce da sé (perché potrebbero esserci oggetti di gioco che non hanno un solo colore). Ignora il effetto speciale campo per ora.

import pygame da game_object import GameObject class Brick (GameObject): def __init __ (auto, x, y, w, h, colore, special_effect = Nessuno): GameObject .__ init __ (self, x, y, w, h) self.color = color self.special_effect = special_effect def draw (auto, superficie): pygame.draw.rect (surface, self.color, self.bounds)

Disegnare la palla

La palla in Breakout è solo un cerchio. Pygame fornisce il pygame.draw.circle () funzione che prende il colore, il centro, il raggio e il parametro della larghezza delle opzioni che si imposta automaticamente su zero. Come con il pygame.draw.rect () funzione, se la larghezza è zero, viene disegnato un cerchio solido. The Ball è anche una classe derivata di GameObject. 

Poiché la palla è sempre in movimento (a differenza dei mattoni), ha anche una velocità che viene trasmessa sul GameObject classe base da gestire. La classe Ball ha un po 'di torsione perché i suoi parametri xey indicano il suo centro, mentre i parametri xey passati al GameObject la classe base è l'angolo in alto a sinistra del riquadro di delimitazione. Per convertire dal centro all'angolo in alto a sinistra, basta sottrarre il raggio. 

import pygame da game_object import GameObject class Ball (GameObject): def __init __ (self, x, y, r, color, speed): GameObject .__ init __ (self, x - r, y - r, r * 2, r * 2, velocità) self.radius = r self.diameter = r * 2 self.color = color def draw (auto, superficie): pygame.draw.circle (surface, self.color, self.center, self.radius)

Disegnare la pagaia

La pagaia è ancora un altro rettangolo che si sta effettivamente spostando a destra e sinistra in risposta al giocatore che preme i tasti freccia. Ciò significa che la posizione della paletta può cambiare da un fotogramma all'altro, ma per quanto riguarda il disegno, è solo un rettangolo che deve essere reso nella posizione corrente, qualunque esso sia. Ecco il codice rilevante:

import pygame import config as c from game_object import GameObject class Paddle (GameObject): def __init __ (auto, x, y, w, h, colore, offset): GameObject .__ init __ (self, x, y, w, h) self. color = color self.offset = offset self.moving_left = False self.moving_right = False def draw (self, surface): pygame.draw.rect (surface, self.color, self.bounds)

Conclusione

In questa parte, hai imparato a conoscere la classe TextObject e come eseguire il rendering del testo sullo schermo. Hai anche imparato a disegnare oggetti come mattoni, la palla e la pagaia.

Nel frattempo, ricorda che abbiamo un sacco di contenuti Python disponibili per la vendita e per lo studio nel mercato Envato.

Nella terza parte, vedrai come funziona la gestione degli eventi e come Pygame ti permette di intercettare e reagire a eventi come pressioni dei tasti, movimenti del mouse e clic del mouse. Quindi, tratteremo argomenti di gameplay come spostare la palla, impostare la velocità della palla e spostare la paletta.