Kako programirati računalne igre (sa slikama)

Sadržaj:

Kako programirati računalne igre (sa slikama)
Kako programirati računalne igre (sa slikama)
Anonim

Imate li ideju za računalnu igru i želite je ostvariti? Ili ste se ikada zapitali kako se pišu računalne igre? Ovaj wikiHow vas uči kako napisati tri osnovne računalne igre u Pythonu. Za razvoj prve igre trebat će vam osnovno razumijevanje Pythona i općenitih programskih koncepata.

Koraci

1. dio od 3: Izrada igre zasnovane na tekstu

5692759 1
5692759 1

Korak 1. Odaberite programski jezik

Svi programski jezici su različiti, pa ćete morati odlučiti koji ćete koristiti za pisanje igre. Svaki veći programski jezik podržava unos teksta, izlaz teksta i konstrukcije if (glavne stvari koje su vam potrebne za jednostavnu igru zasnovanu na tekstu), stoga istražite mogućnosti i odlučite s kojim se osjećate najugodnije i posvećeni ste učenju. Evo nekoliko čimbenika koje treba uzeti u obzir:

  • Za što se jezik najčešće koristi?

    Neki programski jezici, poput JavaScripta, dizajnirani su za upotrebu na webu, dok su drugi, poput Pythona, C ili C ++, dizajnirani za pokretanje računalnih programa. Za svoju igru ciljajte na jezik sa širim rasponom upotrebe, kao što su Python, C, C ++ ili JavaScript.

  • Koliko je teško naučiti?

    Iako bi pisanje programa trebalo biti dovoljno jednostavno nakon neke vježbe u bilo kojem normalnom programskom jeziku (tj. Ne onom koji je posebno osmišljen da bude zbunjujući poput Malbolgea), neki su početnicima ljubazniji od drugih. Java i C, na primjer, od vas će zahtijevati razumijevanje dubljih programskih koncepata nego nešto poput Pythona, koji je poznat po pristupačnijoj i jednostavnijoj sintaksi.

  • Gdje ga mogu koristiti?

    Vjerojatno želite da svi na različitim sustavima, kao što su Linux, Mac ili Windows, svi mogu igrati vašu igru. Stoga ne biste trebali koristiti jezik koji je podržan samo na nekoliko sustava, poput Visual Basica, koji je podržan samo u sustavu Windows.

Ovaj članak će koristiti Python za primjere igre zasnovane na tekstu, ali možete pogledati kako se koncepti rade u bilo kojem drugom programskom jeziku.

5692759 2
5692759 2

Korak 2. Pripremite računalo

Dvije glavne komponente koje su vam potrebne su uređivač teksta u koji ćete napisati svoj kôd i prevoditelj koje ćete koristiti za pretvaranje u igru. Ako želite slijediti primjer u ovom članku, trebali biste instalirati Python i naučiti kako pokrenuti programe. Ako želite, možete postaviti IDE (Integraded Desktop Environment), koji kombinira uređivanje, sastavljanje i ispravljanje pogrešaka u jedan program. Pythonov IDE naziva se IDLE. Ali možete koristiti i bilo koji uređivač teksta koji podržava običan tekst, kao što je Notepad za Windows, TextEdit za macOS ili Vim za Linux.

5692759 3
5692759 3

Korak 3. Napišite neki kod kako biste pozdravili igrača

Igrač će htjeti znati što se događa i što mora učiniti, pa biste mu trebali ispisati neki tekst.

  • To se radi pomoću funkcije print () u Pythonu. Da biste isprobali, otvorite novu datoteku s nastavkom.py, unesite u nju sljedeći kôd, spremite je i pokrenite:

    print ("Dobro došli u igru pogađanja brojeva!") print ("Unesite cijeli broj između 1 i 1000:")

5692759 4
5692759 4

Korak 4. Generirajte slučajni broj

Napravimo igru zasnovanu na tekstu koja traži od igrača da pogodi točan broj. Prvo što moramo učiniti je generirati slučajan broj na početku igre kako igrač ne bi uvijek pogodio isti broj. Budući da će broj tijekom programa ostati isti, poželjet ćete pohraniti slučajni broj u varijablu.

  • Python nema ugrađenu funkciju slučajnog broja, ali ima standardnu biblioteku (to znači da korisnik neće morati instalirati ništa dodatno) što ima. Zato idite na početak koda (prije funkcija print ()) i upišite redak za slučajni unos.
  • Koristite slučajnu funkciju. Zove se randint (), nalazi se u slučajnoj biblioteci koju ste upravo uvezli i uzima minimalnu i maksimalnu vrijednost koju broj može imati kao argument. Zato se vratite na kraj koda i unesite sljedeći redak:

    rightNum = random.randint (0, 1000)

5692759 5
5692759 5

Korak 5. Dobijte ulaz od playera

U igri igrač želi učiniti nešto ili stupiti u interakciju s nečim. U igri zasnovanoj na tekstu to je moguće unošenjem teksta. Sada kada imamo slučajan broj, naši sljedeći redovi koda trebali bi tražiti od igrača da unese svoju najbolju pretpostavku.

  • Budući da kôd koji ste unijeli ispisuje upute za unos broja playeru, trebao bi pročitati i broj koji su unijeli. To se radi pomoću input () u Pythonu 3 i raw_input () u Pythonu 2. Trebali biste pisati u Pythonu 3 jer će Python 2 uskoro zastarjeti. Dodajte sljedeći redak svom kodu za spremanje unosa igrača u varijablu koja se zove number:

    userNum = input ()

5692759 6
5692759 6

Korak 6. Pretvorite ulaz uređaja u upotrebljiv tip podataka

Igrač je unio broj-što sad?

  • Neka unos igrača bude broj. Ovo bi moglo zvučati zbunjujuće jer su upravo unijeli broj. No, postoji dobar razlog: Python pretpostavlja da je sav unos tekst ili "niz", kako se to naziva u programiranju. Ovaj tekst sadrži broj koji želite dobiti. Python ima funkciju koja pretvara niz koji sadrži samo broj u unutrašnji broj. Tip:

    userNum = int (userNum)

5692759 7
5692759 7

Korak 7. Usporedite broj igrača s ispravnim brojem

Nakon što igrač unese svoj broj, morat ćete ga usporediti s onim koji je nasumično generiran. Ako brojevi nisu isti, vaša igra može natjerati igrača da isproba drugi broj. Ako se brojevi podudaraju, možete reći igraču da je točno pogodio i napustiti program. To se radi pomoću sljedećeg koda:

while userNum! = rightNum: userNum = int (input ())

5692759 8
5692759 8

Korak 8. Dajte igraču povratnu informaciju

Dok ste već obradili njihov unos, player to neće vidjeti. Morat ćete zapravo ispisati rezultate playeru kako bi razumio što se događa.

  • Sigurno ste mogli samo reći igraču je li njihov broj točan ili pogrešan. No s takvim pristupom, igrač bi u najgorem slučaju morao pogoditi 1000 puta, što bi bilo jako dosadno.
  • Zato recite igraču je li njihov broj premali ili prevelik. To će značajno smanjiti njihov broj nagađanja. Na primjer, ako igrač prvi pogodi 500, a igra odgovori "Prevelik. Pokušajte ponovo", bit će samo 500 mogućih brojeva umjesto 1000. To se radi s if-konstrukcijama, pa zamijenite ispis ("Pogrešno. Pokušajte ponovo. ") S jednim.
  • Imajte na umu da se provjera jesu li dva broja jednaka vrši s ==, a ne s =. = dodjeljuje vrijednost desno od nje varijabli lijevo od nje!
  • if userNum <rightNum: print ("Premalen. Pokušajte ponovo:") if userNum> rightNum: print ("Prevelik. Pokušajte ponovo:")

5692759 9
5692759 9

Korak 9. Testirajte svoj kôd

Kao programer, morate biti sigurni da vaš kod radi prije nego što smatrate da je dovršen.

  • Prilikom programiranja u pythonu, provjerite jesu li uvlačenja ispravna. Vaš kod bi trebao izgledati ovako:

    import random print ("Dobro došli u igru pogađanja brojeva!") print ("Unesite cijeli broj između 1 i 1000:") rightNum = random.randint (0, 1000) userNum = input () userNum = int (userNum) while userNum! = rightNum: if userNum <rightNum: print ("Premalen. Pokušajte ponovo:") if userNum> rightNum: print ("Prevelik. Pokušajte ponovo:") userNum = int (input ()) print ("Pogađate ispravno.")

5692759 10
5692759 10

Korak 10. Potvrdite unos

Igrač ne bi trebao moći prekinuti vašu igru jednostavnim unosom pogrešne stvari. "Potvrđivanje unosa" znači provjeriti je li igrač unijeo ispravnu stvar prije obrade.

  • Ponovno otvorite igru i pokušajte unijeti sve što nije broj. Igra će izaći s ValueError -om. Da biste to izbjegli, možete implementirati način provjere je li unos bio broj.
  • Definirajte funkciju. Budući da je provjera unosa prilično duga, a to morate učiniti više puta, trebali biste definirati funkciju. Neće uzeti argumente i vratiti broj. Najprije napišite def numInput (): na vrhu koda, izravno ispod naslova random.
  • Jednom pribavite ulaz igrača. Upotrijebite funkciju input () i dodijelite rezultat varijabli inp.
  • Ako igrač ne unese broj, zamolite ga da unese broj. Da biste provjerili je li niz broj, upotrijebite funkcije isdigit () koje dopuštaju samo cijeli broj pa to nećete morati posebno provjeravati.
  • Ako je ulaz broj, pretvorite ga iz niza u broj i vratite rezultat. Koristite funkciju int () za pretvaranje niza u cijeli broj. Zbog toga će pretvorba u glavnom kodu biti nepotrebna, pa biste je trebali ukloniti odatle.
  • Zamijenite sve pozive na input () u glavnom kodu pozivima na numInput ().
  • Kod funkcije numInput () izgledat će ovako:
  • def numInput (): inp = input () dok nije inp.isdigit (): print ("Rečeno vam je da unesete cijeli broj! Unesite cijeli broj:") inp = input () return int (inp)

5692759 11
5692759 11

Korak 11. Ponovno testirajte igru

Namjerno unesite pogrešne stvari da vidite što se događa, a zatim ispravite sve greške kako se pojavljuju.

Pokušajte unijeti neki tekst kada vas program zatraži broj. Sada, umjesto da izađe s porukom o pogrešci, program će od vas ponovno zatražiti broj

5692759 12
5692759 12

Korak 12. Predložite ponovno pokretanje igre kad završi

Na ovaj način igrač bi mogao igrati vašu igru duže vrijeme bez potrebe za stalnim ponovnim pokretanjem.

  • Stavite sav kod osim uvoza i definicije funkcije u while petlju. Postavite True kao uvjet: ovo će uvijek biti točno, pa će se petlja nastaviti zauvijek.
  • Pitajte igrača želi li igrati ponovno nakon što je točno pogodio broj. Upotrijebite funkciju print ().
  • Ako odgovore na "Ne", bježite iz pogleda. Ako odgovore na bilo što drugo, nastavite. Izlaz iz petlje vrši se naredbom break.
  • Pomaknite "Dobro došli u igru pogađanja brojeva" izvan while petlje. Igrač vjerojatno ne želi dobrodošlicu svaki put kada igra igru. Pomaknite ispis uputa ("Dobro došli u igru pogađanja brojeva!" Iznad oznake True:, tako da će se ispisati samo jednom, kada korisnik pokrene prvu igru.
5692759 13
5692759 13

Korak 13. Testirajte igru

Morat ćete testirati svoju igru svaki put kada implementirate novu značajku.

  • Odgovorite "da" i "ne" barem jednom kako biste bili sigurni da obje opcije rade. Evo kako bi vaš kod trebao izgledati:

    import random def numInput (): inp = input () dok nije inp.isdigit (): print ("Rečeno vam je da unesete cijeli broj! Unesite cijeli broj:") inp = input () return int (inp) print ("Dobro došli u igru pogađanja brojeva!") Dok je True: print ("Unesite cijeli broj između 1 i 1000:") rightNum = random.randint (0, 1000) userNum = numInput () while userNum! = RightNum: if userNum <rightNum: print ("Premalen. Pokušajte ponovo:") if userNum> rightNum: print ("Prevelik. Pokušajte ponovo:") userNum = numInput () print ("Jeste li dobro pogodili.") print ("Jeste li želite ponovno igrati? Unesite Ne da biste odustali. ") ako je input () ==" Ne ": break

5692759 14
5692759 14

Korak 14. Napišite druge igre zasnovane na tekstu

Kako bi bilo da sljedeće napišete tekstualnu avanturu? Ili igra kviza? Budi kreativan.

Savjet: Ponekad je korisno pogledati dokumentaciju ako niste sigurni kako se nešto radi ili kako se funkcija koristi. Dokumentacija za Python 3 nalazi se na https://docs.python.org/3/. Ponekad traženje onoga što želite učiniti na internetu također daje dobre rezultate.

Dio 2 od 3: Stvaranje igre s 2D grafikom

5692759 15
5692759 15

Korak 1. Odaberite grafičku biblioteku

Izrada grafike vrlo je složena, a većina programskih jezika (uključujući Python, C ++, C, JavaScript) pruža samo minimalnu ili čak nikakvu podršku za grafiku u jezgri ili standardnim knjižnicama. Stoga ćete za izradu grafika morati koristiti vanjsku knjižnicu, na primjer Pygame za Python.

Čak i s grafičkom bibliotekom morat ćete brinuti o stvarima poput prikaza izbornika, provjere onoga što je igrač kliknuo, prikaza pločica itd. Ako biste se radije usredotočili na razvoj stvarne igre, možete upotrijebiti knjižnicu pokretača igara kao što je Unity, koja te stvari lako implementira

Ovaj članak će koristiti Python s Cocos2D kako bi pokazao kako napraviti jednostavan 2D platformer. Neki od spomenutih koncepata možda ne postoje u drugim motorima za igre. Za više informacija pogledajte njihovu dokumentaciju.

5692759 16
5692759 16

Korak 2. Instalirajte grafičku biblioteku koju ste odabrali

Cocos2D za Python je jednostavan za instalaciju. Možete ga preuzeti s https://python.cocos2d.org/index.html ili pokretanjem sudo pip3 install cocos2d ako koristite Linux.

5692759 17
5692759 17

Korak 3. Napravite novi direktorij za svoju igru i medije

U igri ćete koristiti stvari poput slika i zvukova. Držite ove stvari u istom direktoriju kao i program. Ovaj direktorij ne bi trebao sadržavati ništa drugo kako biste mogli jednostavno vidjeti koja sredstva imate u igri.

5692759 18
5692759 18

Korak 4. Kreirajte novu datoteku koda u novom direktoriju

Nazovite ga glavnim, s nastavkom datoteke za vaš programski jezik. Ako pišete veliki i složeni program u kojem ima smisla imati više programskih datoteka, ovo će vam pokazati koja je glavna datoteka.

U ovom primjeru stvorit ćemo datoteku pod nazivom main.py koja će sadržavati sav naš kôd

5692759 19
5692759 19

Korak 5. Izradite prozor igre

To je osnovni preduvjet za igru s grafikom.

  • Uvezite potrebne pod-module cocos2d: cocos.director, cocos.scene i cocos.layer. To se radi pomoću uvoza podModuleName *, gdje je naziv podmodula podmodul koji želite uvesti. Razlika između … import * i import … je u tome što ne morate stavljati naziv modula ispred svega što koristite iz tog modula s prvim.
  • Definirajte potklasu MainMenuBgr ColorLayer -a. To u osnovi znači da će se svaka pozadina glavnog izbornika koju kreirate ponašati kao sloj boje s nekim promjenama koje napravite.
  • Pokrenite direktora kokosa. Ovo će vam otvoriti novi prozor. Ako ne postavite naslov, prozor će imati isti naslov kao naziv datoteke (main.py), što neće izgledati profesionalno. Dopustite promjenu veličine prozora postavljanjem resizable na True.
  • Definirajte funkciju showMainMenu. Kôd za prikaz glavnog izbornika trebali biste staviti u funkciju jer će vam to omogućiti lak povratak na glavni izbornik ponovnim pozivom funkcije.
  • Napravite scenu. Scena se za sada sastoji od jednog sloja koji je objekt klase MainMenuBgr koju ste definirali.
  • Pokreni ovu scenu u prozoru.
  • from cocos.director import * from cocos.scene import * from cocos.layer import * class MainMenuBgr (ColorLayer): def _init _ (self): super (MainMenu, self)._ init _ (0, 200, 255, 255) def showMainMenu (): menuSc = Scena (MainMenuBgr ()) director.run (menuSc) director.init (caption = "IcyPlat - jednostavan platformer", promjenjiva veličina = True) showMainMenu ()

5692759 20
5692759 20

Korak 6. Dodajte glavni izbornik u prozor

Osim stvarne igre, morat ćete dodati izbornik kojim igrač može zatvoriti prozor, među ostalim elementima koje možete dodati kasnije.

  • Uvezite cocos.menu (opet s uputama from) i pyglet.app (ovaj put s uvozom).
  • Definirajte MainMenu kao podklasu izbornika.
  • Postavite poravnanje glavnog izbornika. Okomito i vodoravno poravnanje morate postaviti zasebno.
  • Napravite popis stavki izbornika i dodajte ih u izbornik. Trebali biste imati barem stavke izbornika "Pokreni igru" i "Izađi". Svaku stavku izbornika treba staviti unutar zagrada. Svaka stavka mora imati oznaku i funkciju povratnog poziva koja određuje što se događa kada igrač klikne na nju. Za stavku "Start Game" upotrijebite funkciju startGame (uskoro ćete je napisati), za stavku "Quit" upotrijebite "pyglet.app.exit" (već postoji). Stvorite stvarni izbornik pozivom self.create_menu (menuItems).
  • Definirajte startGame (). Zasad samo unesite definiciju, zamijenit ćete je kad budete pisali stvarnu igru.
  • Idite na mjesto u svom kodu gdje ste stvorili menuSc scenu i dodajte joj objekt MainMenu.
  • Cijeli vaš kôd sada bi trebao izgledati ovako:

    from cocos.director import * from cocos.menu import * from cocos.scene import * from cocos.layer import * import pyglet.app klasa MainMenuBgr (ColorLayer): def _init _ (self): super (MainMenuBgr, self)._ init _ (0, 200, 255, 255) class MainMenu (izbornik): def _init _ (self): super (MainMenu, self)._ init _ ("") self.menu_valign = CENTAR self.menu_halign = CENTAR menuItems = [(MenuItem ("Pokreni igru" ", startGame)), (MenuItem (" Quit ", pyglet.app.exit))] self.create_menu (menuItems) def startGame (): pass def showMainMenu (): menuSc = Scena (MainMenuBgr ()) menuSc.add (MainMenu ()) director.run (menuSc) director.init (caption = "IcyPlat - jednostavan platformer", promjenjiva veličina = True) showMainMenu ()

5692759 21
5692759 21

Korak 7. Testirajte svoj kôd

Testirajte kôd rano, dok je još kratak i relativno jednostavan. Tada možete identificirati i ispraviti sve pogreške u osnovnoj strukturi prije nego što se stvari previše zakompliciraju.

Kôd iz uputa trebao bi otvoriti prozor s natpisom "IcyPlat - jednostavan platformer." Pozadina je svijetlo plava i možete promijeniti veličinu prozora. Kada na izborniku kliknete "Pokreni igru", ništa se (još) ne bi smjelo dogoditi. Kada pritisnete "Quit", prozor će se zatvoriti

5692759 22
5692759 22

Korak 8. Napravite sprite

Duh je "objekt igre" ili dvodimenzionalna slika. Duhovi mogu biti objekti u igri, ikone, ukrasi u pozadini, likovi i bilo što drugo što možete predstaviti slikom u igri. Za početak ćemo stvoriti sprite za lik s kojim igrač može komunicirati.

  • Uvezite podmodul cocos.sprite s izrazom from-import.
  • Pronađite sliku koja predstavlja sprite. Ne možete prikazati sprite ako nemate sliku za njega. Možete je nacrtati ili nabaviti s interneta (ipak, pazite na licence ako planirate objaviti svoju igru). Za ovaj primjer idite na https://opengameart.org/content/tux-classic-hero-style i spremite-p.webp" />
  • Napravite sloj kao novi objekt klase ScrollableLayer. Zatim stvorite sprite kao Sprite objekt i postavite mu položaj na (8, 250). Za referencu, točka (0, 0) je u donjem lijevom kutu. Ovo je prilično visoko, ali pobrinut će se da pingvin ne zaglavi u ledu.
  • Dodajte sprite u sprajtov sloj.
  • Napravite novu scenu od sprajtovog sloja i pokrenite je.
  • def startGame (): figLayer = ScrollableLayer () fig = Sprite ('pingu.png') fig.position = (75, 100) figLayer.add (fig) # gameSc = Scena (figLayer) director.run (gameSc)

  • Pokrenite kôd. Nakon što kliknete, trebali biste vidjeti malu figuru pingvina (ili što god ste nacrtali) na crnoj podlozi Početak igre.
5692759 23
5692759 23

Korak 9. Sanjajte svoj krajolik

U većini igara vaši duhovi ne bi trebali samo plutati u praznini. Oni bi zapravo trebali stajati na nekoj površini, s nečim oko sebe. U 2D igrama to se često radi pomoću seta pločica i karte pločica. Set pločica u osnovi govori o tome kakvi površinski i pozadinski kvadrati postoje i kako izgledaju.

  • Napravite set pločica. Komplet pločica za ovu igru bit će vrlo jednostavan: jedna pločica za led i jedna pločica za nebo. Ledena pločica korištena u ovom primjeru odavde je, pod CC-BY-SA 3.0.
  • Napravite sliku postavljene pločice. To je slika svih pločica koje moraju biti iste veličine (uredite ih ako nisu) i imati veličinu koju želite vidjeti u igri, jednu do druge. Spremite svoju sliku kao icyTiles.png.
  • Izradite opis skupa pločica. To je XML datoteka. XML datoteka sadrži podatke o tome koliko su velike pločice na slici postavljenih pločica, koju sliku koristiti i gdje pronaći koju pločicu. Napravite XML datoteku imena icyTiles.xml s donjim kodom:

         
    
5692759 24
5692759 24

Korak 10. Napravite kartu pločica za svoj krajolik

Karta pločica je karta koja definira koja pločica je na kojoj poziciji na vašoj razini. U primjeru biste trebali definirati funkciju za generiranje karata pločica jer je ručno dizajniranje karata pločica vrlo zamorno. Naprednija igra obično bi imala neku vrstu uređivača razina, ali za upoznavanje razvoja 2D igara, algoritam može pružiti dovoljno dobre razine.

  • Saznajte koliko je redaka i stupaca potrebno. U tu svrhu podijelite veličinu zaslona s veličinom pločice vodoravno (stupci) i okomito (redovi). Zaokružite broj prema gore; za to vam je potrebna funkcija matematičkog modula pa dodajte iz math import ceil u import na vrhu koda.
  • Otvorite datoteku za pisanje. Time će se izbrisati sav prethodni sadržaj datoteke, pa odaberite naziv koji još nema datoteka u direktoriju, poput levelMap.xml.
  • Upišite početne oznake u datoteku.
  • Generirajte kartu pločica prema algoritmu. Koristite onaj u donjem kodu ili ga sami možete smisliti. Uvezite funkciju randint iz slučajnog modula: potrebno je da kôd u nastavku radi, a što god smislite vjerojatno će vam trebati i nasumični cijeli brojevi. Također, postavite nebeske pločice i ledene pločice u različite slojeve: led je čvrst, nebo nije.
  • Zapišite završne oznake u datoteku i zatvorite datoteku.
  • def generateTilemap (): colAmount = ceil (800 /16) * 3 # (širina ekrana / veličina pločice) * 3 rowAmount = strop (600 /16) # visina zaslona / veličina pločice tileFile = open ("levelMap.xml", " w ") tileFile.write ('\ n / n / n') iceHeight = randint (1, 10) za i u rasponu (0, colAmount): tileFile.write ('') makeHole = False ako je randint (0, 50) == 10 i i! = 0: # ne dopušta rupe na točki mriještenja makeHole = True za j u rasponu (0, rowAmount): if makeHole: tileFile.write ('\ n') else: if j <= iceHeight: tileFile.write ('\ n') else: tileFile.write ('\ n') iceHeight = randint (iceHeight-5, iceHeight+5) ako iceHeight <0: # ograničava da pločice ne padnu prenisko iceHeight = randint (1, 5) if iceHeight> rowAmount: # ograničava da pločice ne budu previsoke IceHeight = randint (int (rowAmount/2) -5, int (rowAmount/2) +5) tileFile.write ('\ n') tileFile.write ('\ n / n') za i u rasponu (0, colAmount): tileFile.write ('') za j u rasponu (0, rowAmount): tileFile.write ('\ n') tileFile.write ('\ n ') tileFile.write (' / n / n ') tileFile.close ()

5692759 25
5692759 25

Korak 11. Prikažite kartu pločica

Uvezite sve iz cocos.tiles, a zatim idite na funkciju startGame za to.

  • Na početku funkcije startGame generirajte kartu pločica pomoću funkcije koju ste za to definirali.
  • Izradite novog upravitelja pomicanja. Učinite to izravno ispod crte na koju dodajte sprajt njegovom sloju.
  • Napravite novi sloj koji sadrži pločice, koji će se učitati s karte pločica levelMap.xml koju je generirala vaša funkcija generateTilemap.
  • Dodajte nečvrsti sloj, čvrsti sloj i sprite sloj upravitelju pomicanja, upravo ovim redoslijedom. Ako želite, možete dodati z-položaj.
  • Umjesto stvaranja scene iz sprite sloja, stvorite je iz upravitelja pomicanja.
  • Vaša bi startGame funkcija sada trebala izgledati ovako:

    def startGame (): generatedTilemap () # fig = Sprite ('pingu.png') fig.position = (8, 500) figLayer = ScrollableLayer () figLayer.add (fig) # tileLayer = load ('levelMap.xml') solidTiles = tileLayer ['solid'] nsoliTiles = tileLayer ['not_solid'] # scrMang = ScrollingManager () scrMang.add (nsoliTiles, z = -1) scrMang.add (solidTiles, z = 0) scrMang.add (figLayer, z = 1) # gameSc = Scena (scrMang) director.run (gameSc)

5692759 26
5692759 26

Korak 12. Testirajte svoj kôd

Trebali biste često testirati svoj kôd kako biste bili sigurni da nove značajke koje ste implementirali zaista rade.

Kôd u primjeru sada bi trebao pokazati neki ledeni krajolik iza pingvina. Ako pingvin izgleda kao da lebdi daleko iznad leda, niste učinili ništa loše, a to će biti ispravljeno u sljedećem koraku

5692759 27
5692759 27

Korak 13. Dodajte kontrole

Igrač ima mnogo više načina interakcije s programom u 2D igri nego u igri zasnovanoj na tekstu. Uobičajeno uključuje pomicanje njihove figure kada se pritisne ispravna tipka.

  • Uvezite sve iz cocos.mapcolliders i iz cocos.actions. Također uvezite ključ iz pyglet.window.
  • "Deklarirajte" neke globalne varijable. Globalne varijable dijele se između funkcija. Ne možete zaista deklarirati varijable u Pythonu, ali morate reći da globalna varijabla postoji u glavnom kodu prije nego što je upotrebite. Možete dodijeliti 0 kao vrijednost jer će se funkcija kasnije pobrinuti za dodjelu ispravne vrijednosti. Pa dodajte ispod izraza za uvoz:

    # "deklariranje" globalnih varijabli tipkovnica = 0 scrMang = 0

  • Prilagodite funkciju startGame:

    • Recimo da koristite tipkovnicu globalnih varijabli i scrMang. Učinite to tako da napišete globalnu tipkovnicu, scrMang na vrhu funkcije.
    • Neka prozor sluša događaje s tipkovnice.
    • Recite figuri da djeluje na temelju PlatformerControllera. Uskoro ćete implementirati taj PlatformerController.
    • Napravite sudarač karte za rješavanje sudara između čvrstih pločica i figure.

    def startGame (): globalna tipkovnica, scrMang generatedTilemap () # fig = Sprite ('pingu.png') fig.position = (8, 250) figLayer = ScrollableLayer () figLayer.add (fig) # tileLayer = load ('levelMap.xml ') solidTiles = tileLayer [' solid '] nsoliTiles = tileLayer [' not_solid '] # tipkovnica = key. KeyStateHandler () director.window.push_handlers (tipkovnica) # fig.do (PlatformerController ()) mapcollider = RectMapCollider = 'slajd') fig.collision_handler = make_collision_handler (mapcollider, solidTiles) # scrMang = ScrollingManager () scrMang.add (nsoliTiles, z = -1) scrMang.add (solidTiles, z = 0) scrMang.add (figLay 1) # gameSc = Scena (scrMang) director.run (gameSc)

  • Napravite kontroler platforme. To je ono što će pomicati lik prema vašim pritiscima na tipke.

    • Definirajte kontroler platforme kao podklasu radnji.
    • Definirajte brzinu kretanja, brzinu skoka i gravitaciju.
    • Definirajte funkciju pokretanja. Ova funkcija se poziva jednom, kada je kontroler platforme spojen na sliku. Brzinu bi trebao postaviti na 0 iu smjeru x i y.
    • Definirajte funkciju koraka. Ponavljat će se dok je scena u tijeku.
    • Recite step funkciji da koristi tipkovnicu globalnih varijabli i scrMang.
    • Dobijte i promijenite brzinu. Brzinu x i y spremite u zasebne varijable. Postavite brzinu x na 1 ili -1 (ovisno o tome je li lijeva ili desna tipka pritisnuta) pomnoženo sa brzinom kretanja. Brzini y dodajte gravitaciju. Pomnožite ga s zastojima tako da radi na isti način na sporijim uređajima. Ako pritisnete tipku za razmak, a figura stoji na tlu, skočite promjenom brzine y do brzine.
    • Izračunajte gdje bi se figura trebala pomaknuti. Zatim dopustite rukovatelju sudara da prilagodi taj položaj ako se nalazi unutar čvrste pločice. Na kraju, pomaknite lik u novi prilagođeni položaj.
    • Postavite fokus upravitelja pomicanja na sliku. To uzrokuje da se kamera pomiče na razuman način kad se figura pomiče.

    klasa PlatformerController (akcija): globalna tipkovnica, scrMang on_ground = True MOVE_SPEED = 300 JUMP_SPEED = 500 GRAVITY = -1200 def start (self): self.target.velocity = (0, 0) def step (self, dt): globalna tipkovnica, klizač ako je dt> 0,1: # ne radite ništa dok je zastoj na velikom povratku vx, vy = self.target.velocity vx = (tipkovnica [tipka. DESNO] - tipkovnica [tipka. LEFT]) * self. MOVE_SPEED vy + = self. GRAVITY * dt ako self.on_ground i tipkovnica [key. SPACE]: vy = self. JUMP_SPEED dx = vx * dt dy = vy * dt last = self.target.get_rect () new = last.copy () new.x += dx new.y += dy self.target.velocity = self.target.collision_handler (zadnji, novi, vx, vy) self.on_ground = (new.y == last.y) self.target.position = new.center scrMang.set_focus (*new.center)

5692759 28
5692759 28

Korak 14. Testirajte svoj kôd

Ako ste slijedili primjer, sada biste trebali moći pomicati pingvina tipkama sa strelicama i skočiti pritiskom na razmaknicu. Također, pingvin bi sada trebao pasti umjesto da lebdi nad tlom.

5692759 29
5692759 29

Korak 15. Stvorite kraj igre

Čak i igre koje se mogu beskonačno nastaviti trebaju imati mogućnost gubitka. Budući da razina koju ste napravili u primjeru s funkcijom ima kraj, morat ćete omogućiti i pobjedu dolaskom do tog kraja. Inače bi igrač samo skakao po ledenim blokovima, što bi im dosadilo.

  • Unutar kontrolera platforme, nakon postavljenog fokusa, postavite položaj x i y figure. Ako je pozicija y manja od 0, nazovite funkciju finishGame () (napisat ćete je kasnije) s "Game Over" kao argument. Ako je položaj x veći od veličine zaslona pomnožene s 3 (to ste već ranije postavili kao veličinu razine).

    posX, posY = self.target.position if posY <0: returnGame ("Game Over") se vraća ako je posX> 800*3: return size level #Game ("Level Completed") return

  • Odredite meni za završetak klase. Trebala bi biti poput klase glavnog izbornika koju ste prethodno definirali, ali umjesto da ima prazan niz kao naslov, trebala bi koristiti promjenjivi tekst koji funkcija _init_ uzima kao argument. Stavke izbornika trebale bi imati oznake "Pokušaj ponovno" i "Odustani" sada, ali funkcije koje zovu ostaju iste.

    class FinishMenu (Izbornik): def _init _ (self, text): super (FinishMenu, self)._ init _ (text) self.menu_valign = CENTER self.menu_halign = CENTERII menuItems = [(MenuItem ("Pokušaj ponovo", startGame)), (Stavka izbornika ("Zatvori", pyglet.app.exit))] self.create_menu (izborničke stavke)

  • Definirajte funkciju finishGame (). Treba uzeti tekst kao argument. Trebao bi napraviti scenu od pozadine glavnog izbornika, FinishMenu s tekstualnim argumentom koji se prenosi na ovaj izbornik. Onda bi trebao pokrenuti ovu scenu.

    def finishGame (tekst): menuSc = Scena (MainMenuBgr ()) menuSc.add (FinishMenu (tekst)) director.run (menuSc)

5692759 30
5692759 30

Korak 16. Dodajte kredite

Ovdje dobivate zasluge za svoj sjajan kôd, kao i bilo kome drugome tko vam je na tom putu pomogao. Ako ste koristili sliku s druge web stranice (s dopuštenjem), svakako pripišite tu sliku njezinom tvorcu.

  • Napravite datoteku KREDITI i tamo unesite sve svoje kredite, ovako:

    Pingvin: Kelvin Shadewing, pod CC0 Ledeni blok: Michał Banas digit1024 na opengameart.org pod CC-BY-SA 3.0

  • Vratite se svom Python kodu i uvezite Label iz cocos.text.
  • Definirajte potklasu Krediti sloja. U funkciji _init_ pročitajte datoteku CREDITS i napravite tekstualnu oznaku na ispravnom mjestu iz svakog retka u njoj.

    class Credits (Layer): def _init _ (self): super (Credits, self)._ init _ () credFile = open ("CREDITS", "r") creds = credFile.read () creds = creds.split ("\ n ") za i u rasponu (0, len (creds)): credLabel = Label (creds , font_size = 32, anchor_x =" left ", anchor_y =" top ") credLabel.position = 25, 500- (i +1)*40 self.add (credLabel)

  • Idite na klasu glavnog izbornika i dodajte stavku izbornika označenu s "Credits" koja poziva funkciju showCredits kada se klikne.
  • Definirajte potklasu BackToMainMenuButton izbornika. Učinite ovo izbornikom s jednom stavkom, označenom "Natrag", koja poziva funkciju showMainMenu. Ovaj "izbornik", koji je više poput gumba, trebao bi biti okomito poravnat prema dnu i vodoravno prema vrhu.

    class BackToMainMenuButton (Izbornik): def _init _ (self): super (BackToMainMenuButton, self)._ init _ ("") self.menu_valign = BOTTOM self.menu_halign = LIJEVA MenuItems = [(MenuItem ("Natrag", showMainMenu)) self create_menu (stavke izbornika)

  • Definirajte funkciju showCredits. Trebao bi napraviti scenu od sloja MainMenuBgr i sloja Credits te pokrenuti tu scenu.

    def showCredits (): credSc = Scena (MainMenuBgr ()) credSc.add (Krediti ()) credSc.add (BackToMainMenuButton ()) director.run (credSc)

5692759 31
5692759 31

Korak 17. Provjerite svoj kôd

Kad mislite da ste dovršili kôd, trebali biste ga ponovno pregledati. To vam može pomoći da primijetite može li se nešto optimizirati ili postoje neki nepotrebni redovi koje ste zaboravili izbrisati. Ako ste slijedili primjer, cijeli kôd sada bi trebao izgledati ovako:

    iz cocos.director uvoz * iz cocos.menu uvoz * iz cocos.scene uvoz * iz cocos.layer uvoz * iz cocos.sprite uvoz * iz cocos.tiles uvoz * iz cocos.mapcolliders uvoz * iz cocos.actions uvoz * iz cocos.text import Label import pyglet.app iz pyglet.window ključ za uvoz iz matematičkog uvoza plafona iz slučajnog uvoza randint # "deklariranje" globalnih varijabli tipkovnica = 0 scrMang = 0 klasa MainMenuBgr (ColorLayer): def _init _ (self): super (MainMenuBgr, self)._ init _ (0, 200, 255, 255) class MainMenu (izbornik): def _init _ (self): super (MainMenu, self)._ init _ ("") self.menu_valign = CENTAR self.menu_halign = CENTARIImeni = (Stavka izbornika ("Start Game", startGame)), (MenuItem ("Credits", showCredits)), (MenuItem ("Quit", pyglet.app.exit))] self.create_menu (menuItems) klasa Krediti (sloj): def _init _ (self): super (Credits, self)._ init _ () credFile = open ("CREDITS", "r") creds = credFile.read () creds = creds.split ("\ n") za i u rasponu (0, len (creds)): credLabel = Oznaka (creds , font_size = 32, anchor_x = "left", anchor_y = "top") credLabel.position = 25, 500- (i+1)*40 self.add (credLabel) klasa BackToMainMenuButton (izbornik): def _init _ (samo): super (BackToMainMenuButton, self)._ init _ ("") self.menu_valign = BOTTOM self.menu_halign = LEFT menuItems = [(MenuItem ("Natrag", showMainMenu))] self.create_menu (MenuItems) klasa FinishMenu (izbornik): def _init _ (self, text): super (FinishMenu, self)._ init _ (text) self.menu_valign = CENTER self.menu_halign = CENTARIImeni = [(Stavka menija ("Pokušaj ponovo", startGame)), (Stavka menija ("Izađi", piglet. app.exit))] self.create_menu (menuItems) klasa PlatformerController (Action): globalna tipkovnica, scrMang on_ground = True MOVE_SPEED = 300 JUMP_SPEED = 500 GRAVITY = -1200 def start (self): self.target.velocity = (0, 0) def step (self, dt): globalna tipkovnica, klizač ako je dt> 0.1: # ne radite ništa dok je zastoj prevelik povrat vx, vy = self.target.velocity vx = (tipkovnica [key. RIGHT] - tipkovnica [key. LEFT]) * self. MOVE_SPEED vy += self. GRAVITY * dt if self.on _ground i tipkovnica [key. SPACE]: vy = self. JUMP_SPEED dx = vx * dt dy = vy * dt last = self.target.get_rect () new = last.copy () new.x += dx new.y + = dy self.target.velocity = self.target.collision_handler (last, new, vx, vy) self.on_ground = (new.y == last.y) self.target.position = new.center scrMang.set_focus (* new.center) posX, posY = self.target.position if posY <0: finishGame ("Game Over") se vraća ako je posX> 800*3: # level size finishGame ("Level Completed") return def finishGame (tekst): menuSc = Scena (MainMenuBgr ()) menuSc.add (FinishMenu (tekst)) director.run (menuSc) def showCredits (): credSc = Scena (MainMenuBgr ()) credSc.add (Krediti ()) credSc.add (BackToMainMenuButton ()) director.run (credSc) def createTilemap (): colAmount = ceil (800/16) * 3 # (širina ekrana / veličina pločice) * 3 rowAmount = strop (600 /16) # visina zaslona / veličina pločice tileFile = otvoren ("levelMap.xml", "w") tileFile.write ('\ n / n / n') iceHeight = randint (1, 10) za i u rasponu (0, colAmount): tileFile.write ('') makeHole = Netačno ako je rand int (0, 50) == 10 i i! = 0: # ne dopušta rupe na točki mrijesta makeHole = True za j u rasponu (0, rowAmount): if makeHole: tileFile.write ('\ n') else: if j <= iceHeight: tileFile.write ('\ n') else: tileFile.write ('\ n') iceHeight = randint (iceHeight-5, iceHeight+5) if iceHeight <0: # ograničava da pločice ne idu previše niska iceHeight = randint (1, 5) if iceHeight> rowAmount: # ograničenje pločica da ne pređe ledHeight = randint (int (rowAmount/2) -5, int (rowAmount/2) +5) tileFile.write ('\ n ') tileFile.write (' / n / n ') za i u rasponu (0, colAmount): tileFile.write (' ') za j u rasponu (0, rowAmount): tileFile.write (' / n ') tileFile.write ('\ n') tileFile.write ('\ n / n') tileFile.close () def startGame (): globalna tipkovnica, scrMang generatedTilemap () # fig = Sprite ('pingu.png') fig.position = (8, 250) figLayer = ScrollableLayer () figLayer.add (fig) # tileLayer = load ('levelMap.xml') solidTiles = tileLayer ['solid'] nsoliTiles = tileLayer ['not_solid'] # tipkovnica = key. KeyStateHandler () director.window.push_handlers (keybo ard) # fig.do (PlatformerController ()) mapcollider = RectMapCollider (velocity_on_bump = 'slide') fig.collision_handler = make_collision_handler (mapcollider, solidTiles) # scrMang = ScrollingManager () scrMang.add, (scrMang.add, add (solidTiles, z = 0) scrMang.add (figLayer, z = 1) # gameSc = Scena (scrMang) director.run (gameSc) def showMainMenu (): menuSc = Scena (MainMenuBgr ()) menuSc.add (MainMenu ()) director.run (menuSc) window = director.init (caption = "IcyPlat - jednostavan platformer", promjenjiva veličina = True) showMainMenu ()

  • To je ukupno 168 redaka i 152 retka ako računate samo kôd. Ovo se čini kao puno, ali za tako složenu igru ovo je zapravo mala količina.
5692759 32
5692759 32

Korak 18. Završeno

Sada isprobajte igru. Kad nešto programirate, morate provjeriti radi li kad god ste implementirali nešto novo. Također, možda biste neko vrijeme voljeli igrati igru koju ste napisali.

3. dio 3: Objavljivanje igre

5692759 52
5692759 52

Korak 1. Zapišite ovisnosti

Svatko tko koristi drugo računalo neće imati instaliran isti softver i knjižnice kao vi. Dakle, morate se pobrinuti da svi koji instaliraju vašu igru znaju što im je potrebno za pokretanje. Ne morate zapisati sve ovisnosti svih ovisnosti svih ovisnosti i tako dalje, ali trebate barem napisati ovisnosti svojih paketa i njihovih ovisnosti.

5692759 53
5692759 53

Korak 2. Provjerite imate li dopuštenje za korištenje svih medija

To se odnosi na sve grafike, uključujući 3D modele, glazbu, dijalog, glazbu, knjižnice i okvire koje ste koristili za igru. Sve što niste sami napisali.

  • Često postoje neki uvjeti, kao što je pripisivanje zasluga autoru ili dijeljenje izmjena medija pod istom licencom. Ponekad ćete moći koristiti grafiku bez pripisivanja kreatora sve dok igru ne naplaćujete. Ako morate priznati autora, učinite to na dobro vidljivom mjestu, poput kartice "Krediti" u vašoj igri.
  • Tu su i mediji s položenim autorskim pravima i bez navedene licence, ponekad s nekim tekstom poput "Sva prava pridržana". U tom slučaju morate dobiti izričito dopuštenje autora prije nego što ga uključite u igru.
  • Knjižnice se obično izdaju pod licencama koje im omogućuju da se koriste kao knjižnice. Značajna iznimka je GPL bez iznimke povezivanja: Takva licenca dopušta ga samo korištenje u programu s određenim licencama. Uvijek biste trebali pročitati barem osnovne točke licence kako biste bili sigurni da je sve što radite s medijima ili knjižnicom dopušteno.

Upozorenje: Korištenje medija ili knjižnica na način koji licenca ne dopušta u igri koju objavljujete može vas dovesti u ozbiljne pravne probleme. Stoga ili pitajte autora ili potpuno izbjegnite medij ako niste sigurni je li vaša upotreba dopuštena.

5692759 54
5692759 54

Korak 3. Odlučite se pod uvjetima na kojima želite objaviti svoju igru

Hoćete li prodavati svoju igru? Želite li dopustiti drugima da koriste vaše slike i ideje? Iako morate biti oprezni s medijima koje koristite u svom projektu, obično možete odlučiti kako želite dopustiti drugima da koriste vašu igru. Možete koristiti licencu Creative Commons CC0 za objavljivanje igre u javnoj domeni. Da biste dopustili distribuciju i izmjenu pod nekim uvjetima uz zadržavanje nekih prava, isprobajte licencu Gnu General Public License (GPL) ili Berkeley Software Distribution (BSD). Ili biste svoj softver mogli učiniti vlasničkim, što znači da ga nitko ne smije distribuirati ili mijenjati bez vašeg dopuštenja.

Iako je prodajom igara moguće zaraditi, malo je vjerojatno da će ljudi kupiti vašu prvu igru koja obično ima malo značajki i ništa posebno. Također, ako besplatni program ne radi, ljudi koji su ga preuzeli bit će razočarani. Međutim, ako su to platili, tražit će svoj novac natrag, uzrokujući dodatne probleme i vama i korisnicima. Stoga razmislite o tome da svojih prvih nekoliko programa učinite besplatnim

5692759 55
5692759 55

Korak 4. Odlučite kako želite objaviti svoju igru

Svaka metoda ima neke prednosti i nedostatke pa se morate odlučiti sami.

  • Objavljivanje na web stranici:

    Ako imate web stranicu, možete postaviti svoju igru kako biste je učinili dostupnom za preuzimanje. Dajte jasne upute o tome kako instalirati softver, kao i sve potrebne ovisnosti. Nedostatak toga je što će igrači morati ručno instalirati ovisnosti, što bi nekim ljudima moglo biti teško.

  • Izrada paketa za upravitelja paketa:

    Postoje različiti upravitelji paketa, poput apt, Yum i Homebrew, koji ljudima olakšavaju instaliranje aplikacija u Linux i Linux okruženjima. Svi oni imaju različite formate paketa. Dobra stvar kod paketa je ta što automatski instaliraju sve ovisnosti (ako ste ih ispravno konfigurirali). Dakle, igrač mora samo instalirati vaš paket, a zatim moći igrati igru. Problem je u tome što postoji mnogo različitih upravitelja paketa na različitim platformama, pa ćete morati uložiti malo truda u pružanje paketa za sve najčešće.

5692759 56
5692759 56

Korak 5. Usmjerite pozornost na svoj program

Razmislite o prijenosu vašeg programa u veliko spremište paketa, poput onih koje održavaju Ubuntu i Debian, kako biste omogućili jednostavnu instalaciju. Također, objavljujte na odgovarajućim forumima, poput odjeljka projekata GameDeva ili dijela tigSourcea. Ali nemojte se razočarati ako vaše prve igre ne postanu poznate. Ako imate ideju da se svidja mnogim ljudima, vaša igra može postati poznata.

Savjeti

  • Budite strpljivi i voljni učiti. Programiranje ponekad može biti frustrirajuće!
  • Ako se pitate kako se nešto radi u drugoj igri, a igra je otvorenog koda, možete pogledati njezin izvorni kod.
  • Kada tražite medije, pokušajte pronaći sadržaj koji je u javnoj domeni. Potražite slike i glazbu "Creative Commons" ili "Public Domain" i koristite web stranice poput https://opengameart.org ili
  • Nemojte kopirati velike dijelove koda bez provjere licence. Često je zabranjeno, a ako nije, obično zahtijeva pripisivanje.
  • Nemojte stvarati neželjenu poštu ili objavljivati na neprikladnim mjestima prilikom promicanja igre. To će vas vjerojatno blokirati sa stranice, jednostavno je neugodno i naštetit će vašoj reputaciji.

Preporučeni: