Kako programirati računalniške igre (s slikami)

Kazalo:

Kako programirati računalniške igre (s slikami)
Kako programirati računalniške igre (s slikami)
Anonim

Imate idejo za računalniško igro in jo želite uresničiti? Ali pa ste se kdaj vprašali, kako se pišejo računalniške igre? Ta wikiHow vas uči, kako napisati tri osnovne računalniške igre v Pythonu. Za razvoj prve igre boste potrebovali osnovno razumevanje Pythona in splošne koncepte programiranja.

Koraki

1. del 3: Ustvarjanje tekstovne igre

5692759 1
5692759 1

Korak 1. Izberite programski jezik

Vsi programski jeziki so različni, zato se boste morali odločiti, katerega boste uporabili za pisanje igre. Vsak večji programski jezik podpira vnos besedila, izpis besedila in konstrukcije if (glavne stvari, ki jih potrebujete za preprosto igro, ki temelji na besedilu), zato raziščite možnosti in se odločite, kateri vam najbolj ustreza in ste namenjeni učenju. Tukaj je nekaj dejavnikov, ki jih je treba upoštevati:

  • Za kaj se jezik večinoma uporablja?

    Nekateri programski jeziki, na primer JavaScript, so zasnovani za uporabo v spletu, drugi, kot so Python, C ali C ++, pa so namenjeni izvajanju računalniških programov. Za svojo igro si prizadevajte za jezik s širšo paleto uporabe, kot so Python, C, C ++ ali JavaScript.

  • Kako težko se je učiti?

    Čeprav bi moralo biti pisanje programa dovolj enostavno po vadbi v katerem koli običajnem programskem jeziku (torej ne takem, ki bi bil posebej zasnovan tako, da bi bil zmeden, kot je Malbolge), so nekateri prijaznejši do začetnikov kot drugi. Java in C bosta na primer zahtevala razumevanje globljih programskih konceptov kot nekaj takega, kot je Python, ki je znan po bolj dostopni in enostavni skladnji.

  • Kje ga lahko uporabim?

    Verjetno želite, da bi vsi v različnih sistemih, kot so Linux, Mac ali Windows, lahko igrali vašo igro. Zato ne smete uporabljati jezika, ki je podprt le v nekaj sistemih, na primer Visual Basic, ki je podprt samo v sistemu Windows.

Ta članek bo za primere besedilne igre uporabil Python, vendar si lahko ogledate, kako se koncepti izvajajo v katerem koli drugem programskem jeziku.

5692759 2
5692759 2

Korak 2. Pripravite računalnik

Dve glavni komponenti, ki ju potrebujete, sta urejevalnik besedila, v katerega boste zapisali kodo, in prevajalnik, s katerim ga boste spremenili v igro. Če želite slediti zgledu v tem članku, morate namestiti Python in se naučiti izvajati programe. Če želite, lahko nastavite IDE (integrirano namizno okolje), ki združuje urejanje, prevajanje in odpravljanje napak v en sam program. Pythonov IDE se imenuje IDLE. Lahko pa uporabite tudi kateri koli urejevalnik besedil, ki podpira navadno besedilo, na primer Notepad za Windows, TextEdit za macOS ali Vim za Linux.

5692759 3
5692759 3

Korak 3. Napišite kodo, da pozdravite igralca

Igralec bo želel vedeti, kaj se dogaja in kaj mora narediti, zato mu natisnite nekaj besedila.

  • To se naredi s funkcijo print () v Pythonu. Če želite preizkusiti, odprite novo datoteko s pripono.py, vanj vnesite naslednjo kodo, jo shranite in zaženite:

    print ("Dobrodošli v igri ugibanja številk!") print ("Vnesite celo število med 1 in 1000:")

5692759 4
5692759 4

Korak 4. Ustvarite naključno število

Naredimo besedilno igro, ki od igralca zahteva, da ugani pravilno številko. Prva stvar, ki jo moramo narediti, je, da na začetku igre ustvarimo naključno število, tako da igralec ne bo vedno uganil iste številke. Ker bo število v celotnem programu ostalo enako, boste želeli naključno število shraniti v spremenljivko.

  • Python nima vgrajene funkcije naključnega števila, ima pa standardno knjižnico (to pomeni, da uporabniku ne bo treba namestiti ničesar dodatnega), ki to počne. Zato pojdite na začetek kode (pred funkcijami print ()) in vnesite naključno uvoz vrstice.
  • Uporabite naključno funkcijo. Imenuje se randint (), je v naključni knjižnici, ki ste jo pravkar uvozili, in vzame minimalno in največjo vrednost, ki jo ima lahko število kot argument. Zato se vrnite na konec kode in vnesite naslednjo vrstico:

    rightNum = random.randint (0, 1000)

5692759 5
5692759 5

Korak 5. Pridobite podatke od predvajalnika

V igri igralec želi nekaj narediti ali z njim komunicirati. V tekstovni igri je to mogoče z vnosom besedila. Zdaj, ko imamo naključno število, bi morale naše naslednje vrstice kode od igralca zahtevati, da vnese svojo najboljšo ugibanje.

  • Ker koda, ki ste jo vnesli, natisne navodila za vnos številke v predvajalnik, bi morala prebrati tudi številko, ki jo vnesejo. To se naredi z input () v Pythonu 3 in raw_input () v Pythonu 2. Pisati morate v Python 3, saj bo Python 2 kmalu zastarel. Kodi dodajte naslednjo vrstico, da shranite vnos igralca v spremenljivko, imenovano number:

    userNum = input ()

5692759 6
5692759 6

Korak 6. Pretvorite vnos predvajalnika v uporaben podatkovni tip

Igralec je vnesel številko-kaj pa zdaj?

  • Naj bo igralčev vnos številka. To se morda sliši zmedeno, ker so pravkar vnesli številko. Vendar obstaja dober razlog: Python predpostavlja, da je ves vnos besedilo ali "niz", kot se imenuje pri programiranju. To besedilo vsebuje številko, ki jo želite dobiti. Python ima funkcijo, ki pretvori niz, ki vsebuje samo številko, v notranjo številko. Vrsta:

    userNum = int (userNum)

5692759 7
5692759 7

Korak 7. Primerjajte igralčevo številko s pravilno številko

Ko igralec vnese svojo številko, jo boste morali primerjati s tisto, ki je bila naključno ustvarjena. Če številke niso enake, lahko igra zaradi igre poizkusi z drugo številko. Če se številke ujemajo, lahko igralcu poveste, da je pravilno uganil, in zapustite program. To se naredi z naslednjo kodo:

medtem ko je userNum! = rightNum: userNum = int (input ())

5692759 8
5692759 8

Korak 8. Dajte igralcu povratne informacije

Medtem ko ste že obdelali njihov vnos, predvajalnik tega ne bo videl. Rezultate boste morali dejansko natisniti predvajalniku, da bo razumel, kaj se dogaja.

  • Seveda bi lahko igralcu povedali, ali je njihovo število pravilno ali napačno. Toda s tem pristopom bi moral igralec v najslabšem primeru uganiti 1000 -krat, kar bi bilo zelo dolgočasno.
  • Torej povejte igralcu, ali je njihovo število premajhno ali preveliko. To bo znatno zmanjšalo njihovo število ugibanj. Če na primer igralec najprej ugani 500 in igra odgovori "Prevelika. Poskusite znova", bo namesto 1000 možnih le 500 možnih številk. To se naredi s konstrukcijami if, zato zamenjajte tisk ("Napačno. Poskusite znova. ") Z enim.
  • Zavedajte se, da preverjanje, ali sta dve številki enaki, poteka z ==, ne z =. = dodeli vrednost desno od nje spremenljivki levo od nje!
  • if userNum <rightNum: print ("Premajhna. Poskusite znova:") if userNum> rightNum: print ("Prevelika. Poskusite znova:")

5692759 9
5692759 9

Korak 9. Preizkusite svojo kodo

Kot programer se morate prepričati, da vaša koda deluje, preden se ji zdi končana.

  • Pri programiranju v pythonu se prepričajte, da so zamiki pravilni. Vaša koda bi morala izgledati tako:

    uvoz naključnega tiskanja ("Dobrodošli v igri ugibanja številk!") tiskanja ("Vnesite celo število med 1 in 1000:") rightNum = random.randint (0, 1000) userNum = input () userNum = int (userNum) medtem ko userNum! = rightNum: if userNum <rightNum: print ("Premajhen. Poskusite znova:") if userNum> rightNum: print ("Prevelik. Poskusite znova:") userNum = int (input ()) print ("Uganili ste pravilno.")

5692759 10
5692759 10

Korak 10. Potrdite vnos

Igralec ne bi smel prekiniti vaše igre, če preprosto vnese napačno stvar. "Potrditev vnosa" pomeni, da pred predvajanjem poskrbite, da je igralec vnesel pravilno stvar.

  • Znova odprite igro in poskusite vnesti vse, kar ni številka. Igra se bo končala z napako ValueError. Da bi se temu izognili, lahko uporabite način za preverjanje, ali je bil vnos številka.
  • Določite funkcijo. Ker je preverjanje vnosa precej dolgo in ga morate narediti večkrat, morate določiti funkcijo. Ne bo zahteval argumentov in vrnil številke. Najprej napišite def numInput (): na vrhu kode, neposredno pod random random.
  • Enkrat dobite vnos igralca. Uporabite funkcijo input () in rezultat dodelite spremenljivki inp.
  • Če igralčev vnos ni številka, ga prosite, naj vnese številko. Če želite preveriti, ali je niz številka, uporabite funkcije isdigit (), ki dovoljuje le celo število, zato vam tega ne bo treba preverjati ločeno.
  • Če je vnos številka, jo pretvorite iz niza v številko in vrnite rezultat. Za pretvorbo niza v celo število uporabite funkcijo int (). Zaradi tega bo pretvorba v glavni kodi nepotrebna, zato jo odstranite od tam.
  • Zamenjaj vse klice na input () v glavni kodi s klici na numInput ().
  • Koda funkcije numInput () bo videti tako:
  • def numInput (): inp = input (), medtem ko ni inp.isdigit (): print ("Rečeno vam je bilo, da vnesete celo število! Vnesite celo število:") inp = input () return int (inp)

5692759 11
5692759 11

Korak 11. Znova preizkusite igro

Namerno vnesite napačne stvari, da vidite, kaj se zgodi, nato pa odpravite morebitne napake, ko se pojavijo.

Poskusite vnesti besedilo, ko vas program vpraša za številko. Zdaj vas bo program namesto izhoda s sporočilom o napaki znova vprašal za številko

5692759 12
5692759 12

Korak 12. Predlagajte, da igro znova zaženete, ko se konča

Na ta način bi lahko igralec igral vašo igro dlje časa, ne da bi ga moral nenehno znova zagnati.

  • V kodo while vnesite vso kodo, razen uvoza in definicije funkcije. Kot pogoj nastavite True: to bo vedno res, zato se bo zanka nadaljevala večno.
  • Vprašajte igralca, ali želi igrati znova, potem ko je pravilno uganil številko. Uporabite funkcijo print ().
  • Če odgovorijo z "ne", pobegnite iz pogleda. Če odgovorijo na kaj drugega, nadaljujte. Prekinitev zanke se izvede z izjavo break.
  • Premaknite "Dobrodošli v igri ugibanja številk" izven zanke while. Igralec verjetno ne želi biti dobrodošel vsakič, ko igra igro. Premaknite tiskanje navodil ("Dobrodošli v igri ugibanja številk!" Nad vrednostjo True:, tako da bo natisnjeno le enkrat, ko uporabnik zažene prvo igro.
5692759 13
5692759 13

Korak 13. Preizkusite igro

Svojo igro boste morali preizkusiti vsakič, ko uvedete novo funkcijo.

  • Vsaj enkrat odgovorite z "da" in "ne", da zagotovite, da obe možnosti delujeta. Takole bi morala izgledati vaša koda:

    import random def numInput (): inp = input () medtem ko ni inp.isdigit (): print ("Rečeno vam je bilo, da vnesete celo število! Vnesite celo število:") inp = input () return int (inp) print ("Dobrodošli v igri ugibanja številk!") Medtem ko je True: print ("Vnesite celo število med 1 in 1000:") rightNum = random.randint (0, 1000) userNum = numInput () while userNum! = RightNum: if userNum <rightNum: print ("Premajhna. Poskusite znova:") če userNum> rightNum: print ("Prevelika. Poskusite znova:") userNum = numInput () print ("Ali ste pravilno uganili.") print ("Ali Ali želite znova igrati? Vnesite Ne, da zaprete. "), če je input () ==" Ne ": prekinitev

5692759 14
5692759 14

Korak 14. Napišite druge tekstovne igre

Kaj pa, če bi naslednjič napisali besedilno avanturo? Ali kviz? Bodi ustvarjalen.

Nasvet: Včasih je koristno poiskati dokumentacijo, če niste prepričani, kako se kaj naredi ali kako se funkcija uporablja. Dokumentacijo Python 3 najdete na https://docs.python.org/3/. Včasih iskanje, kar želite narediti na internetu, prinese tudi dobre rezultate.

2. del 3: Ustvarjanje igre z 2D grafiko

5692759 15
5692759 15

Korak 1. Izberite grafično knjižnico

Ustvarjanje grafike je zelo zapleteno in večina programskih jezikov (vključno s Python, C ++, C, JavaScript) ponuja le minimalno ali celo brez podpore za grafiko v jedru ali standardnih knjižnicah. Za izdelavo grafike boste morali uporabiti zunanjo knjižnico, na primer Pygame za Python.

Tudi pri grafični knjižnici boste morali skrbeti za stvari, kot so prikaz menija, preverjanje, kaj je predvajalnik kliknil, prikaz ploščic itd. Če bi se raje osredotočili na razvoj dejanske igre, lahko uporabite knjižnico mehanizma za igre, kot je Unity, ki te stvari enostavno izvaja

Ta članek bo z Pythonom in Cocos2D pokazal, kako narediti preprost 2D platformer. Nekateri od omenjenih konceptov morda ne obstajajo v drugih igralnih strojih. Za več informacij si oglejte njihovo dokumentacijo.

5692759 16
5692759 16

Korak 2. Namestite grafično knjižnico, ki ste jo izbrali

Cocos2D za Python je enostaven za namestitev. Dobite ga lahko na naslovu https://python.cocos2d.org/index.html ali z zagonom sudo pip3 install cocos2d, če uporabljate Linux.

5692759 17
5692759 17

Korak 3. Ustvarite nov imenik za svojo igro in predstavnost

V igri boste uporabljali stvari, kot so slike in zvoki. Te stvari hranite v istem imeniku kot program. Ta imenik ne sme vsebovati ničesar drugega, tako da lahko preprosto vidite, kakšna sredstva imate v igri.

5692759 18
5692759 18

Korak 4. Ustvarite novo kodno datoteko v novem imeniku

Pokličite ga z razširitvijo datoteke za vaš programski jezik. Če pišete velik in zapleten program, kjer je smiselno imeti več programskih datotek, vam bo to pokazalo, katera je glavna datoteka.

V tem primeru bomo ustvarili datoteko z imenom main.py, ki bo vsebovala vso našo kodo

5692759 19
5692759 19

Korak 5. Ustvarite okno igre

To je osnovni predpogoj za igro z grafiko.

  • Uvozite potrebne podmodule cocos2d: cocos.director, cocos.scene in cocos.layer. To se naredi z uvozom subModuleName *, kjer je ime podmodula podmodul, ki ga želite uvoziti. Razlika med… import * in import… je v tem, da vam ni treba postaviti imena modula pred vse, kar uporabljate iz tega modula s prvim.
  • Določite podrazred MainMenuBgr ColorLayer. To v bistvu pomeni, da se bo vsako ozadje glavnega menija, ki ga ustvarite, obnašalo kot barvna plast z nekaterimi spremembami.
  • Zaženite direktorja kokosa. To vam bo dalo novo okno. Če ne nastavite napisa, bo okno imelo isti napis kot ime datoteke (main.py), kar ne bo videti profesionalno. Dovolite, da spremenite velikost okna, tako da spremenite velikost na True.
  • Določite funkcijo showMainMenu. Kodo za prikaz glavnega menija morate vnesti v funkcijo, ker se boste tako lahko znova vrnili v glavni meni s ponovnim klicem funkcije.
  • Ustvarite sceno. Prizor je zaenkrat sestavljen iz ene plasti, ki je predmet razreda MainMenuBgr, ki ste ga določili.
  • Zaženi ta prizor v oknu.
  • 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 - preprost platformer", spremenljiva velikost = True) showMainMenu ()

5692759 20
5692759 20

Korak 6. V okno dodajte glavni meni

Poleg dejanske igre boste morali dodati še meni, s katerim lahko igralec zapre okno, med drugimi elementi, ki jih lahko dodate pozneje.

  • Uvozite cocos.menu (spet z navodilom from) in pyglet.app (tokrat z uvozom).
  • Opredelite MainMenu kot podrazred menija.
  • Nastavite poravnavo glavnega menija. Navpično in vodoravno poravnavo morate nastaviti ločeno.
  • Ustvarite seznam elementov menija in jih dodajte v meni. V meniju bi morali imeti vsaj "Start Game" in "Quit". Vsak element menija je treba postaviti v oklepaje. Vsak predmet mora imeti oznako in funkcijo povratnega klica, ki določa, kaj se zgodi, ko jo igralec klikne. Za element »Začni igro« uporabite funkcijo startGame (kmalu ga boste napisali), za element »Zapri« uporabite »pyglet.app.exit« (že obstaja). Ustvarite dejanski meni tako, da pokličete self.create_menu (menuItems).
  • Določite startGame (). Zaenkrat prenesite definicijo, to boste zamenjali, ko boste napisali dejansko igro.
  • Pojdite na mesto v kodi, kjer ste ustvarili prizor menuSc, in mu dodajte objekt MainMenu.
  • Celotna koda bi morala izgledati tako:

    iz cocos.director import * from cocos.menu import * from cocos.scene import * from cocos.layer import * import pyglet.app razred MainMenuBgr (ColorLayer): def _init _ (self): super (MainMenuBgr, self)._ init _ (0, 200, 255, 255) class MainMenu (Menu): def _init _ (self): super (MainMenu, self)._ init _ ("") self.menu_valign = CENTER self.menu_halign = CENTER menuItems = [(MenuItem ("Začni igro" ", 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 - preprost platformer", spremenljiva velikost = True) showMainMenu ()

5692759 21
5692759 21

Korak 7. Preizkusite svojo kodo

Kodo preizkusite zgodaj, čeprav je še kratka in razmeroma preprosta. Potem lahko prepoznate in popravite vse napake v osnovni strukturi, preden se stvari preveč zakomplicirajo.

Koda iz navodil bi morala odpreti okno z napisom "IcyPlat - preprost platformer." Ozadje je svetlo modro in lahko spremenite velikost okna. Ko v meniju kliknete »Začni igro«, se (še) ne bi smelo zgoditi nič. Ko kliknete »Zapri«, se okno zapre

5692759 22
5692759 22

Korak 8. Ustvarite sprite

Sprite je "predmet igre" ali 2-dimenzionalna slika. Sprite so lahko predmeti v igri, ikone, okraski v ozadju, liki in karkoli drugega, kar lahko predstavite s sliko v igri. Začeli bomo z ustvarjanjem sprite za lik, s katerim lahko igralec komunicira.

  • Uvozite podmodul cocos.sprite z izrazom from-import.
  • Poiščite sliko, ki predstavlja sprite. Duha ne morete prikazati, če zanj nimate slike. Lahko narišete eno ali pa jo dobite iz interneta (če nameravate igro objaviti, pazite na licence). V tem primeru pojdite na https://opengameart.org/content/tux-classic-hero-style in shranite sliko-p.webp" />
  • Ustvarite plast kot nov objekt razreda ScrollableLayer. Nato ustvarite sprite kot predmet Sprite in nastavite njegov položaj na (8, 250). Za referenco je točka (0, 0) v spodnjem levem kotu. To je precej visoko, vendar bo poskrbelo, da se pingvin ne zatakne v ledu.
  • Dodajte sprite v plast sprite.
  • Ustvarite nov prizor iz sloja sprite in ga zaženite.
  • def startGame (): figLayer = ScrollableLayer () fig = Sprite ('pingu.png') fig.position = (75, 100) figLayer.add (fig) # gameSc = Scena (figLayer) director.run (gameSc)

  • Zaženite kodo. Ko kliknete, bi morali videti črno figuro pingvina (ali kar ste narisali) na črnem ozadju Začni igro.
5692759 23
5692759 23

Korak 9. Sanjajte o svoji pokrajini

V večini iger vaši sprati ne bi smeli lebdeti v praznini. Pravzaprav bi morali stati na neki površini in imeti nekaj okoli sebe. V 2D igrah se to pogosto zgodi s kompletom ploščic in zemljevidom ploščic. Komplet ploščic v bistvu pove, kakšni površinski in ozadni kvadrati obstajajo ter kako izgledajo.

  • Ustvarite niz ploščic. Komplet ploščic za to igro bo zelo preprost: ena ploščica za led in ena ploščica za nebo. Ledena ploščica, uporabljena v tem primeru, je od tu, pod CC-BY-SA 3.0.
  • Ustvarite sliko ploščice. To je slika vseh ploščic, ki morajo biti enake velikosti (uredite jih, če niso) in imajo velikost, ki jo želite videti v igri, eno poleg druge. Shranite svojo sliko kot icyTiles.png.
  • Ustvarite opis kompleta ploščic. To je datoteka XML. Datoteka XML vsebuje informacije o tem, kako velike so ploščice na sliki niza ploščic, katero sliko uporabiti in kje najti katero ploščico. Ustvarite datoteko XML z imenom icyTiles.xml s spodnjo kodo:

         
    
5692759 24
5692759 24

Korak 10. Naredite zemljevid ploščic za vašo pokrajino

Zemljevid ploščic je zemljevid, ki določa, katera ploščica je na katerem mestu na vaši ravni. V tem primeru morate definirati funkcijo za ustvarjanje zemljevidov ploščic, ker je ročno načrtovanje zemljevidov ploščic zelo dolgočasno. Naprednejša igra bi običajno imela nekakšen urejevalnik ravni, toda za spoznavanje razvoja 2D iger lahko algoritem zagotovi dovolj dobre ravni.

  • Ugotovite, koliko vrstic in stolpcev je potrebno. Za to velikost zaslona delite z velikostjo ploščice tako vodoravno (stolpci) kot navpično (vrstice). Zaokrožite število navzgor; za to potrebujete funkcijo matematičnega modula, zato dodajte od math import ceil k uvozu na vrhu kode.
  • Odprite datoteko za pisanje. S tem boste izbrisali vso prejšnjo vsebino datoteke, zato izberite ime, ki ga še nobena datoteka v imeniku nima, na primer levelMap.xml.
  • Začetne oznake vnesite v datoteko.
  • Ustvarite zemljevid ploščic v skladu z algoritmom. Uporabite tistega v spodnji kodi ali pa ga sami pripravite. Funkcijo randint obvezno uvozite iz modula naključno: za delovanje spodnje kode je potrebno, vse, kar izberete, pa bo verjetno zahtevalo tudi naključna cela števila. Prav tako nebesne ploščice in ledene ploščice položite v različne plasti: led je trden, nebo ne.
  • Zapiralne oznake vpišite v datoteko in datoteko zaprite.
  • def createTilemap (): colAmount = strop (800/16) * 3 # (širina zaslona / velikost ploščic) * 3 rowAmount = strop (600 /16) # višina zaslona / velikost ploščice tileFile = odprto ("levelMap.xml", " w ") tileFile.write ('\ n / n / n') iceHeight = randint (1, 10) za i v obsegu (0, colAmount): tileFile.write ('') makeHole = False če je randint (0, 50) == 10 in i! = 0: # ne dovolite lukenj na točki spawn iceHeight: tileFile.write ('\ n') else: tileFile.write ('\ n') iceHeight = randint (iceHeight-5, iceHeight+5), če iceHeight <0: # omeji, da bi ploščice padle prenizko iceHeight = randint (1, 5) če iceHeight> rowAmount: # omejitev previsokih ledenih ploščicHeight = randint (int (rowAmount/2) -5, int (rowAmount/2) +5) tileFile.write ('\ n') tileFile.write ('\ n / n') za i v obsegu (0, colAmount): tileFile.write ('') za j v obsegu (0, rowAmount): tileFile.write ('\ n') tileFile.write ('\ n ') tileFile.write (' / n / n ') tileFile.close ()

5692759 25
5692759 25

Korak 11. Prikažite zemljevid ploščic

Uvozite vse iz cocos.tiles in nato pojdite v funkcijo startGame.

  • Na začetku funkcije startGame ustvarite zemljevid ploščic s funkcijo, ki ste jo za to določili.
  • Ustvarite novega upravitelja za drsenje. To naredite neposredno pod črto, kjer v svojo plast dodate sprite.
  • Ustvarite novo plast, ki vsebuje ploščice, ki bodo naložene iz zemljevida ploščic levelMap.xml, ki ga ustvari vaša funkcija createTilemap.
  • Ne-trdni sloj, trden sloj in plast sprite dodajte upravitelju drsenja, natančno v tem vrstnem redu. Če želite, lahko dodate položaj z.
  • Namesto da bi prizor ustvarili iz sloja sprite, ga ustvarite iz upravitelja drsenja.
  • Vaša funkcija startGame bi morala izgledati tako:

    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. Preizkusite svojo kodo

Kodo morate pogosto preizkusiti, da se prepričate, da nove funkcije, ki ste jih implementirali, resnično delujejo.

Koda v primeru bi morala pokazati nekaj ledene pokrajine za pingvinom. Če izgleda, da pingvin lebdi daleč nad ledom, niste naredili nič narobe, in to bo popravljeno v naslednjem koraku

5692759 27
5692759 27

Korak 13. Dodajte kontrolnike

Igralec ima v 2D igri veliko več načinov interakcije s programom kot v tekstovni igri. Običajno vključuje premikanje njihove figure, ko pritisnete pravilno tipko.

  • Uvozite vse iz cocos.mapcolliders in iz cocos.actions. Uvozite tudi ključ iz pyglet.window.
  • "Razglasite" nekatere globalne spremenljivke. Globalne spremenljivke si delijo funkcije. V Pythonu res ne morete razglasiti spremenljivk, vendar morate reči, da v glavni kodi obstaja globalna spremenljivka, preden jo uporabite. Kot vrednost lahko dodelite 0, ker bo funkcija kasneje poskrbela za dodelitev pravilne vrednosti. Zato pod uvozne izraze dodajte:

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

  • Prilagodite funkcijo startGame:

    • Recimo, da uporabljate tipkovnico globalnih spremenljivk in scrMang. To naredite tako, da napišete globalno tipkovnico, scrMang na vrhu funkcije.
    • Naj okno posluša dogodke na tipkovnici.
    • Povejte številki, naj deluje na podlagi PlatformerControllerja. Kmalu boste implementirali ta PlatformerController.
    • Ustvarite trkalnik zemljevidov za spopad med trdnimi ploščicami in sliko.

    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 (RectMapCollider_ = 'slide') 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)

  • Ustvarite krmilnik platformerja. To bo premaknilo figuro glede na vaše pritiske tipk.

    • Določite krmilnik platformerja kot podrazred ukrepanja.
    • Določite hitrost premikanja, hitrost skoka in težo.
    • Določite funkcijo zagona. Ta funkcija se pokliče enkrat, ko je krmilnik platformer povezan s sliko. Hitrost mora nastaviti na 0 tako v smeri x kot v smeri y.
    • Določite funkcijo koraka. Ponavljalo se bo, ko bo scena potekala.
    • Povejte funkciji step, naj uporablja tipkovnico globalnih spremenljivk in scrMang.
    • Pridobite in spremenite hitrost. Hranite x in y hitrost v ločenih spremenljivkah. Hitrost x nastavite na 1 ali -1 (odvisno od tega, ali ste pritisnili levo ali desno tipko) pomnoženo s hitrostjo premikanja. K y -hitrosti dodajte gravitacijo. Pomnožite ga z izpadom, tako da deluje enako na počasnejših napravah. Če pritisnete preslednico in figura stoji na tleh, skočite s spreminjanjem hitrosti y, da skočite na hitrost.
    • Izračunajte, kam naj se slika premakne. Nato naj upravljavec trka prilagodi ta položaj, če je znotraj trdne ploščice. Na koncu sliko premaknite v nov prilagojen položaj.
    • Upravitelj drsenja nastavite fokus na sliko. To povzroči, da se fotoaparat pri premikanju figure premika na primeren način.

    razred PlatformerController (dejanje): 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, drsnik, če je dt> 0,1: # ne delajte ničesar med izpadom na veliko vrnitev vx, vy = self.target.velocity vx = (tipkovnica [key. RIGHT] - tipkovnica [key. LEFT]) * self. MOVE_SPEED vy + = self. GRAVITY * dt, če self.on_ground in tipkovnica [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 (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. Preizkusite svojo kodo

Če ste sledili zgledu, bi zdaj lahko premikali pingvina s puščičnimi tipkami in skakali s pritiskom na preslednico. Prav tako bi moral pingvin zdaj pasti, namesto da bi lebdel nad tlemi.

5692759 29
5692759 29

Korak 15. Ustvarite konec igre

Tudi igre, ki se lahko nadaljujejo v neskončnosti, bi morale imeti možnost izgube. Ker ima raven, ki ste jo naredili v primeru s funkcijo, konec, boste morali do cilja doseči tudi zmago. V nasprotnem primeru bi igralec samo skakal po ledenih blokih, kar bi postalo dolgočasno.

  • Znotraj krmilnika platformerja po nastavitvi ostrenja poiščite položaj x in y figure. Če je položaj y manjši od 0, pokličite funkcijo finishGame () (napisali jo boste kasneje) z argumentom "Game Over". Če je položaj x večji od velikosti zaslona, pomnožene s 3 (to ste že nastavili kot velikost ravni).

    posX, posY = self.target.position če je posY <0: finishGame ("Game Over") se vrne, če je posX> 800*3: # level level finishGame ("Level Completed") Vrnitev

  • Določite meni za zaključek razreda. Moral bi biti podoben razredu glavnega menija, ki ste ga definirali prej, namesto da bi imel prazen niz kot naslov, bi moral uporabiti spremenljivo besedilo, ki ga funkcija _init_ vzame kot argument. Elementi menija morajo biti označeni z "Poskusi znova" in "Zapri" zdaj, vendar funkcije, ki jih kličejo, ostanejo enake.

    class FinishMenu (Meni): def _init _ (self, text): super (FinishMenu, self)._ init _ (text) self.menu_valign = CENTER self.menu_halign = CENTER menuItems = [(MenuItem ("Poskusi znova", startGame)), (Element Menu ("Zapri", pyglet.app.exit))] self.create_menu (menuItems)

  • Določite funkcijo finishGame (). Kot argument bi morali vzeti besedilo. Iz ozadja glavnega menija bi moral narediti prizor, FinishMenu z besedilnim argumentom, ki se prenese v ta meni. Potem bi moral zagnati ta prizor.

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

5692759 30
5692759 30

Korak 16. Dodajte kredite

Tu dobite zasluge za svojo odlično kodo, pa tudi vsakogar, ki vam je na tej poti pomagal. Če ste uporabili sliko z drugega spletnega mesta (z dovoljenjem), jo pripišite avtorju.

  • Ustvarite datoteko KREDITI in vnesite vse svoje kredite, na primer:

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

  • Vrnite se na svojo kodo Python in uvozite oznako iz cocos.text.
  • Določite podrazred Krediti sloja. V njeni funkciji _init_ preberite datoteko CREDITS in iz vsake vrstice v njej naredite besedilno oznako na pravilnem mestu.

    razred Credits (Layer): def _init _ (self): super (Credits, self)._ init _ () credFile = open ("CREDITS", "r") creds = credFile.read () creds = creds.split ("\ n ") za i v obsegu (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)

  • Pojdite v svoj glavni menijski razred in dodajte element menija z oznako "Credits", ki po klicu pokliče funkcijo showCredits.
  • Določite podrazred BackToMainMenuButton v meniju. Naj bo to meni z enim elementom z oznako "Nazaj", ki kliče funkcijo showMainMenu. Ta "meni", ki je bolj podoben gumbu, mora biti navpično poravnan navzdol in vodoravno navzgor.

    class BackToMainMenuButton (Menu): def _init _ (self): super (BackToMainMenuButton, self)._ init _ ("") self.menu_valign = BOTTOM self.menu_halign = LEVI menuItems = [(MenuItem ("Nazaj", showMainMenu))] self. create_menu (elementi menija)

  • Določite funkcijo showCredits. Moral bi narediti prizor iz sloja MainMenuBgr in sloja Credits in zagnati to sceno.

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

5692759 31
5692759 31

Korak 17. Preverite kodo

Ko mislite, da ste končali kodo, jo morate znova pregledati. To vam lahko pomaga opaziti, ali je mogoče kaj optimizirati ali pa ste pozabili izbrisati nekaj nepotrebnih vrstic. Če ste sledili zgledu, bi morala biti celotna koda videti tako:

    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 matematike uvozi zgornjo mejo iz naključnega uvoza randint # "razglasitev" globalnih spremenljivk tipkovnica = 0 scrMang = 0 razred MainMenuBgr (ColorLayer): def _init _ (self): super (MainMenuBgr, self)._ init _ (0, 200, 255, 255) class MainMenu (Menu): def _init _ (self): super (MainMenu, self)._ init _ ("") self.menu_valign = CENTER self.menu_halign = CENTER menuItems = [(MenuItem ("Start Game", startGame)), (MenuItem ("Credits", showCredits)), (MenuItem ("Quit", pyglet.app.exit))] self.create_menu (menuItems) razred Krediti (plast): def _init _ (self): super (Credits, self)._ init _ () credFile = open ("CREDITS", "r") creds = credFile.read () creds = creds.split ("\ n") za i v obsegu (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) razred BackToMainMenuButton (Meni): def _init _ (self): super (BackToMainMenuButton, self)._ init _ ("") self.menu_valign = BOTTOM self.menu_halign = LEFT menuItems = [(MenuItem ("Nazaj", showMainMenu))] self.create_menu (MenuItems) razred FinishMenu (Meni): def _init _ self, text): super (FinishMenu, self)._ init _ (text) self.menu_valign = CENTER self.menu_halign = CENTER menuItems = [(MenuItem ("Poskusi znova", startGame)), (MenuItem ("Zapri", pyglet. app.exit))] self.create_menu (menuItems) razred PlatformerController (dejanje): 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, drsnik, če je dt> 0,1: # ne delajte ničesar, medtem ko je izpad prevelik povratek vx, vy = self.target.velocity vx = (tipkovnica [key. RIGHT] - tipkovnica [key. LEFT]) * self. MOVE_SPEED vy += self. GRAVITY * dt če self.on _ground in 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) posX, posY = self.target.position if posY <0: finishGame ("Game Over") se vrne, če je posX> 800*3: # raven velikosti finishGame ("Level Completed") return def finishGame (besedilo): menuSc = Scena (MainMenuBgr ()) menuSc.add (FinishMenu (besedilo)) director.run (menuSc) def showCredits (): credSc = Scena (MainMenuBgr ()) credSc.add (Krediti ()) credSc.add (BackToMainMenuButton ()) director.run (credSc) def generateTilemap (): colAmount = ceil (800/16) * 3 # (širina zaslona / velikost ploščic) * 3 rowAmount = strop (600 /16) # višina zaslona / velikost ploščice FileFile = odprto ("levelMap.xml", "w") tileFile.write ('\ n / n / n') iceHeight = randint (1, 10) za i v območju (0, colAmount): tileFile.write ('') makeHole = Napačno, če je rand int (0, 50) == 10 in i! = 0: # ne dovolite lukenj na točki spawn: if j <= iceHeight: tileFile.write ('\ n') else: tileFile.write ('\ n') iceHeight = randint (iceHeight-5, iceHeight+5), če iceHeight <0: # omejuje, da bi se ploščice premaknile nizka iceHeight = randint (1, 5) if iceHeight> rowAmount: # omejitev previsokih ledenih ploščicHeight = randint (int (rowAmount/2) -5, int (rowAmount/2) +5) tileFile.write ('\ n ') tileFile.write (' / n / n ') za i v obsegu (0, colAmount): tileFile.write (' ') za j v obsegu (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 - preprost platformer", spremenljiva velikost = True) showMainMenu ()

  • To je skupaj 168 vrstic in 152 vrstic, če štejete samo kodo. To se zdi veliko, toda za tako zapleteno igro je to dejansko majhna količina.
5692759 32
5692759 32

Korak 18. Končano

Zdaj preizkusite igro. Ko nekaj programirate, morate preveriti, ali deluje, kadar koli uvedete nekaj novega. Prav tako bi lahko radi igrali igro, ki ste jo napisali nekaj časa.

3. del 3: objava igre

5692759 52
5692759 52

Korak 1. Zapišite odvisnosti

Kdor uporablja drug računalnik, ne bo imel nameščene iste programske opreme in knjižnic kot vi. Zato se morate prepričati, da vsi, ki namestijo vašo igro, točno vedo, kaj potrebujejo za njeno izvajanje. Ni vam treba zapisati vseh odvisnosti vseh odvisnosti vseh odvisnosti itd., Vendar morate vsaj zapisati odvisnosti svojih paketov in njihove odvisnosti.

5692759 53
5692759 53

Korak 2. Prepričajte se, da imate dovoljenje za uporabo vseh medijev

To velja za vse grafike, vključno s 3D modeli, glasbo, dialogom, glasbo, knjižnicami in okviri, ki ste jih uporabili za igro. Karkoli niste napisali sami.

  • Pogosto obstajajo nekateri pogoji, na primer pripisati avtorju zasluge ali deliti spremembe medijev pod isto licenco. Včasih boste lahko uporabljali grafiko, ne da bi pripisali ustvarjalce, dokler igre ne zaračunavate. Če morate avtorju pripisati zasluge, to storite na dobro vidnem mestu, na primer na zavihku "Krediti" v igri.
  • Obstajajo tudi mediji z avtorskimi pravicami in brez določene licence, včasih z besedilom, kot je "Vse pravice pridržane". V tem primeru morate pred vključitvijo v igro pridobiti izrecno dovoljenje avtorja.
  • Knjižnice so običajno izdane pod licencami, ki jim omogočajo uporabo kot knjižnica. Pomembna izjema je GPL brez izjeme pri povezovanju: takšna licenca jo lahko uporablja le v programu z določenimi licencami. Vedno morate prebrati vsaj osnovne točke licence, da se prepričate, da je vse, kar počnete z mediji ali knjižnico, dovoljeno.

Opozorilo: Uporaba medijev ali knjižnic na način, ki licence ne dovoljuje v igri, ki jo objavite, lahko povzroči resne pravne težave. Zato vprašajte avtorja ali se popolnoma izognite mediju, če niste prepričani, ali je vaša uporaba dovoljena.

5692759 54
5692759 54

Korak 3. Odločite se, pod katerimi pogoji želite objaviti svojo igro

Boste prodajali svojo igro? Ali želite drugim omogočiti uporabo vaših slik in idej? Medtem ko morate biti previdni pri medijih, ki jih uporabljate v svojem projektu, se običajno lahko odločite, kako želite drugim omogočiti uporabo vaše igre. Za izdajo igre v javni domeni lahko uporabite licenco Creative Commons CC0. Če želite dovoliti distribucijo in spreminjanje pod določenimi pogoji, hkrati pa ohraniti nekatere pravice, poskusite z licenco Gnu General Public License (GPL) ali Berkeley Software Distribution (BSD). Lahko pa naredite svojo programsko opremo lastniško, kar pomeni, da je brez vašega dovoljenja nihče ne sme distribuirati ali spreminjati.

Čeprav je s prodajo iger mogoče zaslužiti, je malo verjetno, da bodo ljudje kupili vašo prvo igro, ki ima običajno malo funkcij in nič posebnega. Če brezplačni program ne deluje, bodo ljudje, ki so ga prenesli, razočarani. Če pa so zanj plačali, bodo zahtevali denar nazaj, kar bo povzročilo več težav tako vam kot uporabnikom. Zato razmislite o tem, da bi prvih nekaj programov ponudili brezplačno

5692759 55
5692759 55

Korak 4. Odločite se, kako želite objaviti svojo igro

Vsaka metoda ima nekaj prednosti in slabosti, zato se morate odločiti sami.

  • Objava na spletnem mestu:

    Če imate spletno mesto, lahko naložite svojo igro, da bo na voljo za prenos. Poskrbite za jasna navodila o namestitvi programske opreme in vse potrebne odvisnosti. Pomanjkljivost tega je, da bodo morali igralci ročno namestiti odvisnosti, kar je za nekatere ljudi lahko težko.

  • Izdelava paketa za upravitelja paketov:

    Obstajajo različni upravitelji paketov, na primer apt, Yum in Homebrew, ki ljudem olajšajo namestitev aplikacij v okoljih Linux in Linux. Vsi imajo različne oblike paketov. Dobra stvar pri paketih je, da samodejno namestijo vse odvisnosti (če jih pravilno konfigurirate). Tako mora igralec le namestiti vaš paket in nato igrati igro. Težava je v tem, da je na različnih platformah veliko različnih upraviteljev paketov, zato boste morali vložiti nekaj truda v zagotavljanje paketov za vse najpogostejše.

5692759 56
5692759 56

Korak 5. Usmerite pozornost na svoj program

Razmislite o nalaganju programa v večje skladišče paketov, kot sta tista, ki ga vzdržujeta Ubuntu in Debian, da omogočite enostavne namestitve. Objavljajte tudi na ustreznih forumih, na primer v razdelku o projektih GameDev ali v delu tigSource. Vendar ne bodite razočarani, če vaše prve igre ne postanejo slavne. Če imate idejo, da je všeč veliko ljudem, lahko vaša igra postane znana.

Nasveti

  • Bodite potrpežljivi in pripravljeni na učenje. Programiranje je včasih lahko frustrirajuće!
  • Če se sprašujete, kako se kaj naredi v drugi igri in je igra odprtokodna, si lahko ogledate njeno izvorno kodo.
  • Ko iščete medije, poskusite najti vsebino, ki je v javni domeni. Poiščite slike in glasbo »Creative Commons« ali »Javna domena« in uporabite spletna mesta, kot sta https://opengameart.org ali
  • Ne kopirajte večjih kosov kode brez preverjanja licence. Pogosto je prepovedano, v nasprotnem primeru pa običajno zahteva pripisovanje.
  • Pri promociji igre ne objavljajte neželene pošte in ne objavljajte na neprimernih mestih. To vas bo verjetno blokiralo na strani, preprosto je nadležno in bo škodilo vašemu ugledu.

Priporočena: