DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo

"Scio me nihil scire" Socrates

Cui: nam IT homines, qui omnes tincidunt conspuunt, et ludos suos ludere volunt!

De quid: quam scribere ludos in C/C++, si opus est!

Cur hoc legas? App progressione opus meum non proprium est, sed septimanatim signum conor. Quia ludos amo!

Salve. Nomen mihi est Andreas GrankinSum DevOps apud Luxoft. Progressio applicationis non proprium opus meum est, sed omni septimana codicem conor. Quia ludos amo!

In ludorum computatrorum industria ingens est, etiam hodie plus fama quam industria pellicula. Ludi ab initio evolutionis computatrorum conscripti sunt, adhibitis signis recentioribus, modos multiplices et fundamentales evolutionis. Subinde inceperunt machinamenta lusus apparere cum programmatis iam graphics, physicis et sonis. Permittunt te ipsum ludum progressum intendere et de fundamento non molestare. Sed cum eis, cum tormentis, tincidunt "caeci" et degradantur. Ipsa ludorum productio in TRADUCTOR ponitur. Quantitas autem productionis eius qualitatem praevalere incipit.

Eodem tempore, cum ludos alienos ludunt, constanter limitantur locis, argumentis, characteribus, lusibus mechanicis cum aliis hominibus. Intellexi igitur...

... tempus est mundum creare tuos, mihi soli subditos. Mundi sunt, ubi sum Pater, et Filius, et Spiritus Sanctus.

Et sincere credo me scribendo tuum ludum machinam et ludum in eo, oculos tuos aperire poteris, fenestras detergere et casulam tuam sentinam, peritior et integralis programmatis factus.

In hoc articulo conabor tibi dicere quomodo incepi scribere ludos parvos in C / C ++, quid sit processus progressionis et ubi amabam tempus invenio in ambitu negotioso. Res est subjectiva, et processus uniuscuiusque initium describitur. Materia de ignorantia et fide, de imagine mundi ad momentum personale. Aliis verbis: "Administratio cerebro personali non est responsabilis".

praxi

"Scientia sine usu inutilis est, usus sine scientia periculosum est."

Etiam ullamcorper mi vitae mi!


Ita in usu esse possum dicere omnia mihi libello incipit. Cotidiana negotia ibi non solum scribo, sed etiam fluxiones, programmata, consilia et quaestiones solvendas, etiam mathematicas, trahunt. Nota semper utere et tantum stylo scribere. Purus est, commodus et certa, IMHO.

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Mea (iam impleta) libello. Hoc est quod spectat. Continet cotidianas functiones, ideas, picturas, schemata, solutiones, librum custodiendi, codicem, et sic porro.

In hac scaena, tria incepta perficere potui (hoc est in intellectu "finitatis", quia quodlibet opus sine fine enucleari potest.

  • II Project: haec est scena Demo 3D architectus scripta in C# utens machinam venationis Unitae. Nam macOS et Windows Vestibulum.
  • Ludus I: consolatorium ludum Simple Angus (notus omnibus ut "Serpens") pro Fenestra. scriptum in c.
  • Ludus I: consolatorium ludum Insanus Tanks (notus omnibus ut "Tanchiki), iam in C ++ (ordines utens) et etiam sub Windows.

Project 0 Architect Demo

  • Platform: Windows (Fenestra 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Language: C#
  • Ludus machinalis: unum
  • Inspiratio: Darrin Lile
  • Repositorium: GitHub

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
3D Scene architectus Demo

Primum consilium non in C/C++ effectum est, sed in C# utens machinam venationis unitatem. Hoc engine est quod hardware postulantes ut ADSIMULATICIUS Engineac etiam mihi facilius visum est instituere et uti. Ego alia tormenta non cogitabam.

Finis in unitate mihi non erat ludum aliquem evolvere. Volui facere 3D scenam cum aliquo genere ingenii. Ille, vel potius Illa (puellam quam adamavi = imitatus sum) movere et penitus cum exterioribus debuit. Tantum interest intellegere quid sit Unitas, quid sit processus progressionis, et quantum laboris capit aliquid creare. Hoc modo architectus Demo consilii natus est (nomen prope ex bullshit inventum est). Programmatio, exemplar, animatio, textura me probabiliter duos menses laboris cottidiani suscepit.

I coepi cum videos de YouTube in quam creare 3D exempla in blender. Blender magnum est instrumentum liberum pro 3D exemplaris (ac magis) quod institutionem non requirit. Et hic concussa me exspectavit... Evenit ut modeling, animatio, textura ingens sint argumenta separata in quibus libros scribere possis. Hoc maxime valet pro characteribus. Ad exemplum digitorum, dentium, oculorum et aliarum corporis partium, scientia anatomica opus erit. Quomodo musculi faciei ordinati sunt? Quomodo homines movent? Ossa in singulis bracchio, crure, digito, articulos habui!

Claviculam, vectibus ossis additis, ita ut animationem naturalem spectet. Post has lectiones, cognoscis quid ingens opus cinematographicorum animatorum creatores faciunt, sicut 30 seconds of video creare. Sed 3D movies perdurant per horas! Et tunc e theatris venimus et aliquid simile dicimus: “Ta, viverra cacata / movie! Potuerunt melius facere…” Stulti!

Et unum plura de programmatibus in hoc project. Ut evenit, pars mihi gratissima fuit mathematica. Si scaenam curris (link to repositorium in descriptione projecti), animadvertes cameram circum characterem puellae in sphaera. Ad talem cameram gyrationis programma, primum coordinatas positionis puncti in circulo (2D), et deinde in sphaera (3D) computare debebam. Ridiculum est quod math in schola odio habui et cum minus scivi. Parte probabiliter, quia in schola simpliciter non explicant tibi quomodo infernum haec mathematica applicatur in vita. Sed cum sis obsessus propositum, somnium, tum mens aperitur, revelatur. Et incipis percipere opera multiplicia sicut casus excitantis. Et tunc cogitas: "Quare, quare non potuit dilectus mathematicus soleat dicere ubi hae formulae inniti possunt?".

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Calculus formularum ad coordinatas puncti in circulo et in sphaera calculandas (ex libello meo)

Ludus 1

  • Platform: Windows (tentavit in Fenestra 7, 10)
  • Language: Scriptum puto puro C
  • Ludus machinalis: Windows consolatorium
  • Inspiratio: javidx9
  • Repositorium: GitHub

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Simplex serpens ludum

Scena 3D ludus non est. Praeterea exemplaria ac animantia 3D obiecta (praesertim notas) longum et difficile est. Post circum ludens cum unitate, intellexi me manere a fundamentis vel potius incipere. Simplex aliquid et ieiunium, sed simul globalem, ad intellegendam ipsam structuram ludorum.

Et quid habemus simplices et ieiunantes? SIC, console et 2D. Accuratius etiam consolantur et symbola. Iterum in Interrete inspirationem quaerere coepi (generaliter in Interreti saeculi XXI inventionem perniciosissimam ac periculosam considero). Ego effossa video programmatoris unius qui consolatur Tetris. Et ad similitudinem ludi sui statuit anguem excidere. Ex video, didici de duabus rebus fundamentalibus - ansam lusoriam (cum tribus functionibus fundamentalibus / partibus) et ad quiddam output.

Ludus ansa fortasse aliquid simile hoc inspiceret:

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

Totum principale munus in codice exhibet. Et incipit cyclus lusus post commentarium respondentem. Tria munera praecipua in fascias sunt: ​​Input(), Logica(), Trahe (). Primum, input data Input (clavium clavium maxime potestas), deinde processus in notitia Logica ingressa, deinde in screen ostendens - Trahe. et sic singula pectora. Animatio hoc modo creatur. Praesent ut viverra purus. Solet dispensando input data plurimum temporis accipit, et, quantum scio, determinat corpus rate venatus. Hic autem Logica () munus est velocissimum. Ergo tabulae rate temperari debent per Somnum() functionem cum parametro lusionis, qui hunc rate determinat.

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
ludus cycli. Anguis programmatio in nota

Si symbolicum ludum consolatorium elaborandum es, notitias ostendens in screen utendo flumine solito output 'cout' non laborabit - est tardissimum. Ergo, output peragi debet in quiddam velum. Tanto velocius lusus laborabit sine glitches. Ut sit honestum, non satis intelligo quid sit tegumentum quiddam et quomodo operetur. Sed exemplum codicis hic dabo, et fortasse aliquis in commentationibus rem illustrare poterit.

Questus screen quiddam (ut ita dicam):

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

Direct output to the screen of a line scoreLine (line for displays scores):

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

In theoria, in hoc ludo nihil complicatum, bonum exemplum mihi videtur in ingressu-gradu venationis. Codex in uno fasciculo scriptus est et in pluribus functionibus digestus. nulla genera, nulla hereditas. Ipse videre potes omnia in fonte codice ludi eundo ad conditorium in GitHub.

Ludus 2 Sunt Lacus

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Insanus Lacus ludum

Litterae typographicae ad consolatorium verisimiliter simplicissima res in ludum vertere potes. Sed tunc una molestia apparet: characteres habent altitudines et latitudines (altitude maior est quam latitudo). Sic omnia incomparabilia videbunt, et sursum vel sursum movens multo velocius videbuntur quam laeva vel dextera movens. Hic effectus valde notabilis est in "Sangue" (Ludus 1). "Tanks" (Ludus II) tale incommodum non habent, cum output ibi constituatur picturae velum pixels variis coloribus. Diceres te scripsisse redditorem. Verum, hoc iam paulo perplexius est, sed multo magis iucunda.

Pro hoc ludo, satis erit meam rationem describere ad elementa in screen proponenda. Hanc partem ludi principalem puto. Et omnia alia apud te potes ascendere.

Ita quod vides in screen est iusta rectangula movendi colorata.

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Rectangulum set

Utrumque rectangulum a matrice numeris refertum repraesentatur. Obiter possum illustrare unum interesting nuance - omnes matrices in ludo programmantur ut unum dimensiva ordinata. Non duo dimensiva, sed una dimensiva! Unius dimensionis vestit multo facilius et velocius ad operandum.

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Exemplum de ludum cisternina matricis

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Repraesentat Matrix ludi Lacus cum One-Dimensional Array

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Magis illustratur exemplum matricis repraesentationis per unum dimensiva ordinata

Sed accessus ad elementa ordinata fit duplex ansa, quasi non sit una dimensiva, sed duplex instructio. Hoc factum est, quia adhuc cum vulvis laboramus.

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Percurritur una dimensiva ordinata in ansa duplici. Y est ordo ID, X columna ID

Nota quod pro vulgari matrice identificatorio i, j, uti identificanti x et y. Sic, ut mihi videtur, gratior visu et clarior cerebro. Praeterea talis notatio efficit ut matrices commode prodant in axes coordinatas imaginis duplices.

Nunc de elementis, colore et pompa. Munus StretchDIBits (Header: windows.h; Library: gdi32.lib) pro output ponitur. Inter alia, haec ad hoc munus transmittuntur: fabrica in qua imago monstratur (me hoc est in Fenestra console), coordinatae initium imaginis, latitudinis / altitudinis et imaginis. ipsa in forma bitmap (bitmap), quae per ordinem bytes. Bitmap ut acies bytes!

The StretchDIBits () munus ad opus:

// 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
               );

Memoria in antecessum est partita huic bitmap utens munere VirtualAlloc() Hoc est, requisitus numerus bytes reservatur ad informationes de omnibus pixellis, quae tunc in scrinio exhibebuntur.

Creando m_p_bitmapMemory bitmap:

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

Dure loquendo bitmap e copia elementorum constat. Singulis quattuor bytes in ordine RGB pixel est. Unum byte per rubeum valorem, unum byte per viridis valoris (G), et unum byte per caeruleum (B). Plus, byte per indent est. Hi tres colores - Rubei / Viridis / Caerulei (RGB) - inter se diversis proportionibus miscentur - et inde color pixel habebitur.

Iam rursus unumquodque rectangulum, sive obiectum lusus, pluribus matricis repraesentatur. Omnes hi ludi rerum in collectione ponuntur. Et deinde ponuntur in campo ludentium, unam magnam numeralem matricem. Quemque numerum in matrice ad certum colorem divisivi. Verbi gratia, numerus 8 caeruleus est, numerus 9 est luteus, numerus 10 griseus, et sic porro. Et sic possumus dicere quod habet matrix ludentium in campo, ubi quilibet numerus est quidam species coloris.

Itaque matrix numeralis habemus totius campi ludentis ab una parte et bitmap ad imaginem ex altera exhibendam. Hactenus bitmap "vacuus est" - nondum informationem habet de pixellis desiderati coloris. Hoc significat ultimum gradum bitmap implebit informationes de singulis pixel fundatis secundum numerum matrix campi ludentis. Exemplum talis mutationis in pictura infra.

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Exemplum impletionis bitmap (matrix pixel) cum informatione secundum matrix numerica (Digital matrix) campi ludentis (color indices non congruunt indices in ludo)

Etiam particulam realem codicem e ludo offeram. Variabilis colorIndex in unaquaque iteratione ansa tribuitur valor (index color) e matrice numerali agri ludentis (mainDigitalMatrix). Tum color ipse scriptus est colore variabili innixus indicem. Praeterea, color consequens dividitur in rationem rubei, viridis et caerulei. Et una cum indento (pixelPadding), haec notitia ad pixel etiam atque etiam scripta est, imaginem coloris in bitmap efformans.

In codice utitur indicibus et operationibus bitwise, quod difficile intellectu potest. Moneo itaque te alicubi separatim legere quomodo huiusmodi structurae operantur.

Replens bitmap cum informationibus secundum numerum matrix ludentis agri:

// 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;
   }

Secundum methodum supra scriptam, una imago (imago) formatur in ludo Crazy Tanks et in munere ducto monstratur. Post clavium in input() functione perscriptum et eorum processus subsequentis in munere Logica, nova imago (frame) formatur. Verum, ludi res iam aliter locum habere possunt in agro ludentium et ideo alio loco ducuntur. Ita fit animatio.

In theoria (si aliquid non oblitus es), ludum ansam intellegens ex ludo primo ("Sanguinis") et systema pixels in screen e secundo ludo ("Tanks"), omnia debes scribere. tuorum 2D ludorum pro Fenestra. Taciti! 😉 Reliquae partes fugae tantum sunt phantasiae.

Scilicet, ludus "lacus" designatus est multo magis multiplex quam "serpens". Iam lingua C++ usus sum, id est, diversa ludicra cum classibus descripsi. Collectio mea propria creavi - codicem videre potes in capitis/Box.h. Obiter collectionem maxime probabilem habet memoriam Leak. Adhibentur argumenta. Memoriam fecit. Me librum multum adiuvisse mihi fas est dicere. Incipiens C ++ per Ludus Programming. Magnum est initium incipientium in C++. Parva est, interesting et bene disposita.

Circiter menses sex hunc ludum evolvere cepit. Scripsi maxime in prandio et laborum in opere. Sedit in officio coquinae, insistens cibo, scripsit codicem. Domi ad prandium an. Ego itaque talia "coquina bella" accepi. Ut semper, ullamcorper usus sum, omnesque in eo natae rationis.

In fine practicae partis paucas libellos meos lustrabo. Ut ostenderem quid accurate scribebam, trahens, numerans, cogitans…

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Lacus image design. Et definitio quot elementa singula piscinae in velo occupant

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Calculus algorithmus et formulae rotationis piscinae circa axem suum

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Tabulae collectionis meae (una cum memoria Leak, verisimile). Collectio creata est ut List coniunctum

DevOps C++ et "coquina bella", vel Quomodo coepi ludos scribere dum edendo
Et hi sunt vani conatus cochleae intellegentiae artificialis in ludum

doctrina

"Etiam iter mille passuum primum gradum incipit" (Antiqua Sinica sapientia)

Ab usu ad theoriam transeamus! Quomodo tempus habes amabam tuum?

  1. Decerne quid vere vis (heu hoc difficillimum).
  2. potioribus xt.
  3. Omnia « superflua » immola pro potioribus superioribus.
  4. Movere ad proposita tua cotidie.
  5. Noli exspectare ut duae aut tres horae tempus liberum futurum amabam.

Ex altera parte, debes determinare quid vis ac prioritize. E contra, contingit aliquos casus / incepta pro his potioribus deserere. Id est, omnia « superflua » immolare debebis. Audivi alicubi in vita esse maximum trium principalium actionum. Tunc optime cum eis agere poteris. Incipiet autem additis inceptis/directiones corny onerare. Sed haec omnia probabiliter, subiectiva et individua sunt.

Regula aurea quaedam est: numquam hodie 0%! Cognovi in ​​articulo per indie elit. Si in re opus est, cotidie aliquid de illo age. Et quantum ad te non refert. Scribe verbum unum aut unam lineam codicis, unum vide doceo, aut clavum clavum in tabula — fac aliquid. Durissima pars est questus incipiat. Cum inciperis, verisimiliter paulo plus quam voluisti. Tu igitur semper ad tuum propositum movebis et, mihi crede, celerrime. Ceterum pelagus cuncta procrastinatio fregit.

Et magni momenti est meminisse te non MINORIS AESTIMARE ac ignorare liberum "scobam" temporis in 5, 10, 15 minuta, exspecta aliquas magnas "tabulas" perdurantes unius horae vel duarum. Esne in acie stas? Cogita aliquid de tuo project. Ascendis in escalator? Scribe aliquid in libello. Tu in bus manducatis? Bene, articulum aliquem. omni occasione utendum. Desine vigilantes felium et canum in YouTube! Noli tatam cum cerebro tuo!

Et ultimum. Si, hunc articulum lectis, ideam ludi creandi sine machinis lusibus probavisti, tunc recordaberis nominis Casey Muratori. Hoc guy est website. In sectione "vigiliae -> EPISODES PREVIOUS In quinque Intro ad C lectiones pro Fenestra plus quam in quinque annis studiorum apud universitatem discas (quis de hoc scripsit in commentis sub video).

Casey etiam explicat quod per evolutionem tuam machinam venationis tuae, ullis tormentis existentibus melius intellectum habebis. In mundo compagum, ubi quisque automate conetur, creare disces, non uti. Intellige naturam ipsius risus. Facies etiam multo magis ingeniosior et matura programmator - a pro.

Bene vale in viam electam! Et mundum faciamus professionalem.

Author: Grankin Andrey, Devops



Source: www.habr.com