Kako programirati računarske igre (sa slikama)

Sadržaj:

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

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

Koraci

1. dio 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 veliki programski jezik podržava unos teksta, izlaz teksta i if-konstrukcije (glavne stvari koje su vam potrebne za jednostavnu igru zasnovanu na tekstu), pa istražite mogućnosti i odlučite koji vam je najugodniji i posvećen učenju. Evo nekoliko faktora koje treba uzeti u obzir:

  • Za šta 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čunarskih 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 vježbe u bilo kojem normalnom programskom jeziku (tj. Ne onom koji je posebno dizajniran da bude zbunjujući poput Malbolgea), neki su početnicima prijazniji od drugih. Java i C, na primjer, zahtijevaju da razumijete dublje programske koncepte 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 sistemima, 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 sistema, 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čunar

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

5692759 3
5692759 3

Korak 3. Napišite neki kod da pozdravite igrača

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

  • To se radi pomoću funkcije print () u Pythonu. Da biste ga 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 tačan broj. Prvo što moramo učiniti je generirati nasumični broj na početku igre kako igrač ne bi uvijek pogodio isti broj. Budući da će broj ostati isti tokom cijelog programa, 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) koja to radi. Zato idite na početak koda (prije funkcija print ()) i upišite redak import random.
  • 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 igrača

U igri igrač želi nešto učiniti ili stupiti u interakciju s nečim. U tekstualnoj igri 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 igraču, trebao bi pročitati i broj koji unose. 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 da biste pohranili unos igrača u varijablu koja se zove number:

    userNum = input ()

5692759 6
5692759 6

Korak 6. Pretvorite ulaz igrača u upotrebljiv tip podataka

Igrač je unio broj-šta sad?

  • Neka unos igrača bude broj. Ovo bi moglo zvučati zbunjujuće jer su upravo unijeli broj. Ali 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. Uporedite broj igrača sa 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 ispravno pogodio i napustiti program. To se radi pomoću sljedećeg koda:

dok je userNum! = rightNum: userNum = int (input ())

5692759 8
5692759 8

Korak 8. Dajte igraču povratnu informaciju

Dok ste već obradili njihov unos, igrač to neće vidjeti. Morat ćete zaista odštampati rezultate igraču kako bi razumio šta se dešava.

  • Naravno, mogli ste samo reći igraču je li njihov broj točan ili pogrešan. Ali 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 pomoću if-konstrukcija, pa zamijenite ispis ("Pogrešno. Pokušajte ponovo. ") S jednim.
  • Imajte na umu da se provjera da li su dva broja jednaka vrši sa ==, a ne sa =. = dodeljuje vrednost desno od nje promenljivoj levo od nje!
  • if userNum <rightNum: print ("Premalo. Pokušajte ponovo:") if userNum> rightNum: print ("Preveliko. 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 biti u mogućnosti prekinuti vašu igru jednostavnim unosom pogrešne stvari. "Potvrđivanje unosa" znači provjeriti je li igrač unijeo ispravnu stvar prije obrade.

  • Ponovo 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 da provjerite je li unos bio broj.
  • Definirajte funkciju. Budući da je provjera unosa prilično duga i morate to učiniti više puta, trebali biste definirati funkciju. Neće uzeti argumente i vratiti broj. Prvo napišite def numInput (): na vrhu koda, direktno ispod nasumičnog uvoza.
  • Jednom unesite ulaz igrača. Koristite funkciju input () i dodijelite rezultat varijabli inp.
  • Ako igrač ne unese broj, zamolite ga da unese broj. Da biste provjerili je li niz broj, koristite funkcije isdigit (), koje dopuštaju samo cijeli broj, tako da 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. Ovo će učiniti pretvaranje u glavni kôd nepotrebnim, pa ga trebate ukloniti odatle.
  • Zamijenite sve pozive na input () u glavnom kodu pozivima na numInput ().
  • Kod funkcije numInput () će izgledati 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. Ponovo testirajte igru

Namerno unesite pogrešne stvari da vidite šta se dešava, 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 grešci, program će od vas ponovo zatražiti broj

5692759 12
5692759 12

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

Na ovaj način igrač bi mogao igrati vašu igru duže vrijeme bez stalnog ponovnog pokretanja.

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

Korak 13. Testirajte igru

Morat ćete testirati svoju igru svaki put kada implementirate novu funkciju.

  • 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 ("Premalo. Pokušajte ponovo:") if userNum> rightNum: print ("Preveliko. Pokušajte ponovo:") userNum = numInput () print ("Jeste li dobro pogodili.") print ("Da li ste želite ponovo 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 kviz? 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.

2. dio 3: Pravljenje igre s 2D grafikom

5692759 15
5692759 15

Korak 1. Odaberite grafičku biblioteku

Izrada grafike je vrlo 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 bibliotekama. Tako ćete morati koristiti vanjsku biblioteku da biste mogli stvarati grafiku, na primjer Pygame za Python.

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

Ovaj članak će koristiti Python sa 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 nabaviti sa 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 tako da možete lako 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žen 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. Kreirajte prozor igre

Ovo je osnovni preduvjet za igru sa grafikom.

  • Uvezite potrebne pod-module cocos2d: cocos.director, cocos.scene i cocos.layer. To se radi pomoću importa 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 sa prvim.
  • Definirajte podklasu 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 dati 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 da se lako vratite u glavni izbornik ponovnim pozivanjem funkcije.
  • Napravite scenu. Scena se za sada sastoji od jednog sloja koji je objekt klase MainMenuBgr koju ste definirali.
  • Pokrenite ovu scenu u prozoru.
  • iz uvoza cocos.director * iz uvoza cocos.scene * iz uvoza cocos.layer * klase 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 meni u prozor

Osim stvarne igre, morat ćete dodati meni koji igrač može koristiti za zatvaranje prozora, među ostalim elementima koje možete dodati kasnije.

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

    iz cocos.director import * iz cocos.menu uvoza * iz cocos.scene uvoza * iz cocos.layer uvoza * import pyglet.app klasa MainMenuBgr (ColorLayer): def _init _ (samo): super (MainMenuBgr, self)._ init _ (0, 200, 255, 255) class MainMenu (Menu): 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 greške u osnovnoj strukturi prije nego što se stvari previše zakompliciraju.

Kod 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 trebalo dogoditi. Kada pritisnete "Quit", prozor će se zatvoriti

5692759 22
5692759 22

Korak 8. Kreirajte sprite

Duh je "objekt igre" ili dvodimenzionalna slika. Duhovi mogu biti objekti u igri, ikone, ukrasi u pozadini, likovi i sve ostalo š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 sprajt ako nemate sliku za njega. Možete ga nacrtati ili nabaviti s interneta (ipak, pazite na licence ako planirate objaviti igru). Za ovaj primjer idite na https://opengameart.org/content/tux-classic-hero-style i spremite-p.webp" />
  • Kreirajte sloj kao novi objekt klase ScrollableLayer. Zatim kreirajte 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 će osigurati da se pingvin ne zaglavi u ledu.
  • Dodajte sprajt u sprajtov sloj.
  • Napravite novu scenu od sloja spritea 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 kod. Trebali biste vidjeti malu figuru pingvina (ili šta god da ste nacrtali) na crnoj podlozi nakon što kliknete Započni igru.
5692759 23
5692759 23

Korak 9. Zamislite svoj pejzaž

U većini igara vaši sprajtovi 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.

  • Kreirajte 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 je odavde, 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. Sačuvajte svoju sliku kao icyTiles.png.
  • Napravite opis skupa pločica. To je XML datoteka. XML datoteka sadrži informacije o tome koliko su velike pločice na slici postavljenih pločica, koju sliku koristiti i gdje pronaći koju pločicu. Kreirajte XML datoteku pod imenom icyTiles.xml sa donjim kodom:

         
    
5692759 24
5692759 24

Korak 10. Napravite kartu pločica za svoj krajolik

Mapa pločica je karta koja definira koja pločica je na kojoj poziciji na vašem nivou. 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 nivoa, ali za upoznavanje razvoja 2D igara, algoritam može pružiti dovoljno dobre nivoe.

  • Saznajte koliko je redaka i stupaca potrebno. U tu svrhu podijelite veličinu ekrana s veličinom pločice vodoravno (kolone) 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. Ovo će izbrisati sav prethodni sadržaj datoteke, pa odaberite ime koje još nijedna datoteka u direktoriju nema, poput levelMap.xml.
  • Upišite početne oznake u datoteku.
  • Generirajte mapu 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 ispod radi, a za sve što smislite vjerojatno će vam trebati i nasumični cijeli brojevi. Također, postavite nebeske 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 = plafon (600 /16) # visina ekrana / 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 mapu pločica

Uvezite sve s cocos.tiles, a zatim idite u funkciju startGame za to.

  • Na početku vaše startGame funkcije, generirajte kartu pločica pomoću funkcije koju ste za to definirali.
  • Kreirajte novog upravitelja pomicanja. Učinite to izravno ispod crte na koju dodajte sprajt sloju.
  • Kreirajte novi sloj koji sadrži pločice, koji će se učitati iz mape 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. Možete dodati z-poziciju ako želite.
  • Umjesto stvaranja scene iz sprite sloja, kreirajte je iz upravitelja pomicanja.
  • Vaša startGame funkcija sada bi 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

Često biste trebali testirati svoj kôd kako biste bili sigurni da nove funkcije 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 i bit će 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 pomeranje njihove figure kada se pritisne odgovarajući taster.

  • Uvezite sve iz cocos.mapcolliders i iz cocos.actions. Takođe uvezite ključ iz pyglet.window.
  • "Deklarirajte" neke globalne varijable. Globalne varijable se dijele između funkcija. Ne možete 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 pobrinuti za dodjelu ispravne vrijednosti kasnije. Zato dodajte ispod izraza za uvoz:

    # "deklarisanje" globalnih promenljivih tastatura = 0 scrMang = 0

  • Prilagodite funkciju startGame:

    • Recimo da koristite globalne varijable keyboard i scrMang. Učinite to pisanjem globalne tastature, scrMang na vrhu funkcije.
    • Neka prozor sluša događaje sa tastature.
    • Recite figuri da djeluje na osnovu PlatformerControllera. Uskoro ćete implementirati taj PlatformerController.
    • Napravite sudarač karte za rješavanje sudara između čvrstih pločica i figure.

    def startGame (): globalna tastatura, 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 '] # tastatura = key. KeyStateHandler () director.window.push_handlers (tastatura) # 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 figuru prema pritisku tipke.

    • Definirajte kontroler platforme kao podklasu akcije.
    • Definirajte brzinu kretanja, brzinu skoka i gravitaciju.
    • Definirajte start funkciju. 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 za vrijeme trajanja scene.
    • 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 pritisnuta lijeva ili desna tipka) pomnoženo sa brzinom kretanja. Dodajte gravitaciju y brzini. Pomnožite ga s zastojima kako bi na isti način funkcionirao 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 dovodi do toga da se kamera pomiče na razuman način kada se figura pomiče.

    klasa PlatformerController (akcija): globalna tastatura, 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 tastatura, klizač ako je dt> 0,1: # ne radite ništa dok je zastoj na velikom povratku vx, vy = self.target.velocity vx = (tastatura [key. RIGHT] - tastatura [key. LEFT]) * self. MOVE_SPEED vy + = self. GRAVITY * dt ako self.on_ground i tastatura [key. SPACE]: vy = self. JUMP_SPEED dx = vx * dt dy = vy * dt last = self.target.get_rect () novo = last.copy () novo.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)

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 zemljom.

5692759 29
5692759 29

Korak 15. Kreirajte kraj igre

Čak i igre koje se mogu beskonačno nastaviti trebaju imati mogućnost gubitka. Budući da nivo koji ste napravili u primjeru s funkcijom ima kraj, morat ćete omogućiti i pobjedu dolaskom do tog kraja. U suprotnom, igrač bi 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, pozovite funkciju finishGame () (napisat ćete je kasnije) s "Game Over" kao argument. Ako je položaj x veći od veličine ekrana pomnožene sa 3 (to ste već ranije podesili kao veličinu nivoa).

    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")

  • 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 menija trebale bi biti označene sa "Pokušaj ponovo" i "Odustani" sada, ali funkcije koje zovu ostaju iste.

    klasa FinishMenu (Meni): def _init _ (self, text): super (FinishMenu, self)._ init _ (text) self.menu_valign = CENTER self.menu_halign = CENTARII menuItems = [(MenuItem ("Pokušaj ponovo", startGame)), (Stavka menija ("Zatvori", pyglet.app.exit))] self.create_menu (stavke menija)

  • Definirajte funkciju finishGame (). Trebalo bi uzeti tekst kao argument. Trebalo bi napraviti scenu od pozadine glavnog menija, FinishMenu sa tekstualnim argumentom koji se prenosi na ovaj meni. 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 možete uzeti zasluge za svoj odličan kôd, kao i bilo kome drugom ko vam je na tom putu pomogao. Ako ste koristili sliku s druge web stranice (s dopuštenjem), svakako je pripišite njenom tvorcu.

  • Kreirajte 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 na svoj Python kod i uvezite Label iz cocos.text.
  • Definirajte potklasu Bodovi sloja. U svojoj _init_ funkciji, pročitajte CREDITS datoteku 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 =" lijevo ", anchor_y =" vrh ") credLabel.position = 25, 500- (i +1)*40 self.add (credLabel)

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

    klasa BackToMainMenuButton (Meni): def _init _ (self): super (BackToMainMenuButton, self)._ init _ ("") self.menu_valign = BOTTOM self.menu_halign = LIJEVA menuItems = [(MenuItem ("Natrag", showMainMenu)) self create_menu (menuItems)

  • Definirajte funkciju showCredits. Trebao bi napraviti scenu od sloja MainMenuBgr i Credits i 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

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

    iz uvoza cocos.director * iz uvoza cocos.menu * iz uvoza cocos.scene * iz uvoza cocos.layer * iz uvoza cocos.sprite * iz uvoza cocos.tiles * iz cocos.mapcolliders uvoza * iz cocos.actions uvoza * iz cocosa.text import Label import pyglet.app iz pyglet.window ključ za uvoz iz matematičkog uvoza plafona iz nasumičnog uvoza randint # "deklarisanje" globalnih promenljivih tastatura = 0 scrMang = 0 klasa MainMenuBgr (ColorLayer): def _init _ (self): super (MainMenuBgr, self)._ init _ (0, 200, 255, 255) class MainMenu (Meni): def _init _ (self): super (MainMenu, self)._ init _ ("") self.menu_valign = CENTAR self.menu_halign = CENTARIImenu stavke = [(Stavka menija ("Pokreni igru", startGame)), (Stavka menija ("Krediti", showCredits)), (Stavka menija ("Odustani", 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 dometu (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 (Meni): def _init _ (samo): super (BackToMainMenuButton, self)._ init _ ("") self.menu_valign = BOTTOM self.menu_halign = LEFT menuItems = [(MenuItem ("Back", showMainMenu))] self.create_menu (MenuItems) klasa FinishMenu (Meni): def _init _ (self, text): super (FinishMenu, self)._ init _ (text) self.menu_valign = CENTER self.menu_halign = CENTARIItem menu = [(MenuItem ("Pokušaj ponovo", startGame)), (MenuItem ("Quit", piglet. app.exit))] self.create_menu (menuItems) klasa PlatformerController (akcija): globalna tastatura, 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 tastatura, skroler ako je dt> 0.1: # ne radite ništa dok je zastoj prevelik povratak vx, vy = self.target.velocity vx = (tastatura [key. RIGHT] - tastatura [key. LEFT]) * self. MOVE_SPEED vy += self. GRAVITY * dt ako self.on _ground i tastatura [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 ekrana / 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) ako 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 tastatura, 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'] # keyboard = 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 (Glavni meni ()) director.run (menuSc) window = director.init (caption = "IcyPlat - jednostavan platformer", promjenjiva veličina = True) showMainMenu ()

  • To je ukupno 168 redova i 152 linije ako računate samo kôd. Ovo izgleda kao mnogo, 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đe, možda biste neko vrijeme voljeli igrati igru koju ste napisali.

3. dio 3: Objavljivanje igre

5692759 52
5692759 52

Korak 1. Zapišite zavisnosti

Svako ko koristi drugi računar neće imati instaliran isti softver i biblioteke 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 trebali biste barem napisati ovisnosti vaših paketa i njihovih ovisnosti.

5692759 53
5692759 53

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

Ovo se odnosi na sve grafike, uključujući 3D modele, muziku, dijalog, muziku, biblioteke i okvire koje ste koristili za igru. Sve što niste sami napisali.

  • Često postoje neki uvjeti, kao što je potrebno kreditiranje autora 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.
  • Postoje i mediji sa autorskim pravima i bez navedene licence, ponekad s tekstom poput "Sva prava pridržana". U tom slučaju morate dobiti izričitu dozvolu autora prije nego što je uključite u igru.
  • Knjižnice se obično izdaju pod licencama koje im omogućuju da se koriste kao biblioteke. Značajan izuzetak je GPL bez izuzetka povezivanja: Takva licenca dozvoljava samo njegovu upotrebu 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 bibliotekom dozvoljeno.

Upozorenje: Korištenje medija ili biblioteka na način koji licenca ne dopušta u igri koju objavljujete može vas dovesti u ozbiljne pravne probleme. Zato 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 kojim uslovima ž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 u pogledu medija 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 javnom domenu. Da biste dozvolili distribuciju i izmjenu pod određenim uvjetima uz zadržavanje nekih prava, isprobajte Gnu opću javnu licencu (GPL) ili licencu za distribuciju softvera Berkeley (BSD). Ili možete učiniti svoj softver vlasničkim, što znači da nikome nije dozvoljeno da ga distribuira ili mijenja 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 mogućnosti 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, zahtijevat će povrat novca, 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 o tome morate odlučiti sami.

  • Objavljivanje na web stranici:

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

  • Izrada paketa za menadžera 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 i tada može 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 pažnju na svoj program

Razmislite o učitavanju vašeg programa u veliko spremište paketa, poput onih koje održavaju Ubuntu i Debian, kako biste omogućili jednostavnu instalaciju. Takođe, 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 nekoj drugoj igri, a igra je otvorenog koda, možete pogledati njen izvorni kod.
  • Kada tražite medije, pokušajte pronaći sadržaj koji je u javnoj domeni. Potražite slike i muziku "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 promocije svoje igre. Ovo će vas vjerojatno blokirati sa stranice, jednostavno je neugodno i naštetit će vašoj reputaciji.

Preporučuje se: