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

Prezentare generală

Aceasta este o parte a unei serii de teste de cinci părți despre realizarea de jocuri cu Python 3 și Pygame. În partea a doua, am acoperit TextObject clasa folosită pentru a face text pe ecran, a creat fereastra principală și a învățat cum să atragă obiecte precum cărămizi, minge și paleta. 

În această parte, ne vom arunca în inima Breakout și vom învăța cum să ne ocupăm de evenimente, să întâlnim clasa principală Breakout și să vedem cum să mutăm diferitele obiecte de joc.

Manipularea evenimentelor

În Breakout, există trei tipuri de evenimente: evenimente de presă cheie, evenimente de mouse și evenimente de timer. Bucla principală din clasa de joc are grijă de evenimentele cheie ale presei și ale mouse-ului și le oferă abonaților (prin apelarea unei funcții de handler). 

În timp ce clasa de joc este foarte generică și nu are cunoștințe specifice Breakout, abonamentul în sine și modul de gestionare a fiecărui eveniment sunt foarte specifice.

Clasa Breakout

Clasa Breakout este cea în care majoritatea cunoștințelor despre jocul Breakout sunt gestionate. Vom întâlni clasa Breakout de mai multe ori în această serie. Iată liniile care înregistrează diferiți agenți de procesare a evenimentelor. 

Rețineți că toate evenimentele cheie pentru tastele săgeată stânga și dreapta vor merge la aceeași metodă de manipulare a paletei.

# Înregistrați metoda handle_mouse_event () a unui obiect de buton self.mouse_handlers.append (b.handle_mouse_event) # Înregistrați metoda handle () a paletei pentru a gestiona evenimentele cheie self.keydown_handlers [pygame.K_LEFT] .append (paddle.handle) auto.keyup_handlers [pygame.K_RIGHT] .append (paddle.handle) auto.keyup_handlers [pygame.K_LEFT] .append (paddle.handle) auto.keyup_handlers [pygame.K_RIGHT] .append (paddle.handle)

Manipularea tastelor de presare

Clasa de jocuri va apela utilizatorii înregistrați pentru fiecare eveniment cheie și va trece cheia. Rețineți că nu este clasa Paddle. În Breakout, singurul obiect care este interesat de aceste evenimente este paleta. Atunci când o tastă este apăsată sau eliberată, ea mâner() se numește metoda. 

Paddle-ul nu are nevoie să știe dacă a fost un eveniment key-down sau key-up deoarece gestionează starea curentă printr-o pereche de variabile booleene: moving_left și moving_right. Dacă moving_left este adevărată atunci înseamnă că tasta săgeată stânga este apăsată și următorul eveniment va fi cheie, care îl va elibera. Același lucru este valabil și pentru tasta săgeată dreapta. Logica este la fel de simplă ca și schimbarea acestor variabile ca răspuns la orice eveniment. 

 def mâner (auto, cheie): if key == pygame.K_LEFT: self.moving_left = nu auto.moving_left altceva: self.moving_right = nu self.moving_right

Manipularea evenimentelor mouse-ului

Breakout are un meniu de joc pe care îl veți întâlni în curând. Butonul din meniu se ocupă de diverse evenimente ale mouse-ului, cum ar fi mișcarea și clicurile (mouse-ul în jos și mouse-up evenimente). Ca răspuns la aceste evenimente, butonul actualizează o variabilă de stare internă. Aici este codul de manipulare a mouse-ului:

 def handle_mouse_event (auto, tip, pos): if type == pygame.MOUSEMOTION: self.handle_mouse_move (pos) elif tip == pygame.MOUSEBUTTONDOWN: self.handle_mouse_down (pos) elif type == pygame.MOUSEBUTTONUP: self.handle_mouse_up pos) defect handle_mouse_move (auto, pos): if self.bounds.collidepoint (pos): if self.state! = 'presat': self.state = 'hover' else: self.state = 'normal' def handle_mouse_down , pos): dacă auto.bounds.collidepoint (pos): self.state = 'presat' def handle_mouse_up (self, pos): if self.state == 'presed': self.on_click (self) planare'

Rețineți că handle_mouse_event () metoda care este înregistrată pentru a primi evenimentele mouse-ului verifică tipul evenimentului și îl transmite către metoda specifică care gestionează tipul de eveniment.

Manipularea evenimentelor temporizate

Evenimentele temporizatorului nu sunt procesate prin bucla principală. Cu toate acestea, din moment ce bucla principală se numește fiecare cadru, este ușor să verificați dacă un anumit eveniment este temporizat. Veți vedea un exemplu de acest lucru mai târziu atunci când discuta efecte speciale temporizate. 

O altă situație este atunci când dorim să înghețăm jocul - de exemplu, atunci când afișăm un mesaj pe care jucătorul ar trebui să îl poată citi fără distragere. show_message () metoda din clasa Breakout folosește această abordare și apeluri time.sleep (). Aici este codul relevant:

Configurarea importului ca clasa c Breakout (joc): def show_message (auto, text, culoare = culori.WHITE, font_name = "Arial", font_size = 20, centralizat = False): message = TextObject (c.screen_width // 2, c .screen_height // 2, lambda: text, culoare, font_name, font_size) auto.draw () message.draw (auto.surf, centralizat) pygame.display.update () time.sleep (c.message_duration)

Modul de joc

Partea de joc este locul în care rulează regulile Breakout (vezi ce am făcut acolo?). Gameplay-ul este despre mutarea diferitelor obiecte ca răspuns la evenimente și schimbarea stării jocului pe baza interacțiunilor lor.

Mutarea pâlniei

Ați văzut mai devreme că clasa Paddle răspunde la tastele săgeată prin actualizarea sa moving_left și moving_right câmpuri. Mișcarea reală se întâmplă în Actualizați() metodă. Există unele calcule care se întâmplă aici, dacă paleta este aproape de marginea din stânga sau din dreapta ecranului. Nu vrem ca banda sa se deplaseze dincolo de marginea ecranului (inclusiv un offset predefinit). 

Deci, dacă mișcarea ar fi luat-o dincolo de margine, codul ajustează mișcarea pentru a se opri exact la margine. Deoarece paleta se mișcă numai orizontal, componenta verticală a mișcării este întotdeauna zero. 

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 update (auto): dacă self.moving_left: dx = - (min.self.offset, self.left)) elif self.moving_right: dx = min (auto.offset, c.screen_width - self.right) altfel: return self.move (dx, 0)

Mutarea bilei

Bilele folosesc doar funcționalitatea GameObject clasa de bază, care mută obiectele jocului pe baza vitezei lor (cu componente orizontale și verticale). Viteza mingii este determinată de mulți factori din clasa Breakout pe care veți vedea în curând. Deoarece deplasarea doar adaugă viteza la poziția curentă, direcția în care se mișcă mingea este determinată de viteza sa de-a lungul axelor orizontale și verticale.

Setarea vitezei inițiale a mingii

Mingea în Breakout apare de nicăieri la începutul jocului de fiecare dată când jucătorul își pierde o viață. Se materializează doar din eter și începe să cadă fie direct în jos, fie sub un unghi ușor. Când mingea este creată în create_ball () , primește o viteză cu o componentă orizontală aleatorie între -2 și 2 și o componentă verticală, determinată în modulul config.py (setat în prezent la 3). 

 Definiți: create_ball (self): speed = (random.randint (-2, 2), c.ball_speed) self.ball = Ball (c.screen_width // 2, c.screen_height // 2, c.ball_radius, c.ball_color , viteză) self.objects.append (self.ball)

Concluzie

În această parte am abordat manevrarea evenimentelor, cum ar fi presele de taste, mișcarea mouse-ului și clicurile de mouse. De asemenea, am invadat în unele dintre elementele de joc ale Breakout, cum ar fi mutarea paletei, mutarea mingii și controlul vitezei mingii. 

Amintiți-vă, de asemenea, să vedeți ce avem la dispoziție pentru vânzare și pentru a studia în piața Envato dacă căutați să studiați mai multe materiale legate de Python.

În partea a patra, vom aborda subiectul important al detectării coliziunilor și vom vedea ce se întâmplă atunci când mingea lovește diferite obiecte de joc cum ar fi paleta, cărămizile și chiar pereții, tavanul și podeaua. 

Atunci ne vom concentra atenția asupra meniului de joc. Vom crea butoane personalizate pe care le vom folosi ca meniu pe care le putem arăta și ascunde după cum este necesar.

Cod