DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?

"Би юу ч мэдэхгүй гэдгээ мэдэж байна" Сократ

Хэнд: Бүх хөгжүүлэгчид рүү нулимж, тэдний тоглоомыг тоглохыг хүсдэг мэдээллийн технологийн хүмүүст зориулав!

Юуны тухай: Хэрэв танд хэрэгтэй бол C/C++ хэл дээр хэрхэн тоглоом бичиж эхлэх вэ!

Та яагаад үүнийг унших ёстой вэ: Апп хөгжүүлэлт бол миний ажлын онцлог биш ч долоо хоног бүр кодлохыг хичээдэг. Учир нь би тоглоомонд дуртай!

сайн уу миний нэрийг Андрей Гранкин, Би Luxoft-ийн DevOps. Хэрэглээний хөгжүүлэлт бол миний ажлын онцлог биш ч долоо хоног бүр кодлохыг хичээдэг. Учир нь би тоглоомонд дуртай!

Компьютер тоглоомын салбар асар том бөгөөд өнөөдөр киноны салбараас ч илүү цуурхалтай. Тоглоомууд нь компьютер хөгжиж эхэлснээс хойш орчин үеийн стандартын дагуу нарийн төвөгтэй, үндсэн хөгжлийн аргуудыг ашиглан бичигдсэн байдаг. Цаг хугацаа өнгөрөхөд тоглоомын хөдөлгүүрүүд аль хэдийн програмчлагдсан график, физик, дуу чимээтэй гарч ирэв. Эдгээр нь тоглоомыг хөгжүүлэхэд анхаарлаа төвлөрүүлж, түүний үндэс суурийг тавихад санаа зовохгүй байх боломжийг танд олгоно. Гэвч тэдэнтэй хамт хөдөлгүүрүүдтэй хамт хөгжүүлэгчид "сохорч", доройтдог. Тоглоомын үйлдвэрлэлийг туузан дамжуулагч дээр тавьдаг. Мөн чанараас нь үйлдвэрлэлийн тоо хэмжээ давамгайлж эхэлдэг.

Үүний зэрэгцээ, бусдын тоглоом тоглохдоо бид бусад хүмүүсийн бодож олсон байршил, өрнөл, дүрүүд, тоглоомын механикаар байнга хязгаарлагддаг. Тиймээс би үүнийг ойлгосон ...

... зөвхөн надад захирагдах өөрийн ертөнцийг бүтээх цаг болжээ. Би Эцэг, Хүү, Ариун Сүнс байдаг ертөнцүүд!

Та өөрийн тоглоомын хөдөлгүүр болон түүн дээр тоглоом бичснээр нүдээ нээж, цонхоо арчиж, бүхээгээ шахаж, илүү туршлагатай, салшгүй програмист болно гэдэгт би чин сэтгэлээсээ итгэдэг.

Энэ нийтлэлд би C / C ++ хэл дээр хэрхэн жижиг тоглоом бичиж эхэлсэн, хөгжүүлэх үйл явц гэж юу вэ, завгүй орчинд хобби хийх цагийг хаанаас олохыг хэлэхийг хичээх болно. Энэ нь субъектив бөгөөд хувь хүний ​​эхлэлийн үйл явцыг дүрсэлдэг. Мунхаг ба итгэлийн тухай материал, миний одоогийн ертөнцийн талаарх хувийн дүр төрх. Өөрөөр хэлбэл, "Захиргаа таны хувийн тархийг хариуцахгүй!".

Практик

"Бясалгалгүй мэдлэг нь ашиггүй, мэдлэггүй бол аюултай." Күнз

Миний дэвтэр бол миний амьдрал!


Тиймээс практик дээр миний хувьд бүх зүйл дэвтэрээс эхэлдэг гэж хэлж болно. Би тэнд зөвхөн өдөр тутмын ажлаа бичээд зогсохгүй, зурж, программчилж, схем зурж, математикийн асуудлыг оролцуулан бодлого шийдвэрлэдэг. Үргэлж тэмдэглэлийн дэвтэр хэрэглэж, зөвхөн харандаагаар бичээрэй. Энэ нь цэвэрхэн, тав тухтай, найдвартай, IMHO.

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Миний (аль хэдийн дүүргэсэн) дэвтэр. Энэ нь иймэрхүү харагдаж байна. Энэ нь өдөр тутмын ажил, санаа, зураг, схем, шийдэл, хар бүртгэл, код гэх мэт зүйлсийг агуулдаг.

Энэ үе шатанд би гурван төслийг дуусгаж чадсан (энэ нь миний "эцсийн" тухай ойлголт юм, учир нь аливаа бүтээгдэхүүнийг харьцангуй төгсгөлгүй боловсруулж болно).

  • Төсөл 0: Энэ бол Unity тоглоомын хөдөлгүүрийг ашиглан C# хэл дээр бичигдсэн Architect Demo 3D дүр зураг юм. MacOS болон Windows платформуудад зориулагдсан.
  • Тоглоом 1: Windows-д зориулсан Simple Snake (бүгд "Могой" гэж нэрлэдэг) консол тоглоом. C дээр бичсэн.
  • Тоглоом 2: Консол тоглоом Crazy Tanks (бүх хүн "Tanks" гэж нэрлэдэг), аль хэдийн C ++ (анги ашиглан) болон Windows дээр бичигдсэн.

Төслийн 0 Архитектор Демо

  • Платформ: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Хэл: C#
  • Тоглоомын хөдөлгүүр: Эв нэгдэл
  • Урам зориг: Даррин Лил
  • Хадгалах газар: GitHub

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
3D Scene Architect Demo

Эхний төсөл нь C/C++ хэл дээр биш харин C# хэл дээр Unity тоглоомын системийг ашиглан хэрэгжсэн. Энэ хөдөлгүүр нь техник хангамжид тийм ч их шаардлага тавьдаггүй байв Үнэмлэхүй хөдөлгүүр, мөн надад суулгах, ашиглахад хялбар мэт санагдсан. Би бусад хөдөлгүүрүүдийг анхаарч үзээгүй.

Миний хувьд Unity дахь зорилго бол ямар нэгэн тоглоом хөгжүүлэх явдал биш байсан. Би ямар нэгэн дүртэй 3D дүр бүтээхийг хүссэн. Тэр, эс тэгвээс Тэр (би дурласан охиноо загварчилж байсан =) хөдөлж, гадаад ертөнцтэй харилцах ёстой байв. Гагцхүү Эв нэгдэл гэж юу болох, хөгжлийн үйл явц гэж юу болох, ямар нэг зүйлийг бүтээхийн тулд хичнээн их хүч хөдөлмөр шаардагдахыг ойлгох нь чухал байв. Архитектор Демо төсөл ингэж төрсөн (энэ нэрийг бараг л хоосон үгнээс гаргаж авсан). Програмчлал, загварчлал, хөдөлгөөнт дүрс, текстур хийхэд надад хоёр сарын өдөр тутмын ажил хэрэгтэй байсан.

Би YouTube дээрх 3D загваруудыг хэрхэн бүтээх талаар зааварчилгааны видео бичлэгүүдээр эхэлсэн Blender. Blender бол суулгах шаардлагагүй 3D загварчлал (болон бусад) маш сайн үнэгүй хэрэгсэл юм. Энд намайг цочрол хүлээж байв ... Загварчлал, хөдөлгөөнт дүрс, текстура нь таны ном бичиж болох асар том тусдаа сэдэв юм. Энэ нь ялангуяа дүрүүдийн хувьд үнэн юм. Хуруу, шүд, нүд болон биеийн бусад хэсгийг загварчлахын тулд танд анатомийн мэдлэг хэрэгтэй болно. Нүүрний булчингууд хэрхэн байрладаг вэ? Хүмүүс хэрхэн хөдөлдөг вэ? Би гар, хөл, хуруу, үе мөч бүрт яс "оруулах" шаардлагатай болсон!

Эгэмний яс, нэмэлт ясны хөшүүргийг загварчлаарай, ингэснээр хөдөлгөөнт дүрс нь байгалийн харагдах болно. Ийм хичээлийн дараа та хүүхэлдэйн кино бүтээгчид ердөө 30 секундын видео бүтээхэд ямар их ажил хийдгийг ойлгодог. Гэхдээ 3D кино хэдэн цаг үргэлжилдэг! Тэгээд бид театруудаас гарч ирээд: "Та, новшийн хүүхэлдэйн кино / кино! Тэд илүү сайн хийж чадах байсан..." Тэнэгүүд!

Мөн энэ төслийн програмчлалын талаар бас нэг зүйл. Миний хувьд хамгийн сонирхолтой хэсэг нь математик байсан. Хэрэв та дүр зургийг (төслийн тайлбар дахь агуулах руу холбоно уу) ажиллуулбал камер бөмбөрцөг хэлбэрээр охины дүрийг тойрон эргэлдэж байгааг анзаарах болно. Ийм камерын эргэлтийг програмчлахын тулд эхлээд тойрог (2D), дараа нь бөмбөрцөг (3D) дээрх байрлалын цэгийн координатыг тооцоолох шаардлагатай болсон. Хамгийн инээдтэй нь би сургуульд байхдаа математикийг үзэн ядаж, хасахтай мэддэг байсан. Зарим талаараа магадгүй, сургуульд байхдаа тэд энэ математикийг амьдралд хэрхэн ашигладаг талаар тайлбарладаггүй. Гэхдээ та зорилгодоо хэт автаж, мөрөөддөг бол оюун ухаан цэвэрлэгдэж, илчлэгддэг! Мөн та нарийн төвөгтэй ажлуудыг сэтгэл хөдөлгөм адал явдал гэж ойлгож эхэлдэг. Дараа нь та: "За, яагаад *хайрт* математикч эдгээр томьёог хаана тулгуурлаж болохыг хэлж чаддаггүй юм бэ?" гэж бодож байна.

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Тойрог ба бөмбөрцөг дээрх цэгийн координатыг тооцоолох томъёоны тооцоо (миний дэвтэрээс)

Тоглоом 1

  • Платформ: Windows (Windows 7, 10 дээр туршсан)
  • Хэл: Цэвэр С үсгээр бичсэн байх гэж бодож байна
  • Тоглоомын хөдөлгүүр: Windows консол
  • Урам зориг: javidx9
  • Хадгалах газар: GitHub

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Энгийн могой тоглоом

3D дүр зураг бол тоглоом биш. Нэмж дурдахад 3D объектыг (ялангуяа дүрүүдийг) загварчлах, хөдөлгөөн хийх нь урт бөгөөд хэцүү байдаг. Unity-тэй тоглосныхоо дараа би үндсээс нь үргэлжлүүлэх, эс тэгвээс эхлэх хэрэгтэй гэдгээ ойлгосон. Тоглоомын бүтцийг ойлгохын тулд энгийн бөгөөд хурдан, гэхдээ нэгэн зэрэг дэлхий даяарх зүйл.

Мөн бидэнд энгийн бөгөөд хурдан юу байна вэ? Энэ нь зөв, консол ба 2D. Илүү нарийн, тэр ч байтугай консол болон тэмдэгтүүд. Дахин хэлэхэд би интернетээс урам зориг хайж эхэлсэн (ерөнхийдөө би Интернетийг XNUMX-р зууны хамгийн хувьсгалт, аюултай шинэ бүтээл гэж үздэг). Би консол Тетрис хийсэн нэг програмистын бичлэгийг ухаж үзлээ. Мөн түүний тоглоомын адилаар тэрээр "могой" -ыг таслахаар шийджээ. Видео бичлэгээс би хоёр үндсэн зүйлийн талаар олж мэдсэн - тоглоомын гогцоо (гурван үндсэн функц / хэсэгтэй) ба буфер руу гарах гаралт.

Тоглоомын гогцоо нь иймэрхүү харагдах болно:

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

Код нь үндсэн() функцийг нэг дор харуулна. Тоглоомын мөчлөг нь холбогдох тайлбарын дараа эхэлдэг. Гогцоонд гурван үндсэн функц байдаг: Input(), Logic(), Draw(). Эхлээд өгөгдөл оруулах (голчлон товчлуурын даралтыг хянах), дараа нь оруулсан өгөгдлийг боловсруулах Логик, дараа нь дэлгэц дээр харуулах - Зурах. Тиймээс хүрээ бүр. Хөдөлгөөнт дүрсийг ийм байдлаар бүтээдэг. Яг л хүүхэлдэйн кино шиг. Ихэвчлэн оролтын өгөгдлийг боловсруулах нь хамгийн их цаг хугацаа шаарддаг бөгөөд миний мэдэж байгаагаар тоглоомын фрэймийн хурдыг тодорхойлдог. Гэхдээ энд Logic() функц маш хурдан ажилладаг. Тиймээс фрэймийн хурдыг Sleep() функцээр энэ хурдыг тодорхойлдог gameSpeed ​​параметрээр хянах ёстой.

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
тоглоомын мөчлөг. Тэмдэглэлийн дэвтэр дээрх могойн програмчлал

Хэрэв та бэлгэдлийн консол тоглоомыг хөгжүүлж байгаа бол ердийн урсгалын гаралтыг "cout" ашиглан дэлгэц дээр харуулах нь ажиллахгүй - энэ нь маш удаан юм. Тиймээс гаралтыг дэлгэцийн буферт хийх ёстой. Илүү хурдан бөгөөд тоглоом ямар ч алдаагүй ажиллах болно. Үнэнийг хэлэхэд би дэлгэцийн буфер гэж юу болох, хэрхэн ажилладагийг сайн ойлгохгүй байна. Гэхдээ би энд кодын жишээ өгөх болно, магадгүй тайлбарт байгаа хэн нэгэн нөхцөл байдлыг тодруулах боломжтой байх болно.

Дэлгэцийн буферийг авч байна (хэрэв би ингэж хэлж чадвал):

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

Тодорхой онооны шугамын дэлгэц рүү шууд гаралт (оноо харуулах мөр):

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

Онолын хувьд энэ тоглоомонд ямар ч төвөгтэй зүйл байхгүй, энэ нь анхан шатны түвшний тоглоомын сайн жишээ юм шиг санагдаж байна. Код нь нэг файлд бичигдсэн бөгөөд хэд хэдэн функцээр зохион байгуулагдсан. Анги байхгүй, өв залгамжлал байхгүй. Та өөрөө GitHub дээрх репозитор руу орж тоглоомын эх кодын бүх зүйлийг харах боломжтой.

Тоглоом 2 Галзуу танк

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Crazy Tanks тоглоом

Консол дээр тэмдэгт хэвлэх нь тоглоом болгон хувиргах хамгийн энгийн зүйл байж магадгүй юм. Гэхдээ дараа нь нэг асуудал гарч ирнэ: тэмдэгтүүд өөр өөр өндөр, өргөнтэй байдаг (өндөр нь өргөнөөс их). Тиймээс бүх зүйл пропорциональ бус харагдах бөгөөд доош эсвэл дээш шилжих нь зүүн эсвэл баруун тийш шилжихээс хамаагүй хурдан мэт санагдах болно. Энэ нөлөө нь "Могой" (Тоглоом 1) -д маш мэдэгдэхүйц юм. "Танк" (Тоглоом 2) нь дэлгэцийн пикселийг өөр өөр өнгөөр ​​будах замаар гаралт нь зохион байгуулагдсан тул ийм сул тал байхгүй. Би рэндэр бичсэн гэж хэлж болно. Үнэн, энэ нь арай илүү төвөгтэй боловч илүү сонирхолтой юм.

Энэ тоглоомын хувьд дэлгэцэн дээр пикселийг харуулах миний системийг тайлбарлахад хангалттай байх болно. Энэ бол тоглоомын гол хэсэг гэж би бодож байна. Мөн бусад бүх зүйлийг та өөрөө бодож олох боломжтой.

Тэгэхээр, дэлгэцэн дээр харж байгаа зүйл бол зүгээр л хөдөлгөөнт өнгөт тэгш өнцөгтүүдийн багц юм.

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Тэгш өнцөгтийн багц

Тэгш өнцөгт бүрийг тоогоор дүүргэсэн матрицаар төлөөлдөг. Дашрамд хэлэхэд, би нэг сонирхолтой нюансыг онцолж чадна - тоглоомын бүх матрицууд нэг хэмжээст массив хэлбэрээр програмчлагдсан байдаг. Хоёр хэмжээст биш, харин нэг хэмжээст! Нэг хэмжээст массивтай ажиллахад илүү хялбар бөгөөд хурдан байдаг.

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Тоглоомын савны матрицын жишээ

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Нэг хэмжээст массив бүхий тоглоомын савны матрицыг төлөөлөх

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Нэг хэмжээст массиваар матриц дүрслэх илүү тод жишээ

Гэхдээ массивын элементүүдэд хандах хандалт нь нэг хэмжээст биш, харин хоёр хэмжээст массив юм шиг давхар гогцоонд тохиолддог. Бид матрицтай ажиллаж байгаа тул үүнийг хийсэн.

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Нэг хэмжээст массивыг давхар гогцоонд шилжүүлэх. Y нь мөр ID, X нь баганын ID юм

Ердийн i, j матриц танигчийн оронд би x ба y танигчийг ашигладаг болохыг анхаарна уу. Тэгэхээр энэ нь нүдэнд илүү тааламжтай, тархинд илүү тод харагдаж байна. Нэмж дурдахад, ийм тэмдэглэгээ нь хоёр хэмжээст зургийн координатын тэнхлэгт ашигласан матрицуудыг хялбархан төлөвлөх боломжийг олгодог.

Одоо пиксел, өнгө, дэлгэцийн тухай. StretchDIBits функцийг (Толгой: windows.h; Номын сан: gdi32.lib) гаралтад ашигладаг. Бусад зүйлсийн дотор дараахь зүйлийг энэ функцэд шилжүүлнэ: дүрсийг харуулах төхөөрөмж (миний хувьд энэ бол Windows консол), зургийг харуулах эхлэлийн координат, түүний өргөн / өндөр, зураг. өөрөө байтуудын массиваар дүрслэгдсэн битийн зураг (битийн зураг) хэлбэрээр. Bitmap нь байтуудын массив!

StretchDIBits() функц ажил дээрээ:

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

Санах ойг VirtualAlloc() функцийг ашиглан энэ битийн зураглалд урьдчилан хуваарилдаг. Өөрөөр хэлбэл, шаардлагатай тооны байт нь бүх пикселийн мэдээллийг хадгалахад зориулагдсан бөгөөд дараа нь дэлгэцэн дээр гарч ирнэ.

m_p_bitmapMemory битмап үүсгэх:

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

Товчоор хэлбэл, битмап нь пикселийн багцаас бүрдэнэ. Массив дахь дөрвөн байт бүр нь RGB пиксел юм. Улаан утга тутамд нэг байт, ногоон утга тутамд нэг байт (G), цэнхэр өнгө (B) тутамд нэг байт. Дээрээс нь догол бүрт нэг байт байна. Эдгээр гурван өнгө - Улаан / Ногоон / Цэнхэр (RGB) нь өөр өөр харьцаатай холилдож, үүссэн пикселийн өнгийг олж авдаг.

Одоо дахин тэгш өнцөгт буюу тоглоомын объект бүрийг тооны матрицаар төлөөлдөг. Эдгээр тоглоомын бүх объектыг цуглуулгад байрлуулсан болно. Дараа нь тэдгээрийг тоглоомын талбар дээр байрлуулж, нэг том тоон матриц үүсгэдэг. Би матриц дахь тоо бүрийг тодорхой өнгөөр ​​дүрсэлсэн. Жишээлбэл, 8-ын тоо нь цэнхэр, 9-ийн тоо нь шар, 10-ын тоо нь хар саарал гэх мэт. Тиймээс бид тоо бүр нь ямар нэгэн өнгөтэй байдаг тоглоомын талбайн матрицтай гэж хэлж болно.

Тиймээс, нэг талаас бид бүхэл бүтэн тоглоомын талбайн тоон матриц, нөгөө талаас дүрсийг харуулах битмап байна. Одоогийн байдлаар битмап нь "хоосон" байна - энэ нь хүссэн өнгөний пикселийн талаар мэдээлэлгүй байна. Энэ нь эцсийн алхам нь тоглоомын талбарын тоон матриц дээр үндэслэн пиксел бүрийн талаарх мэдээллээр битмапийг дүүргэх болно гэсэн үг юм. Ийм өөрчлөлтийн жишээг доорх зурагт үзүүлэв.

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Тоглоомын талбарын тоон матриц (дижитал матриц) дээр суурилсан мэдээллээр битмап (пикселийн матриц) бөглөх жишээ (өнгөт индексүүд тоглоомын индекстэй таарахгүй байна)

Би бас тоглоомноос бодит кодын хэсгийг танилцуулах болно. Давталтын давталт бүрийн colorIndex хувьсагч нь тоглоомын талбарын тоон матрицаас (mainDigitalMatrix) утгыг (өнгөт индекс) оноодог. Дараа нь өнгө нь өөрөө индекс дээр үндэслэн өнгөт хувьсагч руу бичигддэг. Цаашилбал, үүссэн өнгийг улаан, ногоон, цэнхэр (RGB) харьцаанд хуваана. Мөн доголын (pixelPadding) хамт энэ мэдээллийг пиксел рүү дахин дахин бичиж, битмап дээр өнгөт дүрс үүсгэдэг.

Код нь заагч болон битийн үйлдлүүдийг ашигладаг бөгөөд үүнийг ойлгоход хэцүү байдаг. Тиймээс би ийм бүтэц хэрхэн ажилладаг талаар хаа нэгтээ тусад нь уншихыг зөвлөж байна.

Тоглоомын талбарын тоон матриц дээр суурилсан мэдээллээр битийн зургийг бөглөх:

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

Дээр дурдсан аргын дагуу Crazy Tanks тоглоомонд нэг зураг (хүрээ) үүсч Draw() функцээр дэлгэцэн дээр гарч ирдэг. Input() функцэд товчлуурын даралтыг бүртгэж, дараа нь Logic() функцэд боловсруулсны дараа шинэ зураг (хүрээ) үүснэ. Тоглоомын объектууд тоглоомын талбар дээр аль хэдийн өөр байр суурьтай байж болох бөгөөд үүний дагуу өөр газар зурсан байж магадгүй юм. Хөдөлгөөнт дүрс (хөдөлгөөн) ийм байдлаар явагддаг.

Онолын хувьд (хэрэв та юу ч мартаагүй бол) эхний тоглолтын ("Могой") тоглоомын гогцоо, хоёр дахь тоглолтын дэлгэцэн дээр пикселийг харуулах системийг ("Танк") ойлгох нь танд ямар нэгэн зүйл бичихэд хангалттай. Windows-д зориулсан 2D тоглоомуудын . Дуугүй! 😉 Үлдсэн хэсэг нь зүгээр л гоёмсог нислэг юм.

Мэдээжийн хэрэг, "Танк" тоглоом нь "Могой" тоглоомоос хамаагүй илүү төвөгтэй байдаг. Би аль хэдийн C++ хэлийг ашигласан, өөрөөр хэлбэл өөр өөр тоглоомын объектуудыг ангиудтай дүрсэлсэн. Би өөрийнхөө цуглуулгыг бий болгосон - та кодыг headers/Box.h хэсгээс харж болно. Дашрамд дурдахад, цуглуулгад санах ой алдагдсан байх магадлалтай. Ашигласан заагч. Ой санамжтай ажилласан. Энэ ном надад маш их тусалсан гэдгийг хэлэх ёстой. Тоглоомын програмчлалаар дамжуулан C++-ийн эхлэл. Энэ бол C++ хэл дээр анхлан суралцагчдад маш сайн эхлэл юм. Энэ нь жижиг, сонирхолтой, зохион байгуулалт сайтай.

Энэ тоглоомыг боловсруулахад ойролцоогоор зургаан сар зарцуулсан. Би ажил дээрээ үдийн хоол, зуушны үеэр голчлон бичдэг байсан. Тэрээр оффисын гал тогоонд суугаад хоолондоо гишгэж, код бичжээ. Эсвэл гэртээ оройн хоол идээрэй. Тиймээс би ийм "гал тогооны дайн"-тай болсон. Би үргэлж тэмдэглэлийн дэвтэр идэвхтэй ашигладаг байсан бөгөөд бүх концепцийн зүйлс түүн дотроос төрсөн.

Практик хэсгийн төгсгөлд би дэвтэрийнхээ хэд хэдэн сканнерыг гаргана. Би яг юу бичиж, зурж, тоолж, зохиож байгаагаа харуулахын тулд ...

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Танкны зургийн дизайн. Дэлгэц дээр танк тус ​​бүр хэдэн пиксел эзлэх ёстой гэсэн тодорхойлолт

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Савыг тэнхлэгээ тойрон эргүүлэх алгоритм ба томъёоны тооцоо

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Миний цуглуулгын диаграмм (санах ой алдагдсан байх магадлалтай). Цуглуулга нь Холбоотой жагсаалт хэлбэрээр бүтээгдсэн

DevOps C++ болон "гал тогооны дайн", эсвэл хоол идэж байхдаа хэрхэн тоглоом бичиж эхэлсэн бэ?
Эдгээр нь хиймэл оюун ухааныг тоглоомд оруулах гэсэн дэмий оролдлого юм

Онол

"Мянган бээрийн аялал ч гэсэн эхний алхамаас эхэлдэг" (Эртний Хятадын мэргэн ухаан)

Практикаас онол руу шилжье! Та хоббидоо хэрхэн цаг гаргадаг вэ?

  1. Та үнэхээр юу хүсч байгаагаа тодорхойл (харамсалтай, энэ бол хамгийн хэцүү).
  2. Тэргүүлэх чиглэлээ тогтоо.
  3. Илүү өндөр ач холбогдол өгөхийн тулд "илүүдэл" бүхнийг золиосол.
  4. Зорилгодоо өдөр бүр урагшил.
  5. Хобби хийхэд хоёр, гурван цаг чөлөөт цаг гарна гэж найдаж болохгүй.

Нэг талаас та юу хүсч байгаагаа тодорхойлж, эрэмбэлэх хэрэгтэй. Нөгөөтэйгүүр, эдгээр тэргүүлэх чиглэлийн зарим хэрэг / төслүүдээс татгалзаж болно. Өөрөөр хэлбэл, "илүүдэл" бүхнийг золиослох хэрэгтэй болно. Амьдралд дээд тал нь гурван үндсэн үйл ажиллагаа байх ёстой гэж хаа нэгтээ сонссон. Дараа нь та тэдэнтэй хамгийн сайн аргаар харьцах боломжтой болно. Мөн нэмэлт төслүүд / чиглэлүүд нь corny-ийг хэт ачаалж эхлэх болно. Гэхдээ энэ бүхэн магадгүй субъектив, хувь хүн юм.

Тодорхой алтан дүрэм байдаг: хэзээ ч 0% өдөр бүү бай! Би энэ тухай инди хөгжүүлэгчийн нийтлэлээс олж мэдсэн. Хэрэв та ямар нэгэн төсөл дээр ажиллаж байгаа бол өдөр бүр энэ талаар ямар нэг зүйл хий. Мөн та хэр их мөнгө хийх нь хамаагүй. Нэг үг эсвэл нэг мөр код бич, нэг сургалтын видео үзээрэй, эсвэл самбар руу нэг хадаас алх - зүгээр л ямар нэг зүйл хий. Хамгийн хэцүү зүйл бол эхлэх явдал юм. Нэгэнт та хүссэнээсээ арай илүү зүйлийг хийх болно. Тиймээс та зорилгодоо байнга урагшлах болно, надад итгээрэй, маш хурдан. Эцсийн эцэст бүх зүйлийн гол тоормос бол хойшлуулах явдал юм.

Мөн та 5, 10, 15 минутын дотор цаг хугацааны үнэгүй "үртсэн" -ийг дутуу үнэлж, үл тоомсорлож, нэг эсвэл хоёр цаг үргэлжилсэн том "логуудыг" хүлээх ёсгүй гэдгийг санах нь чухал юм. Та дараалалд зогсож байна уу? Төсөлдөө ямар нэг зүйлийн талаар бодож үзээрэй. Та урсдаг шатаар өгсөж байна уу? Тэмдэглэлийн дэвтэрт ямар нэг зүйлийг бич. Та автобусанд хоол иддэг үү? За, нийтлэл уншина уу. Боломж бүрийг ашигла. YouTube дээр муур, нохой үзэхээ боль! Тархиа битгий хутгаарай!

Тэгээд сүүлчийнх. Хэрэв энэ нийтлэлийг уншсаны дараа танд тоглоомын хөдөлгүүр ашиглахгүйгээр тоглоом бүтээх санаа таалагдсан бол Кэйси Муратори нэрийг санаарай. Энэ залууд байна вэбсайт. "Үзэх -> ӨМНӨХ АНГИ" хэсгээс та мэргэжлийн тоглоомыг эхнээс нь хэрхэн бүтээх тухай гайхалтай үнэгүй видео хичээлүүдийг үзэх болно. Та Windows-д зориулсан "Intro to C"-ийн таван хичээлээр их сургуульд таван жил суралцсанаас илүү ихийг мэдэж болно (энэ тухай хэн нэгэн видеоны доор сэтгэгдэл дээр бичсэн).

Кейси мөн өөрийн тоглоомын хөдөлгүүрийг хөгжүүлснээр та одоо байгаа хөдөлгүүрүүдийн талаар илүү сайн ойлголттой болно гэж тайлбарлав. Хүн бүр автоматжуулах гэж оролддог фреймворкийн ертөнцөд та ашиглах биш бүтээх аргад суралцах болно. Компьютерийн мөн чанарыг ойлгох. Мөн та илүү ухаалаг, төлөвшсөн програмист болох болно.

Таны сонгосон замд амжилт хүсье! Мөн дэлхийг илүү мэргэжлийн болгоцгооё.

Зохиогч: Гранкин Андрей, DevOps



Эх сурвалж: www.habr.com