DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni

"Tiedän, etten tiedä mitään" Sokrates

Kenelle: IT-ihmisille, jotka eivät välitä kaikista kehittäjistä ja haluavat pelata pelejään!

Mistä: kuinka aloittaa pelien kirjoittaminen C/C++:lla, jos tarvitset sitä yhtäkkiä!

Miksi sinun pitäisi lukea tämä: Sovelluskehitys ei ole osaamisalueeni, mutta yritän koodata joka viikko. Koska rakastan pelejä!

Hei minun nimeni on Andrei Grankin, Olen DevOps Luxoftissa. Sovelluskehitys ei ole erikoisalaani, mutta yritän koodata joka viikko. Koska rakastan pelejä!

Tietokonepeliteollisuus on valtava, ja sen huhutaan olevan jopa suurempi kuin elokuvateollisuus nykyään. Pelejä on kirjoitettu tietokoneiden kynnyksellä käyttäen nykyaikaisten standardien mukaan monimutkaisia ​​ja peruskehitysmenetelmiä. Ajan myötä pelimoottoreita, joissa oli jo ohjelmoitu grafiikka, fysiikka ja ääni, alkoi ilmestyä. Niiden avulla voit keskittyä itse pelin kehittämiseen eikä murehtia sen perustasta. Mutta heidän kanssaan, moottoreiden kanssa, kehittäjät "sokeutuvat" ja heikkenevät. Itse pelien tuotanto laitetaan hihnalle. Ja tuotteiden määrä alkaa voittaa sen laatua.

Samaan aikaan, kun pelaamme toisten pelejä, meitä rajoittavat jatkuvasti muiden ihmisten keksimät paikat, juoni, hahmot ja pelimekaniikka. Joten tajusin, että...

... on tullut aika luoda omat maailmani, jotka ovat vain minulle alaisia. Maailmat, joissa minä olen Isä, Poika ja Pyhä Henki!

Ja uskon vilpittömästi, että kirjoittamalla oman pelimoottorisi ja pelaamalla sillä pystyt riisumaan kengät, pyyhkiä ikkunat ja päivittämään matkustamoasi, ja sinusta tulee kokeneempi ja täydellisempi ohjelmoija.

Tässä artikkelissa yritän kertoa kuinka aloitin pienpelien kirjoittamisen C/C++:lla, millaista kehitysprosessi on ja mistä löydän aikaa harrastukselle kiireisessä ympäristössä. Se on subjektiivinen ja kuvaa yksilöllisen aloituksen prosessia. Aineistoa tietämättömyydestä ja uskosta, henkilökohtaisesta kuvastani maailmasta tällä hetkellä. Toisin sanoen "Hallinto ei ole vastuussa henkilökohtaisista aivoistanne!"

Käytäntö

"Tieto ilman harjoittelua on hyödytöntä, harjoitus ilman tietoa on vaarallista." Konfutse

Muistikirjani on elämäni!


Eli käytännössä voin sanoa, että minulle kaikki alkaa muistilehtiöstä. En vain kirjoita sinne päivittäisiä tehtäviäni, vaan myös piirrän, ohjelmoin, suunnittelen vuokaavioita ja ratkaisen ongelmia, myös matemaattisia. Käytä aina muistilehteä ja kirjoita vain lyijykynällä. Se on puhdas, kätevä ja luotettava, IMHO.

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Minun (jo täynnä) muistikirja. Tältä hän näyttää. Se sisältää päivittäisiä tehtäviä, ideoita, piirustuksia, kaavioita, ratkaisuja, mustaa kirjanpitoa, koodia ja niin edelleen

Tässä vaiheessa onnistuin saamaan päätökseen kolme projektia (tämä on minun käsitykseni "täydellisyydestä", koska mitä tahansa tuotetta voidaan kehittää suhteellisen loputtomasti).

  • Projekti 0: Tämä on 3D-arkkitehdin demokohtaus, joka on kirjoitettu C#:lla Unity-pelimoottorilla. macOS- ja Windows-alustoille.
  • Peli 1: konsolipeli Simple Snake (tunnetaan kaikille nimellä "Snake") Windowsille. Kirjoitettu C.
  • Peli 2: konsolipeli Crazy Tanks (tunnetaan kaikille nimellä "Tanks"), kirjoitettu C++-kielellä (käyttämällä luokkia) ja myös Windowsille.

Projekti 0. Arkkitehtidemo

  • alustalla: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Kieli: C#
  • Pelimoottori: yhtenäisyys
  • Inspiraatio: Darrin Lile
  • Arkisto: GitHub

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
3D Scene Architect -demo

Ensimmäinen projekti ei toteutettu C/C++:lla vaan C#:lla Unity-pelimoottorilla. Tämä moottori ei ollut niin vaativa laitteistolle kuin Unreal Engine, ja se näytti myös helpommalta asentaa ja käyttää. En ajatellut muita moottoreita.

Tavoitteeni Unityssa ei ollut kehittää peliä. Halusin luoda 3D-kohtauksen jossain hahmolla. Hänen, tai pikemminkin hänen (minä malliin tyttöä, johon rakastuin =) täytyi liikkua ja olla vuorovaikutuksessa hänen ympärillään olevan maailman kanssa. Tärkeää oli vain ymmärtää, mitä Unity on, mikä on kehitysprosessi ja kuinka paljon vaivaa tarvitaan jonkin luomiseen. Näin syntyi Architect Demo -projekti (nimi keksittiin melkein tyhjästä). Ohjelmointi, mallintaminen, animaatio, teksturointi veivät minulta varmaan kaksi kuukautta päivittäistä työtä.

Aloitin YouTuben opetusvideoista 3D-mallien luomisesta tehosekoitin. Blender on erinomainen ilmainen työkalu 3D-mallinnukseen (ja muuhun), joka ei vaadi asennusta. Ja tässä minua odotti shokki... Osoittautuu, että mallintaminen, animaatio, teksturointi ovat valtavia erillisiä aiheita, joista voi kirjoittaa kirjoja. Tämä pätee erityisesti hahmoihin. Sormien, hampaiden, silmien ja muiden kehon osien mallintamiseen tarvitset tietoa anatomiasta. Miten kasvojen lihakset rakentuvat? Miten ihmiset liikkuvat? Minun piti "asettaa" luut jokaiseen käsivarteen, jalkaan, sormeen, sormien sormiin!

Muotoile solisluita ja muita vivun luita, jotta animaatio näyttää luonnolliselta. Tällaisten oppituntien jälkeen huomaat kuinka paljon työtä animaatioelokuvan tekijät tekevät 30 sekunnin videon luomiseksi. Mutta 3D-elokuvat kestävät tunteja! Ja sitten lähdemme elokuvateattereista ja sanomme jotain tällaista: "Se on paska sarjakuva/elokuva! He olisivat voineet tehdä paremmin..." Tyhmät!

Ja vielä yksi asia koskien ohjelmointia tässä projektissa. Kuten kävi ilmi, mielenkiintoisin osa minulle oli matemaattinen. Jos suoritat kohtauksen (linkki arkistoon projektin kuvauksessa), huomaat, että kamera pyörii tyttöhahmon ympärillä pallossa. Ohjelmoidakseni tällaisen kameran kierron minun piti ensin laskea sijaintipisteen koordinaatit ympyrällä (2D) ja sitten pallolla (3D). Hassua on, että vihasin matematiikkaa koulussa ja tiesin sen C-miinuksella. Osittain luultavasti, koska koulussa ei yksinkertaisesti selitetä sinulle, kuinka helvetissä tätä matematiikkaa sovelletaan elämässä. Mutta kun olet pakkomielle tavoitteestasi, unelmistasi, mielesi kirkastuu ja avautuu! Ja alat nähdä vaikeita tehtäviä jännittävänä seikkailuna. Ja sitten ajattelet: "No, miksi ei *suosikki* matemaatikkosi voinut kertoa sinulle normaalisti, missä näitä kaavoja voidaan soveltaa?"

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Kaavojen laskenta ympyrän ja pallon pisteen koordinaattien laskemiseksi (muistikirjastani)

Peli 1

  • alustalla: Windows (testattu Windows 7:ssä, 10:ssä)
  • Kieli: Mielestäni se oli kirjoitettu puhtaalla C:llä
  • Pelimoottori: Windows-konsoli
  • Inspiraatio: javidx9
  • Arkisto: GitHub

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Yksinkertainen Snake-peli

3D-kohtaus ei ole peli. Lisäksi 3D-objektien (etenkin hahmojen) mallintaminen ja animointi on aikaa vievää ja vaikeaa. Pelattuani Unityn kanssa tajusin, että minun on jatkettava tai pikemminkin aloitettava perusasioista. Jotain yksinkertaista ja nopeaa, mutta samalla globaalia, pelien rakenteen ymmärtämiseksi.

Mikä on yksinkertaista ja nopeaa? Aivan oikein, konsoli ja 2D. Tarkemmin sanottuna jopa konsoli ja symbolit. Jälleen lähdin etsimään inspiraatiota Internetistä (yleensä mielestäni Internet on XNUMX-luvun vallankumouksellisin ja vaarallisin keksintö). Kaivoin videon ohjelmoijasta, joka teki konsoli Tetrisin. Ja hänen pelinsä mukaan päätin tehdä "käärmeen". Videolta opin kahdesta perustavanlaatuisesta asiasta - pelisilmukasta (kolme perustoiminnolla/-osalla) ja puskurin lähdöstä.

Pelisilmukka voi näyttää tältä:

int main()
   {
      Setup();
      // a game loop
      while (!quit)
      {
          Input();
          Logic();
          Draw();
          Sleep(gameSpeed);  // game timing
      }
      return 0;
   }

Koodi esittää koko main()-funktion kerralla. Ja pelisykli alkaa sopivan kommentin jälkeen. Silmukassa on kolme perusfunktiota: Input(), Logic(), Draw(). Ensin syötetyt tiedot Input (pääasiassa näppäinpainallusten ohjaus), sitten syötettyjen tietojen käsittely Logic, sitten tulos näytölle - Piirrä. Ja niin jokaisessa kehyksessä. Näin animaatio syntyy. Se on kuin sarjakuvissa. Tyypillisesti syötettyjen tietojen käsittely vie eniten aikaa ja tietääkseni määrittää pelin kuvanopeuden. Mutta tässä Logic()-funktio suoritetaan hyvin nopeasti. Siksi sinun on ohjattava kuvanopeutta Sleep()-toiminnolla GameSpeed-parametrilla, joka määrittää tämän nopeuden.

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Pelisykli. "Käärmeen" ohjelmointi muistilehtiöön

Jos kehität hahmopohjaista konsolipeliä, et voi tulostaa tietoja näytölle tavallisella 'cout'-stream-ulostulolla – se on hyvin hidasta. Siksi tulos on lähetettävä näytön puskuriin. Tämä on paljon nopeampi ja peli toimii ilman häiriöitä. Ollakseni rehellinen, en aivan ymmärrä mikä näytön puskuri on ja miten se toimii. Mutta annan tässä esimerkkikoodin, ja ehkä joku voi selventää tilannetta kommenteissa.

Näyttöpuskurin hankkiminen (niin sanotusti):

// create screen buffer for drawings
   HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0,
 							   NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
   DWORD dwBytesWritten = 0;
   SetConsoleActiveScreenBuffer(hConsole);

Tietyn merkkijonon scoreLine suora näyttö (pisteiden näyttörivi):

// draw the score
   WriteConsoleOutputCharacter(hConsole, scoreLine, GAME_WIDTH, {2,3}, &dwBytesWritten);

Teoriassa tässä pelissä ei ole mitään monimutkaista; mielestäni se on hyvä lähtötason esimerkki. Koodi on kirjoitettu yhteen tiedostoon ja muotoiltu useilla toiminnoilla. Ei luokkia, ei perintöä. Näet kaiken itse pelin lähdekoodissa menemällä GitHubin arkistoon.

Peli 2 Crazy Tanks

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Peli Crazy Tanks

Hahmojen tulostaminen konsoliin on luultavasti yksinkertaisin asia, jonka voit muuttaa peliksi. Mutta sitten ilmenee yksi ongelma: symboleilla on eri korkeus ja leveys (korkeus on suurempi kuin leveys). Tällä tavalla kaikki näyttää suhteettomalta, ja liikkuminen alas tai ylös näyttää paljon nopeammin kuin liikkuminen vasemmalle tai oikealle. Tämä vaikutus on erittäin havaittavissa Snakessa (peli 1). "Säiliöissä" (Peli 2) ei ole tätä haittaa, koska lähtö siellä järjestetään maalaamalla näytön pikseleitä eri väreillä. Voisi sanoa, että kirjoitin renderöijän. Totta, tämä on hieman monimutkaisempi, vaikkakin paljon mielenkiintoisempi.

Tässä pelissä riittää kuvailemaan järjestelmääni pikselien näyttämiseksi näytöllä. Pidän tätä pelin pääosana. Ja kaiken muun voit keksiä itse.

Joten se, mitä näet näytöllä, on vain joukko liikkuvia monivärisiä suorakulmioita.

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Suorakaide setti

Jokaista suorakulmiota edustaa numeroilla täytetty matriisi. Muuten, voin korostaa yhden mielenkiintoisen vivahteen - kaikki pelin matriisit on ohjelmoitu yksiulotteiseksi taulukoksi. Ei kaksiulotteinen, vaan yksiulotteinen! Yksiulotteisten taulukoiden kanssa työskentely on paljon helpompaa ja nopeampaa.

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Esimerkki pelitankkimatriisista

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Pelitankkimatriisin esitys yksiulotteisena matriisina

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Visuaalisempi esimerkki matriisin esittämisestä yksiulotteisena taulukkona

Mutta pääsy taulukon elementteihin tapahtuu kaksoissilmukassa, ikään kuin se ei olisi yksiulotteinen, vaan kaksiulotteinen. Tämä tehdään, koska työskentelemme edelleen matriisien kanssa.

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Yksiulotteisen taulukon läpikulku kaksoissilmukassa. Y - rivin tunniste, X - sarakkeen tunniste

Huomaa: tavallisten matriisitunnisteiden i, j sijasta käytän tunnisteita x ja y. Minusta tuntuu, että tällä tavalla se on miellyttävämpää silmälle ja ymmärrettävämpää aivoille. Lisäksi tällainen merkintä mahdollistaa käytettyjen matriisien projisoinnin kätevästi kaksiulotteisen kuvan koordinaattiakseleille.

Nyt pikseleistä, väreistä ja näytön lähdöstä. StretchDIBits-funktiota käytetään tulostukseen (Otsikko: windows.h; Kirjasto: gdi32.lib). Tämä toiminto vastaanottaa muun muassa seuraavat tiedot: laite, jolla kuva näytetään (minun tapauksessani se on Windows-konsoli), kuvan näytön aloituskoordinaatit, sen leveys/korkeus ja itse kuva bittikartan muoto, jota edustaa tavujen joukko. Bittikartta tavutaulukkona!

StretchDIBits()-funktio toiminnassa:

// screen output for game field
   StretchDIBits(
               deviceContext,
               OFFSET_LEFT, OFFSET_TOP,
               PMATRIX_WIDTH, PMATRIX_HEIGHT,
               0, 0,
               PMATRIX_WIDTH, PMATRIX_HEIGHT,
               m_p_bitmapMemory, &bitmapInfo,
               DIB_RGB_COLORS,
               SRCCOPY
               );

Muistia varataan etukäteen tälle bittikartalle VirtualAlloc()-funktiolla. Toisin sanoen tarvittava määrä tavuja on varattu tallentamaan tietoja kaikista pikseleistä, jotka sitten näytetään näytöllä.

m_p_bitmapMemoryn bittikartan luominen:

// create bitmap
   int bitmapMemorySize = (PMATRIX_WIDTH * PMATRIX_HEIGHT) * BYTES_PER_PIXEL;
   void* m_p_bitmapMemory = VirtualAlloc(0, bitmapMemorySize, MEM_COMMIT, PAGE_READWRITE);

Karkeasti sanottuna bittikartta koostuu kokoelmasta pikseleitä. Joka neljäs tavu taulukossa on RGB-pikseli. Yksi tavu per punaisen värin arvo, yksi tavu per vihreän värin arvo (G) ja yksi tavu per sininen väriarvo (B). Lisäksi yksi tavu on jäljellä sisennystä varten. Nämä kolme väriä - punainen/vihreä/sininen (RGB) - sekoitetaan keskenään eri suhteissa tuloksena olevan pikselivärin luomiseksi.

Nyt taas jokainen suorakulmio tai peliobjekti on esitetty numeerisella matriisilla. Kaikki nämä peliesineet sijoitetaan kokoelmaan. Ja sitten ne asetetaan pelikentälle muodostaen yhden suuren numeerisen matriisin. Yhdistin jokaisen matriisin numeron tiettyyn väriin. Esimerkiksi numero 8 vastaa sinistä, numero 9 keltaista, numero 10 tummanharmaata ja niin edelleen. Siten voimme sanoa, että meillä on pelikentän matriisi, jossa jokainen numero on väri.

Meillä on siis koko pelikentän numeerinen matriisi toisella puolella ja bittikartta kuvan näyttämiseksi toisella. Toistaiseksi bittikartta on "tyhjä" - se ei vielä sisällä tietoja halutun värin pikseleistä. Tämä tarkoittaa, että viimeinen vaihe on täyttää bittikartan tiedot jokaisesta pikselistä pelikentän numeerisen matriisin perusteella. Selkeä esimerkki tällaisesta muutoksesta on alla olevassa kuvassa.

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Esimerkki bittikartan (pikselimatriisin) täyttämisestä pelikentän digitaaliseen matriisiin perustuvalla tiedolla (väriindeksit eivät vastaa pelin indeksejä)

Esitän myös palan oikeaa koodia pelistä. Muuttuja colorIndex silmukan jokaisessa iteraatiossa saa arvon (väriindeksin) pelikentän numeerisesta matriisista (mainDigitalMatrix). Värimuuttuja asetetaan sitten itse väriin indeksin perusteella. Saatu väri jaetaan sitten punaisen, vihreän ja sinisen suhteeseen (RGB). Ja yhdessä pixelPaddingin kanssa nämä tiedot kirjoitetaan pikseliin yhä uudelleen ja uudelleen muodostaen värikuvan bittikartassa.

Koodi käyttää osoittimia ja bittikohtaisia ​​operaatioita, joita voi olla vaikea ymmärtää. Joten suosittelen lukemaan jostain erikseen, kuinka tällaiset rakenteet toimivat.

Bittikartan täyttäminen pelikentän numeeriseen matriisiin perustuvalla tiedolla:

// set pixel map variables
   int colorIndex;
   COLORREF color;
   int pitch;
   uint8_t* p_row;
 
   // arrange pixels for game field
   pitch = PMATRIX_WIDTH * BYTES_PER_PIXEL;     // row size in bytes
   p_row = (uint8_t*)m_p_bitmapMemory;       //cast to uint8 for valid pointer arithmetic
   							(to add by 1 byte (8 bits) at a time)   
   for (int y = 0; y < PMATRIX_HEIGHT; ++y)
   {
       uint32_t* p_pixel = (uint32_t*)p_row;
       for (int x = 0; x < PMATRIX_WIDTH; ++x)
       {
           colorIndex = mainDigitalMatrix[y * PMATRIX_WIDTH + x];
           color = Utils::GetColor(colorIndex);
           uint8_t blue = GetBValue(color);
           uint8_t green = GetGValue(color);
           uint8_t red = GetRValue(color);
           uint8_t pixelPadding = 0;
 
           *p_pixel = ((pixelPadding << 24) | (red << 16) | (green << 8) | blue);
           ++p_pixel;
       }
       p_row += pitch;
   }

Yllä kuvatun menetelmän mukaisesti pelissä Crazy Tanks muodostetaan yksi kuva (kehys), joka näytetään näytöllä Draw()-funktiossa. Kun näppäinpainallukset on rekisteröity Input()-funktiossa ja niiden myöhempi käsittely Logic()-funktiossa, muodostetaan uusi kuva (kehys). Totta, peliesineillä voi jo olla eri paikka pelikentällä ja vastaavasti ne piirretään eri paikkaan. Näin animaatio (liike) tapahtuu.

Teoriassa (jos en ole unohtanut mitään) ensimmäisen pelin pelisilmukan ymmärtäminen ("Snake") ja järjestelmä pikselien näyttämiseksi näytöllä toisesta pelistä ("Tanks") on kaikki mitä tarvitset kirjoittaaksesi 2D-peleistäsi Windowsissa. Äänetön! 😉 Loput osat ovat vain mielikuvituksen lentoa.

Tietenkin peli "Tanks" on paljon monimutkaisempi kuin "Snake". Käytin jo C++-kieltä, eli kuvailin eri peliobjekteja luokilla. Tein oman kokoelmani - koodia voi tarkastella otsikoissa/Box.h. Muuten, kokoelmassa on todennäköisesti muistivuoto. Käytetyt osoittimet. Toimi muistilla. Täytyy sanoa, että kirja auttoi minua paljon C++:n aloittaminen peliohjelmoinnin kautta. Tämä on loistava aloitus C++:n aloittelijoille. Se on pieni, mielenkiintoinen ja hyvin järjestetty.

Pelin kehittäminen kesti noin kuusi kuukautta. Kirjoitin pääasiassa lounaan ja välipalojen aikana töissä. Hän istui toimiston keittiössä, tallasi ruokaa ja kirjoitti koodia. Tai illallisella kotona. Joten päädyin näihin "keittiösodoihin". Kuten aina, käytin aktiivisesti muistikirjaa ja kaikki käsitteelliset asiat syntyivät siinä.

Käytännön osan suorittamiseksi skannaan muistikirjaani muutaman kerran. Näytän tarkalleen mitä kirjoitin, piirsin, laskin, suunnittelin...

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Tankkien kuvien suunnittelu. Ja määrittää, kuinka monta pikseliä kunkin säiliön tulee varata näytöllä

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Algoritmin ja kaavojen laskeminen säiliön pyörittämiseksi akselinsa ympäri

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Kokoelmani kaavio (se, jossa on todennäköisesti muistivuoto). Kokoelma luodaan Linked List -tyypin mukaan

DevOps C++ ja "kitchen wars" eli Kuinka aloin kirjoittaa pelejä syödessäni
Ja nämä ovat turhia yrityksiä liittää tekoälyä peliin

teoria

"Jopa tuhannen mailin matka alkaa ensimmäisestä askeleesta" (muinainen kiinalainen viisaus)

Siirrytään käytännöstä teoriaan! Kuinka löytää aikaa harrastuksellesi?

  1. Päätä, mitä todella haluat (valitettavasti tämä on vaikein osa).
  2. Aseta prioriteetit.
  3. Uhraa kaikki "ylimääräinen" korkeampien prioriteettien vuoksi.
  4. Siirry kohti tavoitteita joka päivä.
  5. Älä odota kahta tai kolmea tuntia vapaa-aikaa käytettäväksesi harrastuksen parissa.

Toisaalta sinun on määritettävä, mitä haluat ja priorisoida. Toisaalta on mahdollista luopua joistakin toimista/hankkeista näiden prioriteettien hyväksi. Toisin sanoen sinun on uhrattava kaikki "ylimääräinen". Kuulin jostain, että elämässä saa olla korkeintaan kolme päätoimintoa. Sitten voit tehdä ne korkealaatuisina. Ja lisäprojektit/suunnat alkavat yksinkertaisesti ylikuormittua. Mutta tämä kaikki on todennäköisesti subjektiivista ja yksilöllistä.

On olemassa tietty kultainen sääntö: älä koskaan pidä 0% päivää! Opin siitä indie-kehittäjän artikkelista. Jos työskentelet projektin parissa, tee sille jotain joka päivä. Ja sillä ei ole väliä kuinka paljon teet. Kirjoita yksi sana tai rivi koodia, katso yksi opetusvideo tai vasaralla yksi naula tauluun – tee vain jotain. Vaikein asia on aloittaa. Kun aloitat, teet todennäköisesti enemmän kuin halusit. Tällä tavalla liikut jatkuvasti kohti tavoitettasi ja, usko minua, erittäin nopeasti. Loppujen lopuksi tärkein este kaikelle on viivyttely.

Ja on tärkeää muistaa, että sinun ei pidä aliarvioida ja sivuuttaa ilmaista 5, 10, 15 minuutin "sahanpurua", odottaa joitain suuria "tukkeja", jotka kestävät tunnin tai kaksi. Seisotko jonossa? Mieti jotain projektillesi. Liukuportaat? Kirjoita jotain muistilehtiöön. Matkustatko bussissa? Hienoa, lue joku artikkeli. Hyödynnä jokainen tilaisuus. Lopeta kissojen ja koirien katsominen YouTubessa! Älä saastuta aivojasi!

Ja viimeinen. Jos tämän artikkelin luettuasi pidit ajatuksesta luoda pelejä ilman pelimoottoreita, muista nimi Casey Muratori. Tällä kaverilla on сайт. "Katso -> EDELLISET EPISOIDIT" -osiossa löydät upeita ilmaisia ​​video-opetusohjelmia ammattimaisen pelin luomiseen tyhjästä. Viidellä Intro to C for Windows -tunnilla opit todennäköisesti enemmän kuin viiden vuoden yliopisto-opintojen aikana (joku kirjoitti tästä videon alla olevissa kommenteissa).

Casey selittää myös, että kehittämällä oman pelimoottorisi ymmärrät paremmin kaikki olemassa olevat moottorit. Kehysten maailmassa, jossa kaikki yrittävät automatisoida, opit luomaan käytön sijaan. Ymmärrät tietokoneiden luonteen. Ja sinusta tulee myös paljon älykkäämpi ja kypsempi ohjelmoija - ammattilainen.

Onnea valitsemallesi tielle! Ja tehdään maailmasta ammattimaisempi.

Kirjoittaja: Grankin Andrey, DevOps



Lähde: will.com