Platvormi mäng¶
Loome ühe natuke keerukama platvormi mängu ning kasutame siin objekt-orienteeritud programmeerimist. Mängukomponentide jagamine objektideks hoiab koodi puhtamana ning arendajal on selgem ülevaade, kus mingid asjad toimuvad.
Mängujuhis: liigu mängijaga lõpulipu juurde. Vasakule-paremale saab liikuda klahvidega a
ja d
, hüpata saab tühikuga. Kollide vastu ei tohi minna. Samuti ei tohi kukkuda teravate ogade otsa. Mõlemal kahel juhul mäng lõppeb.
Selles mängus on kaks erinevat stseeni või vaadet: menüü ja mängu vaade. Vaate jaoks on loodud eraldi klass Scene
(lähtekood siin). Menüü vaates (lähtekood siin) kuvatakse kaks nuppu. Üks alustab mängu (vahetab stseeni või vaate), teine lõpetab programmi.
Nuppude jaoks on loodud eraldi abiklass Button
, mis paikneb ui
moodulis (lähtekood siin). See on hea näide sellest, kuidas korduvkasutatavat komponenti on mõistlik hoida eraldi klassis. Kui hiljem on soov lisada veel mõni nupp - näiteks mängujuhise jaoks -, saab seda teha kasutades juba loodud nupu klassi.
Mängu vaate (lähtekood siin) jaoks on koostatud maailm tekstina. Iga sümbol tekstis tähistab mingi kindla suurusega ala „maailmas“. Vastavalt tekstile koostatakse maailm, milles mängija liigub. Sedasi on mugav hiljem teha erinevaid leveleid. Loomulikult saaks maailma luua ka graafiliselt erinevate töövahenditega, aga selline tekstipõhine lähenemine on lihtsa maailma loomiseks väga mugav.
Maailm ise on palju suurem, kui korraga ekraanile ära mahub. Koodis on loodud eraldi pind self.game_camera
, mis näitab välja vaid teatud suurusega ala mängija ümber. See pind või n-ö vaade liigub mängijaga kaasa. Meetodis build_level_from_data
toimub maailma ehitamine vastavalt tekstilisele esitusele. render
meetodis arvutatakse välja, millist osa maailmast on vaja näidata sõltuvalt mängija asukohast.
Mängukomponentide jaoks kasutatakse erinevaid objekte, mis on ära kirjeldatud moodulis level_geometry.py
(lähtekood siin). Erinevate komponentide puhul on kirjeldatud, mis juhtub, kui nende pihta minna. Näiteks FinishFlag
tähistab mängu lõppu. Antud juhul lihtsalt prinditakse välja, et mäng on lõppenud. Aga siin võiks vabalt mäng liikuda edasi järgmise taseme juurde.
Mängu tegelaste jaoks on loodud üks ühine ülemklass Body
(lähtekood siin). See klass laiendab PyGame’i enda Sprite
klassi. Siin lisatakse meie mängu jaoks vajalikud komponendid ja funktsionaalsus. Eraldi lahendatakse objektidevahelise kokkupuute olukordi. Näiteks hüppamisel ei tohi läbi seina kukkuda, seinast läbi ei saa joosta, seinast läbi ei saa hüpata jne. Seda võib vaadata handle_collisions
meetodist.
Mängus on kahte tüüpi tegelasi: Player
(lähtekood siin) ja Monster
(lähtekood siin). Mängija puhul tegeletakse eraldi hüppe ja gravitatsiooniga. Koletis korral on liikumine lihtsam - ta liigub vaid vasakule ja paremale. Alguses liigub ühes suunas. Kui sein tuleb ette, siis liigub tagasi teises suunas. y-suunalist liikumist ei toimu.
Lähtekood tervele mängule on GitHubis <https://github.com/taltech-coding/pygame-platformer>. Sealt saab kätte ka erinevad pildid, mida mängus kasutatakse.