DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்

"எனக்கு எதுவும் தெரியாது என்று எனக்குத் தெரியும்" சாக்ரடீஸ்

யாருக்காக: அனைத்து டெவலப்பர்களையும் பற்றி கவலைப்படாத மற்றும் அவர்களின் கேம்களை விளையாட விரும்பும் IT நபர்களுக்கு!

எதை பற்றி: C/C++ இல் கேம்களை எழுதத் தொடங்குவது எப்படி, திடீரென்று தேவைப்பட்டால்!

இதை ஏன் படிக்க வேண்டும்: பயன்பாட்டு மேம்பாடு எனது நிபுணத்துவம் அல்ல, ஆனால் நான் ஒவ்வொரு வாரமும் குறியீடு செய்ய முயற்சிக்கிறேன். ஏனென்றால் நான் விளையாட்டுகளை விரும்புகிறேன்!

வணக்கம் என் பெயர் ஆண்ட்ரி கிரான்கின், நான் Luxoft இல் DevOps. பயன்பாட்டு மேம்பாடு எனது சிறப்பு அல்ல, ஆனால் நான் ஒவ்வொரு வாரமும் குறியீடு செய்ய முயற்சிக்கிறேன். ஏனென்றால் நான் விளையாட்டுகளை விரும்புகிறேன்!

கணினி கேமிங் துறை மிகப்பெரியது, இன்று திரைப்படத் துறையை விட பெரியதாக வதந்தி பரவுகிறது. நவீன தரநிலைகள், சிக்கலான மற்றும் அடிப்படை மேம்பாட்டு முறைகளைப் பயன்படுத்தி, கணினிகள் தோன்றிய காலத்திலிருந்தே விளையாட்டுகள் எழுதப்பட்டுள்ளன. காலப்போக்கில், ஏற்கனவே திட்டமிடப்பட்ட கிராபிக்ஸ், இயற்பியல் மற்றும் ஒலியுடன் கூடிய விளையாட்டு இயந்திரங்கள் தோன்றத் தொடங்கின. விளையாட்டை மேம்படுத்துவதில் கவனம் செலுத்தவும், அதன் அடித்தளத்தைப் பற்றி கவலைப்படாமல் இருக்கவும் அவை உங்களை அனுமதிக்கின்றன. ஆனால் அவர்களுடன் சேர்ந்து, என்ஜின்களுடன், டெவலப்பர்கள் "குருடு" மற்றும் சீரழிந்து போகிறார்கள். கேம்களின் உற்பத்தியே கன்வேயர் பெல்ட்டில் வைக்கப்படுகிறது. மேலும் தயாரிப்புகளின் அளவு அதன் தரத்தை விட மேலோங்கத் தொடங்குகிறது.

அதே நேரத்தில், மற்றவர்களின் கேம்களை விளையாடும் போது, ​​மற்றவர்கள் கொண்டு வந்த இடங்கள், கதைக்களம், கதாபாத்திரங்கள் மற்றும் கேம் மெக்கானிக்ஸ் ஆகியவற்றால் நாம் தொடர்ந்து வரையறுக்கப்படுகிறோம். அதனால் நான் அதை உணர்ந்தேன் ...

... எனக்கு மட்டுமே உட்பட்ட எனது சொந்த உலகங்களை உருவாக்கும் நேரம் வந்துவிட்டது. நான் தந்தை, மகன் மற்றும் பரிசுத்த ஆவியான உலகங்கள்!

உங்கள் சொந்த கேம் எஞ்சினை எழுதி அதில் விளையாடுவதன் மூலம், உங்கள் காலணிகளை கழற்றவும், ஜன்னல்களைத் துடைக்கவும், உங்கள் கேபினை மேம்படுத்தவும், மிகவும் அனுபவம் வாய்ந்த மற்றும் முழுமையான புரோகிராமராக மாற முடியும் என்று நான் உண்மையாக நம்புகிறேன்.

இந்த கட்டுரையில் நான் சி/சி++ இல் எப்படி சிறிய கேம்களை எழுத ஆரம்பித்தேன், வளர்ச்சி செயல்முறை எப்படி இருக்கிறது, பிஸியான சூழலில் ஒரு பொழுதுபோக்கிற்கான நேரத்தை எங்கே தேடுகிறேன் என்பதைச் சொல்ல முயற்சிப்பேன். இது அகநிலை மற்றும் ஒரு தனிப்பட்ட தொடக்கத்தின் செயல்முறையை விவரிக்கிறது. அறியாமை மற்றும் நம்பிக்கை பற்றிய பொருள், இந்த நேரத்தில் உலகத்தைப் பற்றிய எனது தனிப்பட்ட படம். வேறு வார்த்தைகளில் கூறுவதானால், "உங்கள் தனிப்பட்ட மூளைக்கு நிர்வாகம் பொறுப்பல்ல!"

பயிற்சி

"பயிற்சி இல்லாத அறிவு பயனற்றது, அறிவு இல்லாத பயிற்சி ஆபத்தானது" கன்பூசியஸ்

என் குறிப்பேடு என் உயிர்!


எனவே, நடைமுறையில், எனக்கு எல்லாம் ஒரு நோட்பேடில் தொடங்குகிறது என்று சொல்லலாம். அங்கு எனது அன்றாட பணிகளை எழுதுவது மட்டுமின்றி, வரைதல், நிரல், வரைபடங்களை வடிவமைத்தல் மற்றும் கணிதம் உள்ளிட்ட சிக்கல்களைத் தீர்க்கிறேன். எப்பொழுதும் நோட்பேடை உபயோகித்து பென்சிலில் மட்டும் எழுதுங்கள். இது சுத்தமானது, வசதியானது மற்றும் நம்பகமானது, IMHO.

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
எனது (ஏற்கனவே நிரப்பப்பட்ட) நோட்புக். இப்படித்தான் பார்க்கிறார். இது அன்றாட பணிகள், யோசனைகள், வரைபடங்கள், வரைபடங்கள், தீர்வுகள், கருப்பு புத்தக பராமரிப்பு, குறியீடு மற்றும் பலவற்றைக் கொண்டுள்ளது.

இந்த கட்டத்தில், நான் மூன்று திட்டங்களை முடிக்க முடிந்தது (இது "முழுமை" பற்றிய எனது புரிதலில் உள்ளது, ஏனென்றால் எந்தவொரு தயாரிப்பையும் ஒப்பீட்டளவில் முடிவில்லாமல் உருவாக்க முடியும்).

  • திட்டம் 0: இது யூனிட்டி கேம் எஞ்சினைப் பயன்படுத்தி C# இல் எழுதப்பட்ட 3D ஆர்கிடெக்ட் டெமோ காட்சி. MacOS மற்றும் Windows இயங்குதளங்களுக்கு.
  • விளையாட்டு 1: Windows க்கான கன்சோல் கேம் எளிய பாம்பு (அனைவருக்கும் "பாம்பு" என்று தெரியும்). C இல் எழுதப்பட்டது.
  • விளையாட்டு 2: கன்சோல் கேம் Crazy Tanks (அனைவருக்கும் "டாங்கிகள்" எனத் தெரியும்), C++ (வகுப்புகளைப் பயன்படுத்தி) மற்றும் விண்டோஸிற்காக எழுதப்பட்டது.

திட்டம் 0. கட்டிடக் கலைஞர் டெமோ

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
3D காட்சி கட்டிட டெமோ

முதல் திட்டம் C/C++ இல் அல்ல, Unity விளையாட்டு இயந்திரத்தைப் பயன்படுத்தி C# இல் செயல்படுத்தப்பட்டது. இந்த இயந்திரம் வன்பொருளில் கோரப்படவில்லை உண்மையற்ற இயந்திரம், மற்றும் நிறுவ மற்றும் பயன்படுத்த எளிதாக தோன்றியது. மற்ற என்ஜின்களை நான் கருத்தில் கொள்ளவில்லை.

ஒற்றுமையில் எனது குறிக்கோள் ஒரு விளையாட்டை வளர்ப்பது அல்ல. சில கதாபாத்திரங்களுடன் 3டி காட்சியை உருவாக்க விரும்பினேன். அவன், அல்லது அவள் (நான் காதலித்த பெண்ணை மாதிரியாகக் கொண்டேன் =) அவனைச் சுற்றியுள்ள உலகத்துடன் நகர்ந்து தொடர்பு கொள்ள வேண்டும். ஒற்றுமை என்றால் என்ன, வளர்ச்சி செயல்முறை என்ன மற்றும் ஒன்றை உருவாக்க எவ்வளவு முயற்சி தேவை என்பதைப் புரிந்துகொள்வது மட்டுமே முக்கியம். ஆர்கிடெக்ட் டெமோ திட்டம் பிறந்தது இப்படித்தான் (பெயர் கிட்டத்தட்ட எங்கும் கண்டுபிடிக்கப்பட்டது). ப்ரோகிராமிங், மாடலிங், அனிமேஷன், டெக்ஸ்ச்சரிங் என இரண்டு மாதங்கள் தினசரி வேலை எடுத்தது.

3டி மாடல்களை உருவாக்குவது குறித்த டுடோரியல் வீடியோக்களை யூடியூப்பில் தொடங்கினேன் பிளெண்டர். பிளெண்டர் என்பது 3D மாடலிங்கிற்கான (மேலும் பல) சிறந்த இலவச கருவியாகும், இது நிறுவல் தேவையில்லை. இங்கே எனக்கு ஒரு அதிர்ச்சி காத்திருந்தது... மாடலிங், அனிமேஷன், டெக்ஸ்ச்சரிங் ஆகியவை நீங்கள் புத்தகங்களை எழுதக்கூடிய பெரிய தனித்தனி தலைப்புகள் என்று மாறிவிடும். இது கதாபாத்திரங்களுக்கு குறிப்பாக உண்மை. விரல்கள், பற்கள், கண்கள் மற்றும் பிற உடல் பாகங்களை மாதிரியாக்க, உங்களுக்கு உடற்கூறியல் அறிவு தேவை. முக தசைகள் எவ்வாறு கட்டமைக்கப்படுகின்றன? மக்கள் எப்படி நகர்கிறார்கள்? ஒவ்வொரு கை, கால், விரல், விரல்களின் ஃபாலாங்க்ஸ் ஆகியவற்றிலும் நான் எலும்புகளை "செருக" வேண்டியிருந்தது!

அனிமேஷனை இயற்கையாகக் காட்ட, காலர்போன்கள் மற்றும் கூடுதல் நெம்புகோல் எலும்புகளை மாதிரியாக்குங்கள். அத்தகைய பாடங்களுக்குப் பிறகு, அனிமேஷன் திரைப்படங்களை உருவாக்கியவர்கள் 30 வினாடிகள் வீடியோவை உருவாக்க எவ்வளவு வேலை செய்கிறார்கள் என்பதை நீங்கள் புரிந்துகொள்கிறீர்கள். ஆனால் 3டி படங்கள் மணிக்கணக்கில் நீடிக்கும்! பின்னர் நாங்கள் திரையரங்குகளை விட்டு வெளியேறி இதுபோன்ற ஒன்றைச் சொல்கிறோம்: “அது ஒரு மோசமான கார்ட்டூன்/திரைப்படம்! அவர்கள் இன்னும் சிறப்பாகச் செய்திருக்கலாம்..." முட்டாள்களே!

இந்த திட்டத்தில் நிரலாக்கத்தைப் பற்றி மேலும் ஒரு விஷயம். அது முடிந்தவுடன், எனக்கு மிகவும் சுவாரஸ்யமான பகுதி கணிதம். நீங்கள் காட்சியை இயக்கினால் (திட்ட விளக்கத்தில் உள்ள களஞ்சியத்திற்கான இணைப்பு), கேமரா ஒரு கோளத்தில் பெண் கதாபாத்திரத்தைச் சுற்றி சுழல்வதை நீங்கள் கவனிப்பீர்கள். கேமராவின் அத்தகைய சுழற்சியை நிரல் செய்ய, நான் முதலில் வட்டத்தில் (2D), பின்னர் கோளத்தில் (3D) நிலைப் புள்ளியின் ஆயங்களை கணக்கிட வேண்டும். இதில் வேடிக்கை என்னவென்றால், நான் பள்ளியில் கணிதத்தை வெறுத்தேன், அதை சி-மைனஸுடன் அறிந்தேன். ஓரளவிற்கு, அநேகமாக, ஏனென்றால் பள்ளியில் இந்த கணிதம் வாழ்க்கையில் எவ்வாறு பயன்படுத்தப்படுகிறது என்பதை அவர்கள் உங்களுக்கு விளக்கவில்லை. ஆனால் உங்கள் இலக்கு, உங்கள் கனவு ஆகியவற்றில் நீங்கள் வெறித்தனமாக இருக்கும்போது, ​​உங்கள் மனம் தெளிவடைந்து திறக்கிறது! கடினமான பணிகளை ஒரு அற்புதமான சாகசமாக நீங்கள் உணர ஆரம்பிக்கிறீர்கள். பின்னர் நீங்கள் நினைக்கிறீர்கள்: "சரி, உங்களுக்குப் பிடித்த* கணிதவியலாளர் ஏன் இந்த சூத்திரங்களை எங்கு பயன்படுத்தலாம் என்று உங்களுக்குச் சொல்ல முடியவில்லை?"

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
ஒரு வட்டம் மற்றும் ஒரு கோளத்தின் மீது ஒரு புள்ளியின் ஆயங்களை கணக்கிடுவதற்கான சூத்திரங்களின் கணக்கீடு (எனது குறிப்பேட்டில் இருந்து)

விளையாட்டு 1. எளிய பாம்பு

  • நடைமேடை: விண்டோஸ் (விண்டோஸ் 7, 10 இல் சோதிக்கப்பட்டது)
  • மொழி: நான் அதை சுத்தமான C இல் எழுதினேன் என்று நினைக்கிறேன்
  • விளையாட்டு இயந்திரம்: விண்டோஸ் கன்சோல்
  • உத்வேகம்: javidx9
  • களஞ்சியம்: மகிழ்ச்சியா

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
எளிய பாம்பு விளையாட்டு

ஒரு 3D காட்சி ஒரு விளையாட்டு அல்ல. கூடுதலாக, 3D பொருட்களை (குறிப்பாக எழுத்துக்கள்) மாடலிங் மற்றும் அனிமேஷன் செய்வது நேரத்தைச் செலவழிப்பது மற்றும் கடினமானது. யூனிட்டியுடன் விளையாடிய பிறகு, நான் அடிப்படையிலிருந்து தொடர வேண்டும் அல்லது தொடங்க வேண்டும் என்பதை உணர்ந்தேன். எளிமையான மற்றும் வேகமான ஒன்று, ஆனால் அதே நேரத்தில் உலகளாவியது, விளையாட்டுகளின் கட்டமைப்பைப் புரிந்துகொள்வது.

எளிமையானது மற்றும் விரைவானது எது? அது சரி, கன்சோல் மற்றும் 2டி. இன்னும் துல்லியமாக, பணியகம் மற்றும் சின்னங்கள் கூட. மீண்டும் நான் இணையத்தில் உத்வேகத்தைத் தேடினேன் (பொதுவாக, இணையம் XNUMX ஆம் நூற்றாண்டின் மிகவும் புரட்சிகரமான மற்றும் ஆபத்தான கண்டுபிடிப்பு என்று நான் நினைக்கிறேன்). டெட்ரிஸ் கன்சோலை உருவாக்கிய ஒரு புரோகிராமரின் வீடியோவை நான் தோண்டி எடுத்தேன். அவரது விளையாட்டின் தோற்றத்தில் நான் ஒரு "பாம்பு" செய்ய முடிவு செய்தேன். வீடியோவில் இருந்து நான் இரண்டு அடிப்படை விஷயங்களைக் கற்றுக்கொண்டேன் - கேம் லூப் (மூன்று அடிப்படை செயல்பாடுகள்/பகுதிகளுடன்) மற்றும் பஃப்பருக்கான வெளியீடு.

விளையாட்டு வளையம் இப்படி இருக்கலாம்:

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

குறியீடு முழு முக்கிய() செயல்பாட்டையும் ஒரே நேரத்தில் வழங்குகிறது. பொருத்தமான கருத்துக்குப் பிறகு விளையாட்டு சுழற்சி தொடங்குகிறது. லூப்பில் மூன்று அடிப்படை செயல்பாடுகள் உள்ளன: உள்ளீடு(), லாஜிக்(), டிரா(). முதலில், உள்ளீடு தரவு உள்ளீடு (முக்கியமாக விசை அழுத்தங்களின் கட்டுப்பாடு), பின்னர் உள்ளிடப்பட்ட தரவை செயலாக்குகிறது லாஜிக், பின்னர் திரைக்கு வெளியீடு - வரைதல். அதனால் ஒவ்வொரு பிரேமிலும். இப்படித்தான் அனிமேஷன் உருவாக்கப்படுகிறது. இது கார்ட்டூன்களில் உள்ளது போல. பொதுவாக, உள்ளிடப்பட்ட தரவை செயலாக்குவதற்கு அதிக நேரம் எடுக்கும், மேலும் எனக்கு தெரிந்தவரை, விளையாட்டின் பிரேம் வீதத்தை தீர்மானிக்கிறது. ஆனால் இங்கே லாஜிக்() செயல்பாடு மிக விரைவாக இயங்குகிறது. எனவே, இந்த வேகத்தை நிர்ணயிக்கும் கேம்ஸ்பீட் அளவுருவுடன் ஸ்லீப்() செயல்பாட்டைப் பயன்படுத்தி பிரேம் வீதத்தை நீங்கள் கட்டுப்படுத்த வேண்டும்.

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
விளையாட்டு சுழற்சி. ஒரு நோட்பேடில் "பாம்பு" நிரலாக்கம்

நீங்கள் எழுத்து அடிப்படையிலான கன்சோல் கேமை உருவாக்கினால், வழக்கமான 'கவுட்' ஸ்ட்ரீம் வெளியீட்டைப் பயன்படுத்தி உங்களால் திரையில் தரவை வெளியிட முடியாது - இது மிகவும் மெதுவாக இருக்கும். எனவே, வெளியீடு திரை இடையகத்திற்கு அனுப்பப்பட வேண்டும். இது மிகவும் வேகமானது மற்றும் கேம் குறைபாடுகள் இல்லாமல் இயங்கும். உண்மையைச் சொல்வதானால், ஸ்கிரீன் பஃபர் என்றால் என்ன, அது எப்படி வேலை செய்கிறது என்பது எனக்குப் புரியவில்லை. ஆனால் நான் இங்கே ஒரு எடுத்துக்காட்டு குறியீட்டை தருகிறேன், ஒருவேளை கருத்துகளில் யாராவது நிலைமையை தெளிவுபடுத்தலாம்.

ஒரு திரை இடையகத்தைப் பெறுதல் (அவ்வளவு பேசுவதற்கு):

// 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++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
விளையாட்டு கிரேசி டாங்கிகள்

கன்சோலில் எழுத்துக்களை அச்சிடுவது என்பது நீங்கள் விளையாட்டாக மாற்றக்கூடிய எளிய விஷயம். ஆனால் பின்னர் ஒரு சிக்கல் தோன்றுகிறது: சின்னங்கள் வெவ்வேறு உயரங்கள் மற்றும் அகலங்களைக் கொண்டுள்ளன (உயரம் அகலத்தை விட அதிகமாக உள்ளது). இந்த வழியில், எல்லாமே விகிதாச்சாரத்திற்கு அப்பாற்பட்டதாக இருக்கும், மேலும் கீழே அல்லது மேலே நகர்த்துவது இடது அல்லது வலதுபுறம் நகர்வதை விட மிக வேகமாக தோன்றும். இந்த விளைவு பாம்பில் மிகவும் கவனிக்கத்தக்கது (விளையாட்டு 1). "டாங்கிகள்" (விளையாட்டு 2) இந்த குறைபாடு இல்லை, ஏனெனில் அங்கு வெளியீடு வெவ்வேறு வண்ணங்களில் திரை பிக்சல்கள் ஓவியம் மூலம் ஒழுங்கமைக்கப்பட்டது. நான் ஒரு ரெண்டரர் எழுதினேன் என்று நீங்கள் கூறலாம். உண்மை, இது இன்னும் கொஞ்சம் சிக்கலானது, இருப்பினும் மிகவும் சுவாரஸ்யமானது.

இந்த கேமிற்கு, திரையில் பிக்சல்களைக் காண்பிப்பதற்கான எனது சிஸ்டத்தை விவரிப்பது போதுமானதாக இருக்கும். இது விளையாட்டின் முக்கிய பகுதியாக நான் கருதுகிறேன். மற்ற அனைத்தையும் நீங்களே கொண்டு வரலாம்.

எனவே, நீங்கள் திரையில் பார்ப்பது நகரும் பல வண்ண செவ்வகங்களின் தொகுப்பாகும்.

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
செவ்வகங்களின் தொகுப்பு

ஒவ்வொரு செவ்வகமும் எண்களால் நிரப்பப்பட்ட மேட்ரிக்ஸால் குறிக்கப்படுகிறது. மூலம், நான் ஒரு சுவாரஸ்யமான நுணுக்கத்தை முன்னிலைப்படுத்த முடியும் - விளையாட்டில் உள்ள அனைத்து மெட்ரிக்குகளும் ஒரு பரிமாண வரிசையாக திட்டமிடப்பட்டுள்ளன. இரு பரிமாணம் அல்ல, ஒரு பரிமாணம்! ஒரு பரிமாண வரிசைகள் வேலை செய்வது மிகவும் எளிதானது மற்றும் விரைவானது.

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
கேம் டேங்க் மேட்ரிக்ஸின் எடுத்துக்காட்டு

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
ஒரு பரிமாண வரிசையாக கேம் டேங்க் மேட்ரிக்ஸின் பிரதிநிதித்துவம்

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
மேட்ரிக்ஸை ஒரு பரிமாண வரிசையாகக் குறிப்பிடுவதற்கான கூடுதல் காட்சி உதாரணம்

ஆனால் வரிசையின் உறுப்புகளுக்கான அணுகல் இரட்டை வளையத்தில் நிகழ்கிறது, அது ஒரு பரிமாண வரிசை அல்ல, ஆனால் இரு பரிமாணமானது. நாங்கள் இன்னும் மெட்ரிக்குகளுடன் வேலை செய்வதால் இது செய்யப்படுகிறது.

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
ஒரு பரிமாண வரிசையை இரட்டை வளையத்தில் பயணிப்பது. Y - வரிசை அடையாளங்காட்டி, X - நெடுவரிசை அடையாளங்காட்டி

தயவுசெய்து கவனிக்கவும்: வழக்கமான மேட்ரிக்ஸ் அடையாளங்காட்டிகளுக்குப் பதிலாக i, j, நான் x மற்றும் y அடையாளங்காட்டிகளைப் பயன்படுத்துகிறேன். இந்த வழியில், இது கண்ணுக்கு மிகவும் இனிமையானது மற்றும் மூளைக்கு மிகவும் புரிந்துகொள்ளக்கூடியது என்று எனக்குத் தோன்றுகிறது. கூடுதலாக, அத்தகைய குறியீடானது இரு பரிமாண படத்தின் ஒருங்கிணைப்பு அச்சுகளில் பயன்படுத்தப்படும் மெட்ரிக்குகளை வசதியாக திட்டமிடுவதை சாத்தியமாக்குகிறது.

இப்போது பிக்சல்கள், நிறம் மற்றும் திரை வெளியீடு பற்றி. StretchDIBits செயல்பாடு வெளியீட்டிற்குப் பயன்படுத்தப்படுகிறது (தலைப்பு: windows.h; நூலகம்: gdi32.lib). இந்த செயல்பாடு, மற்றவற்றுடன், பின்வருவனவற்றைப் பெறுகிறது: படம் காட்டப்படும் சாதனம் (என் விஷயத்தில், இது விண்டோஸ் கன்சோல்), படக் காட்சியின் தொடக்க ஒருங்கிணைப்புகள், அதன் அகலம் / உயரம் மற்றும் படம் ஒரு பிட்மேப்பின் வடிவம், பைட்டுகளின் வரிசையால் குறிப்பிடப்படுகிறது. பைட் வரிசையாக பிட்மேப்!

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 பிக்சல் ஆகும். சிவப்பு வண்ண மதிப்புக்கு ஒரு பைட், பச்சை வண்ண மதிப்புக்கு ஒரு பைட் (ஜி), மற்றும் நீல வண்ண மதிப்புக்கு ஒரு பைட் (பி). மேலும் உள்தள்ளலுக்கு ஒரு பைட் உள்ளது. இந்த மூன்று நிறங்கள் - சிவப்பு/பச்சை/நீலம் (RGB) - வெவ்வேறு விகிதாச்சாரத்தில் ஒன்றோடொன்று கலந்து அதன் விளைவாக வரும் பிக்சல் நிறத்தை உருவாக்குகிறது.

இப்போது, ​​மீண்டும், ஒவ்வொரு செவ்வகமும் அல்லது விளையாட்டுப் பொருளும் ஒரு எண் அணியால் குறிக்கப்படுகிறது. இந்த விளையாட்டுப் பொருட்கள் அனைத்தும் ஒரு சேகரிப்பில் வைக்கப்பட்டுள்ளன. பின்னர் அவை ஆடுகளத்தில் வைக்கப்பட்டு, ஒரு பெரிய எண் மேட்ரிக்ஸை உருவாக்குகின்றன. மேட்ரிக்ஸில் உள்ள ஒவ்வொரு எண்ணையும் ஒரு குறிப்பிட்ட நிறத்துடன் இணைத்துள்ளேன். எடுத்துக்காட்டாக, எண் 8 நீலம், எண் 9 மஞ்சள், எண் 10 அடர் சாம்பல் மற்றும் பல. எனவே, எங்களிடம் ஆடுகளத்தின் மேட்ரிக்ஸ் உள்ளது என்று சொல்லலாம், அங்கு ஒவ்வொரு எண்ணும் ஒரு வண்ணம்.

எனவே, எங்களிடம் ஒரு பக்கத்தில் முழு விளையாட்டு மைதானத்தின் எண் மேட்ரிக்ஸ் மற்றும் மறுபுறம் படத்தைக் காண்பிப்பதற்கான பிட்மேப் உள்ளது. இதுவரை, பிட்மேப் "வெற்று" - இது இன்னும் விரும்பிய வண்ணத்தின் பிக்சல்கள் பற்றிய தகவலைக் கொண்டிருக்கவில்லை. இதன் பொருள், ஆடுகளத்தின் எண் மேட்ரிக்ஸின் அடிப்படையில் ஒவ்வொரு பிக்சலைப் பற்றிய தகவலுடன் பிட்மேப்பை நிரப்புவதே கடைசிப் படியாகும். அத்தகைய மாற்றத்திற்கான தெளிவான எடுத்துக்காட்டு கீழே உள்ள படத்தில் உள்ளது.

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
ஆடுகளத்தின் டிஜிட்டல் மேட்ரிக்ஸின் அடிப்படையிலான தகவலுடன் பிட்மேப்பை (பிக்சல் மேட்ரிக்ஸ்) நிரப்புவதற்கான எடுத்துக்காட்டு (வண்ண குறியீடுகள் விளையாட்டின் குறியீடுகளுடன் பொருந்தவில்லை)

விளையாட்டிலிருந்து உண்மையான குறியீட்டின் ஒரு பகுதியையும் வழங்குவேன். லூப்பின் ஒவ்வொரு மறு செய்கையிலும் மாறி நிற அட்டவணைக்கு விளையாட்டு மைதானத்தின் (mainDigitalMatrix) எண் மேட்ரிக்ஸிலிருந்து ஒரு மதிப்பு (வண்ண அட்டவணை) ஒதுக்கப்படுகிறது. வண்ண மாறி பின்னர் குறியீட்டின் அடிப்படையில் வண்ணத்திற்கு அமைக்கப்படுகிறது. இதன் விளைவாக வரும் நிறம் சிவப்பு, பச்சை மற்றும் நீலம் (RGB) என்ற விகிதமாக பிரிக்கப்படுகிறது. பிக்சல் பேடிங்குடன் சேர்ந்து, இந்தத் தகவல் பிக்சலில் மீண்டும் மீண்டும் எழுதப்பட்டு, பிட்மேப்பில் வண்ணப் படத்தை உருவாக்குகிறது.

குறியீடு சுட்டிகள் மற்றும் பிட்வைஸ் செயல்பாடுகளைப் பயன்படுத்துகிறது, இது புரிந்து கொள்ள கடினமாக இருக்கும். எனவே இதுபோன்ற கட்டமைப்புகள் எவ்வாறு செயல்படுகின்றன என்பதை எங்காவது தனித்தனியாக படிக்க நான் உங்களுக்கு அறிவுறுத்துகிறேன்.

ஆடுகளத்தின் எண் மேட்ரிக்ஸின் அடிப்படையில் தகவல்களுடன் பிட்மேப்பை நிரப்புதல்:

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

மேலே விவரிக்கப்பட்ட முறையின்படி, கிரேஸி டேங்க்ஸ் விளையாட்டில் ஒரு படம் (பிரேம்) உருவாக்கப்பட்டு டிரா() செயல்பாட்டில் திரையில் காட்டப்படும். உள்ளீடு() செயல்பாட்டில் விசை அழுத்தங்களைப் பதிவுசெய்து, லாஜிக்() செயல்பாட்டில் அவற்றின் அடுத்தடுத்த செயலாக்கத்திற்குப் பிறகு, ஒரு புதிய படம் (பிரேம்) உருவாகிறது. உண்மை, விளையாட்டுப் பொருள்கள் ஏற்கனவே ஆடுகளத்தில் வேறுபட்ட நிலையைக் கொண்டிருக்கலாம், அதன்படி, வேறு இடத்தில் வரையப்பட்டிருக்கும். அனிமேஷன் (இயக்கம்) இப்படித்தான் நடக்கிறது.

கோட்பாட்டில் (நான் எதையும் மறக்கவில்லை என்றால்), முதல் கேமில் (“பாம்பு”) கேம் லூப்பைப் புரிந்துகொள்வது மற்றும் இரண்டாவது கேமிலிருந்து (“டாங்கிகள்”) திரையில் பிக்சல்களைக் காண்பிக்கும் அமைப்பு (“டாங்கிகள்”) ஆகியவற்றைப் புரிந்துகொள்வது மட்டுமே. Windows இன் கீழ் உங்கள் 2D கேம்கள். ஒலியற்றது! 😉 மீதமுள்ள பகுதிகள் வெறும் ஆடம்பரமானவை.

நிச்சயமாக, "டாங்கிகள்" விளையாட்டு "பாம்பு" விட மிகவும் சிக்கலானது. நான் ஏற்கனவே C++ மொழியைப் பயன்படுத்தினேன், அதாவது வகுப்புகளுடன் வெவ்வேறு விளையாட்டுப் பொருட்களை விவரித்தேன். நான் எனது சொந்த தொகுப்பை உருவாக்கினேன் - குறியீட்டை தலைப்புகள்/Box.h இல் பார்க்கலாம். மூலம், சேகரிப்பில் பெரும்பாலும் நினைவக கசிவு உள்ளது. பயன்படுத்திய சுட்டிகள். நினைவாற்றலுடன் வேலை செய்தார். புத்தகம் எனக்கு மிகவும் உதவியது என்று சொல்ல வேண்டும் கேம் புரோகிராமிங் மூலம் சி++ தொடங்குதல். சி++ இல் ஆரம்பிப்பவர்களுக்கு இது ஒரு சிறந்த தொடக்கமாகும். இது சிறியது, சுவாரஸ்யமானது மற்றும் ஒழுங்கமைக்கப்பட்டுள்ளது.

இந்த விளையாட்டை உருவாக்க சுமார் ஆறு மாதங்கள் ஆனது. நான் முக்கியமாக மதிய உணவு மற்றும் வேலை நேரத்தில் சிற்றுண்டியின் போது எழுதினேன். அலுவலக சமையலறையில் அமர்ந்து சாப்பாட்டை மிதித்துவிட்டு குறியீடு எழுதினான். அல்லது வீட்டில் இரவு உணவில். எனவே நான் இந்த "சமையலறை போர்களை" முடித்தேன். எப்போதும் போல, நான் ஒரு நோட்புக்கை தீவிரமாகப் பயன்படுத்தினேன், மேலும் அனைத்து கருத்தியல் விஷயங்களும் அதில் பிறந்தன.

நடைமுறைப் பகுதியை முடிக்க, எனது நோட்புக்கின் சில ஸ்கேன்களை எடுப்பேன். நான் என்ன எழுதினேன், வரைந்தேன், எண்ணினேன், வடிவமைத்தேன் என்பதைக் காட்ட...

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
தொட்டிகளின் படங்களை வடிவமைத்தல். ஒவ்வொரு தொட்டியும் திரையில் எத்தனை பிக்சல்கள் இருக்க வேண்டும் என்பதைத் தீர்மானித்தல்

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
அதன் அச்சில் தொட்டியின் சுழற்சிக்கான வழிமுறை மற்றும் சூத்திரங்களின் கணக்கீடு

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
எனது சேகரிப்பின் திட்டம் (நினைவக கசிவு உள்ள ஒன்று, பெரும்பாலும்). இணைக்கப்பட்ட பட்டியல் வகையின்படி சேகரிப்பு உருவாக்கப்பட்டது

DevOps C++ மற்றும் "சமையலறை போர்கள்" அல்லது சாப்பிடும் போது நான் எப்படி கேம்களை எழுத ஆரம்பித்தேன்
மேலும் இவை செயற்கை நுண்ணறிவை விளையாட்டில் இணைக்கும் வீண் முயற்சிகள்

கோட்பாடு

"ஆயிரம் மைல்கள் பயணம் கூட முதல் படியில் தொடங்குகிறது" (பண்டைய சீன ஞானம்)

நடைமுறையில் இருந்து கோட்பாட்டிற்கு செல்வோம்! உங்கள் பொழுதுபோக்கிற்கான நேரத்தை எவ்வாறு கண்டுபிடிப்பது?

  1. உங்களுக்கு உண்மையில் என்ன வேண்டும் என்பதைத் தீர்மானிக்கவும் (ஐயோ, இது கடினமான பகுதி).
  2. முன்னுரிமைகளை அமைக்கவும்.
  3. அதிக முன்னுரிமைகளுக்காக எல்லாவற்றையும் "கூடுதல்" தியாகம் செய்யுங்கள்.
  4. ஒவ்வொரு நாளும் இலக்குகளை நோக்கி நகருங்கள்.
  5. ஒரு பொழுதுபோக்கிற்காக இரண்டு அல்லது மூன்று மணிநேர இலவச நேரத்தை எதிர்பார்க்க வேண்டாம்.

ஒருபுறம், நீங்கள் விரும்புவதைத் தீர்மானித்து முன்னுரிமை அளிக்க வேண்டும். மறுபுறம், இந்த முன்னுரிமைகளுக்கு ஆதரவாக சில செயல்பாடுகள்/திட்டங்களை கைவிடுவது சாத்தியமாகும். வேறு வார்த்தைகளில் கூறுவதானால், நீங்கள் எல்லாவற்றையும் "கூடுதல்" தியாகம் செய்ய வேண்டும். வாழ்க்கையில் அதிகபட்சம் மூன்று முக்கிய செயல்பாடுகள் இருக்க வேண்டும் என்று எங்கோ கேள்விப்பட்டேன். பின்னர் நீங்கள் அவற்றை மிக உயர்ந்த தரத்தில் செய்ய முடியும். மேலும் கூடுதல் திட்டங்கள்/திசைகள் ஓவர்லோட் செய்யத் தொடங்கும். ஆனால் இவை அனைத்தும் அகநிலை மற்றும் தனிப்பட்டவை.

ஒரு குறிப்பிட்ட தங்க விதி உள்ளது: ஒருபோதும் 0% நாள் வேண்டாம்! ஒரு இண்டி டெவலப்பரின் கட்டுரையில் அதைப் பற்றி அறிந்தேன். நீங்கள் ஒரு திட்டத்தில் வேலை செய்கிறீர்கள் என்றால், ஒவ்வொரு நாளும் அதைப் பற்றி ஏதாவது செய்யுங்கள். மேலும் நீங்கள் எவ்வளவு செய்தாலும் பரவாயில்லை. ஒரு வார்த்தை அல்லது ஒரு வரிக் குறியீட்டை எழுதுங்கள், ஒரு டுடோரியல் வீடியோவைப் பாருங்கள் அல்லது ஒரு ஆணியை பலகையில் சுத்தி - ஏதாவது செய்யுங்கள். தொடங்குவதே கடினமான விஷயம். நீங்கள் ஆரம்பித்தவுடன், நீங்கள் விரும்பியதை விட சற்று அதிகமாகச் செய்து முடிப்பீர்கள். இந்த வழியில் நீங்கள் தொடர்ந்து உங்கள் இலக்கை நோக்கி நகர்வீர்கள், என்னை நம்புங்கள், மிக விரைவாக. எல்லாவற்றிற்கும் மேலாக, எல்லா விஷயங்களுக்கும் முக்கிய தடையாக இருப்பது தள்ளிப்போடுதல்.

5, 10, 15 நிமிடங்களின் இலவச "மரத்தூள்" நேரத்தை நீங்கள் குறைத்து மதிப்பிடக்கூடாது மற்றும் புறக்கணிக்கக்கூடாது என்பதை நினைவில் கொள்வது அவசியம், ஒரு மணி நேரம் அல்லது இரண்டு மணிநேரம் நீடிக்கும் சில பெரிய "பதிவுகளுக்கு" காத்திருக்கவும். நீங்கள் வரிசையில் நிற்கிறீர்களா? உங்கள் திட்டத்திற்காக ஏதாவது ஒன்றைப் பற்றி சிந்தியுங்கள். எஸ்கலேட்டரை எடுப்பதா? ஒரு நோட்பேடில் ஏதாவது எழுதுங்கள். நீங்கள் பேருந்தில் பயணம் செய்கிறீர்களா? அருமை, சில கட்டுரைகளைப் படியுங்கள். ஒவ்வொரு வாய்ப்பையும் பயன்படுத்திக் கொள்ளுங்கள். YouTube இல் பூனைகள் மற்றும் நாய்களைப் பார்ப்பதை நிறுத்துங்கள்! உங்கள் மூளையை மாசுபடுத்தாதீர்கள்!

கடைசியாக ஒன்று. இந்த கட்டுரையைப் படித்த பிறகு, கேம் என்ஜின்களைப் பயன்படுத்தாமல் கேம்களை உருவாக்கும் யோசனை உங்களுக்கு பிடித்திருந்தால், கேசி முராடோரி என்ற பெயரை நினைவில் கொள்ளுங்கள். இந்த பையனுக்கு உண்டு வலைத்தளத்தில். "வாட்ச் -> முந்தைய எபிசோடுகள்" பிரிவில், புதிதாக ஒரு தொழில்முறை விளையாட்டை உருவாக்குவதற்கான அற்புதமான இலவச வீடியோ டுடோரியல்களைக் காணலாம். விண்டோஸ் பாடங்களுக்கான சி முதல் ஐந்து அறிமுகத்தில், பல்கலைக்கழகப் படிப்பின் ஐந்து வருடங்களை விட அதிகமாக நீங்கள் கற்றுக் கொள்வீர்கள் (வீடியோவின் கீழ் உள்ள கருத்துகளில் யாரோ இதைப் பற்றி எழுதியுள்ளனர்).

உங்கள் சொந்த கேம் எஞ்சினை உருவாக்குவதன் மூலம், ஏற்கனவே உள்ள எஞ்சின்களைப் பற்றி நீங்கள் நன்றாகப் புரிந்துகொள்வீர்கள் என்றும் கேசி விளக்குகிறார். எல்லோரும் தன்னியக்கமாக்க முயற்சிக்கும் கட்டமைப்பின் உலகில், நீங்கள் பயன்படுத்துவதை விட உருவாக்க கற்றுக்கொள்கிறீர்கள். கணினியின் தன்மையை நீங்கள் புரிந்துகொள்கிறீர்கள். மேலும் நீங்கள் மிகவும் புத்திசாலி மற்றும் முதிர்ந்த புரோகிராமராக மாறுவீர்கள் - ஒரு சார்பு.

நீங்கள் தேர்ந்தெடுத்த பாதையில் நல்ல அதிர்ஷ்டம்! மேலும் உலகத்தை மேலும் தொழில் ரீதியாக உருவாக்குவோம்.

ஆசிரியர்: கிரான்கின் ஆண்ட்ரே, DevOps



ஆதாரம்: www.habr.com