هابروكاست "الغروب يدويًا" # 1. محاولة إعداد بيئة لتطوير لعبة لنظام التشغيل Windows

توصلت للتو إلى الفكرة - تحتاج إلى إيجاد نوع من الهواية. خلاف ذلك ، يمكنك الابتعاد عن الملفات. وبما أنني شخص عديم الفائدة للغاية ، لا يمكنني فعل أي شيء سوى أزرار الوخزة ، فستكون الهواية هي: على الأقل مرة واحدة في الأسبوع لترتيب دفق مع كتابة لعبة. بعد التدفق ينشر السجل على حبري. (يمكنك محاولة النشر مباشرة على هبر ، ولكن الأمر أكثر صعوبة).


الكتابة مدفوعة للغاية بالتغذية الراجعة - إذا احتاج شخص ما إلى تفسير ، فيمكنني شرح كيف يمكنني ذلك. إذا كانت هناك اقتراحات - سأحاول أن تأخذ بعين الاعتبار. تتم قراءة جميع التعليقات على لوحة الإعلانات إلى آخرها ، في أماكن أخرى - كيف تسير الأمور.


أول فطيرة متكتلة هنا:



تحت المشهد هو وصف أطروحة لأولئك الذين تم كسرهم فقط لقضاء ساعة ونصف مشاهدة.


أفكار إرشادية


الجانب المثير الأول هو أنك تريد كتابة كل شيء بدون العريس. كيف يفعل عازف الجاوي العادي؟ هناك مشكلة - تكتشف كآبة ، اعتمادًا عليها ، وهي تحل المشكلة لك. ثمن هذا هو أنه بسبب مثل هذه الخنازير ، يتحول المشروع إلى خنازير ، ولا يمكن لأحد تحديد ما يحدث بالضبط. أود أن أحاول الكتابة بدون مزرعة الخنازير ، نظيفة ومرتبة. ربما هذا غير ممكن - يرجى إخبارنا في التعليقات.


الجانب الثاني. لقد قمت بتشفير Java و PHP طوال حياتي. كانت هناك خبرة في تطوير الألعاب ، ولكن فقط في جزء الخادم بإجابة عبر الشبكة ، وليس مرة واحدة - تطبيق سطح مكتب حقيقي في C ++. لذلك ، في الجوهر ، سيكون هذا عرضًا غريبًا - الشخص الذي لا يفهم المشكلة سيحاول أن يصف بطريقة أو بأخرى في كلماته ما يحدث.


لا ، كل هذا ليس له قيمة عملية. هذا حتى لا تنزل من الملفات ، ولتحفيز أعمام اللحية الكبار على حمل لوحة المفاتيح وإسقاط بعض الألعاب أيضًا.


الروتين يضرب النيكل


لسوء الحظ ، لا تبدأ البرمجة أبدًا بترفيه سهل وممتع. في البداية ، هناك فترة حفر مؤلمة في البيئة وإعدادات IDE.


أول شيء فهمته حول Visual Studio هو أداة رائعة للمحترفين ، ولكنه يترك انطباعًا محبطًا للغاية بالنسبة للمبتدئين. بعد Eclipse و IntelliJ IDEA ، كل شيء ، كما تعلمون ، هو نوع من نوع أرجواني غير طبيعي غير مجدي مع إعادة الاشتراك. إنه ليس عن VS على الإطلاق ، إنه عني :-)


ومع الإضافات ، هناك دائمًا نوع من المشاكل.




لذلك ، بقرار متعمد ، نتخلى عن Vizhualka ونرى ما هو آخر. يتم إرسال Vim و Emacs والمحررين الآخرين الذين لا يفهمون بنية المصدر بواسطة الغابة. فشلت المحاولة الأولى لاستخدام Eclipse ، لذلك تم اختيار الأداة CLion .


المشكلة مع CLion هي أنه لا يزال لا يعمل بشكل كامل مع برنامج التحويل البرمجي Visual Studio. إذا حاولت القيام بشيء فيه ، فسيبدو كما يلي:




بالطبع ، سيكون هناك خيط لتصل إلى goshniks وتبدأ في الصراخ بصوت عالٍ بحيث يكون هناك ما يكفي من مطبوعات التصحيح للجميع. لكننا لن نستمع إليهم بالطبع.


لذلك ، تحتاج إلى ما يمكن لـ Clion القيام به بشكل جيد ، وهذا هو MinGW.


اختيار MinGW


هناك جدول نسخة كبير.




ويظهر أنه من المنطقي أن ننظر فقط إلى Cygwin و Msys2. Msys2 غريب نوعًا ما - لديه عدد قليل من المتعهدين ، الحزم موجودة على البوابة الشخصية لأحد المؤلفين. من ناحية أخرى ، إنه رائع حقًا - هناك مترجم جديد ومجموعة من الحزم. هذا أمر بالغ الأهمية.


يتألف التثبيت من استدعاء next-next-ok ، ثم تنفيذ أمر التحديث بشكل متكرر ( pacman -Syu ، كما هو الحال في Archlinux) مع إعادة تشغيل محطة Msys2 حتى تقول أن كل شيء تم إجراؤه بأفضل طريقة ممكنة.


إذا قمت ببساطة بتثبيت Msys2 وفقًا للتعليمات وحاولت إضافته إلى CLion ، فلن يتم العثور على سلسلة أدوات. تحتاج إلى تثبيته بنفسك ، ويتم ذلك عن طريق الأمر pacman -S mingw-w64-x86_64-toolchain .


بعد تثبيت هذه الحزمة ، يطلق CLion helloworld (الذي يتم إنشاؤه تلقائيًا عند إنشاء مشروع جديد) ويعمل التصحيح فيه.


فحص الميزة رقم 1: نافذة بسيطة


أولاً ، أريد أن أفهم ما إذا كان بعض تطبيقات سطح المكتب على الأقل سيبدأ على الإطلاق. لا يزال هذا ليس PlatformSDK الأصلي ، ولكن MinGW.


لهذا ، برنامج بسيط يرسم نافذة باستخدام vinapi مناسب.


ونعم ، يبدأ MinGW. ولكن مع سلسلة أدوات Visual Studio ، فإنه يصب نوعًا من الأخطاء ، لكنني لم أتعامل معها ، لأنه - ولكن لماذا ، إذا كانت المنصة المستهدفة تعمل بالفعل بالنسبة لنا؟


ميزة الاختيار رقم 2: مثلث مع شادر


من الواضح أن كتابة شيء قابل للتطبيق لا يكفي لعرض وحدات البكسل على النافذة. إنها مكابح ، غير مريحة ، لا توجد أشياء خيالية. باختصار ، نحن بحاجة إلى DirectX.


السؤال الرئيسي حول CLion + MinGW هو هذا. إذا لم يتمكنوا من استخدام DirectX ، فسيتم إرسالهم إلى سلة المهملات.


للاختبار ، كان هناك برنامج تعليمي قصير جدًا في Google ، يتكون من ملفين فقط: في أحدهما ، كل كود C ++ ، في الآخر ، تظليل. التحدي هو جعلها تعمل.


بالإضافة إلى طبيعة الملف الواحد ، فإن هذا البرنامج التعليمي جيد جدًا لأنه يخبر على الأصابع كيف يعمل. ربما يجب نقل هذه المقالة إلى هبر (اكتب في التعليقات).


النتيجة النهائية هنا جيثب . هنا سوف أصف المشاكل التي اجتمعت.


أشياء صغيرة والقمامة


أصبحت العديد من خطوط L مجرد سلاسل. يمكنك حذف الحروف L. في العديد من الأماكن ، تحتاج إلى استبدال NULL بـ 0 بحيث لا تقع.


على الرغم من استخدام set(CMAKE_CXX_STANDARD 17) ، لم يحدث شيء مثير للاهتمام على الإطلاق في هذا الصدد ، لم ينهار شيء.


رؤوس و Libs


الحقيقة ، بالطبع ، أن هذا المثال قديم جدًا ، مكتوب في الأيام التي سبقت Windows 10. لم يعد DirectX في إصدار DirectX SDK منفصل كما في أيام شبابنا المثير للجدل ، ولكن يتم دفعه مباشرةً في Windows SDK.


لذلك ، فإن أول شيء يجب القيام به هو تشغيل مثبت Visual Studio والتحقق من تثبيت أحدث إصدار من Windows SDK.


السؤال الثاني في العناوين الرئيسية.


 #include <d3d11.h> #include <d3dx11.h> #include <d3dx10.h> 

هم ليسوا أكثر ، تحتاج إلى شيء مثل:


 #include <d3d9.h> #include <d3d10.h> #include <d3d11.h> #include <dxgi.h> 

ثم في قوائم CMakeLists أضف بحثًا لهم في نهاية الملف:


 set(LIBS d3d9 d3d11 d3dcompiler_43) target_link_libraries(src ${LIBS}) 

واجهات برمجة التطبيقات المفقودة


في السابق ، كان هناك مثل هذا الهيكل :


 typedef struct D3DXCOLOR { FLOAT r; FLOAT g; FLOAT b; FLOAT a; } D3DXCOLOR, *LPD3DXCOLOR; 

وهي لم تعد كذلك. ومع ذلك ، في جميع الأماكن التي كانت هناك حاجة إليها حقًا ، اتضح استبدال D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f) بـ {0.0f, 0.2f, 0.4f, 1.0f} .


تحولت المشكلة إلى أن تكون أكثر إثارة للاهتمام مع D3DX11CompileFromFile . إنها ليست أكثر!


في المقالة العيش بدون D3DX ، تم اقتراح استبداله بـ D3DCompileFromFile .




ولكن إليك المشكلة ، D3DCompileFromFile غير متاح أيضًا لسبب ما!


أظهر تحقيق صغير أن وثائق Microsoft تقترح استخدام إصدار جديد جدًا من واجهة برمجة التطبيقات:




ويرسلنا MinGW إلى الماضي لعدة سنوات:




ومع ذلك ، في الإصدار 32 بت يوجد رأس أحدث ، لكنني لم أفهم كيفية إضافته إلى 64 بت. 32 بت ، على الأرجح ، في التين لم تستسلم.


من ناحية ، هذا أمر محزن للغاية ، لأنه ينذر بنزيف في علاقة مع MinGW في المستقبل. أتساءل من هم أخلاق كل هذه الأمور.


من ناحية أخرى ، إذا أخذنا D3DCompile المفقود و D3DCompileFromFile الحالي:


 HRESULT WINAPI D3DCompileFromFile( in LPCWSTR pFileName, in_opt const D3D_SHADER_MACRO pDefines, in_opt ID3DInclude pInclude, in LPCSTR pEntrypoint, in LPCSTR pTarget, in UINT Flags1, in UINT Flags2, out ID3DBlob ppCode, out_opt ID3DBlob ppErrorMsgs ); 

 HRESULT WINAPI D3DCompile( in LPCVOID pSrcData, in SIZE_T SrcDataSize, in_opt LPCSTR pSourceName, in_opt const D3D_SHADER_MACRO pDefines, in_opt ID3DInclude pInclude, in_opt LPCSTR pEntrypoint, in LPCSTR pTarget, in UINT Flags1, in UINT Flags2, out ID3DBlob ppCode, out_opt ID3DBlob ppErrorMsgs ); 

اتضح أن هناك اختلافًا فقط في ما يلي:


  in LPCWSTR pFileName, 

ضد


  in LPCVOID pSrcData, in SIZE_T SrcDataSize, in_opt LPCSTR pSourceName, 

لسوء الحظ ، لا أعرف C ++ ، لذلك أخبرتك كيف يمكنني: لقد أضفت للتو طرح الملف وأعد توجيه هذه البيانات إلى D3DCompile .


 void WINAPI D3DCompileFromFile(const char *filename, const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint, const char *target, UINT sflags, UINT eflags, ID3DBlob **shader, ID3DBlob **error_messages) { SIZE_T data_size; char* buffer; ifstream infile; infile.open(filename, ios::binary); infile.seekg(0, ios::end); data_size = infile.tellg(); infile.seekg(0, ios::beg); buffer = new char[data_size]; infile.read(buffer, data_size); infile.close(); D3DCompile(buffer, data_size,filename, defines, include,entrypoint, target, sflags, eflags, shader, error_messages); } 

الاختلاف المهم الوحيد بين D3DX11CompileFromFile و D3DX11CompileFromFile المصنوع D3DCompileFromFile هو عدم وجود ID3DX11ThreadPump كمعلمة في واجهة برمجة التطبيقات الجديدة. هل هذا شيء غير متزامن ، ربما نوع من تجمع الخيط؟ ومع ذلك ، لم يتم استخدامه في البرنامج التعليمي ، وهناك 0 في مكانه.


الملخص


مجموعة من DirectX + MinGW + Msys2 + CLion قابلة للتطبيق بما يكفي لقطع لعبة بسيطة. هناك فرصة ليس فقط لاستخدام vinapi الأساسي ، ولكن أيضًا للرسم ، وحتى مع التظليل.


بشكل عام ، هذا كل شيء. أذكرك أن النتيجة البسيطة تقع على GitHub .


يرجى تذكر أن هذا ليس رمزي ، ولكن نصًا معدلاً من البرنامج التعليمي - ومع ذلك ، آمل أن يكون استخدامه صريحًا وموجهًا. ولكن مع ذلك ، لهذا السبب لا يوجد ترخيص عادي هناك .




ملاحظات


يرجى كتابة تعليقاتك واقتراحاتك في التعليقات. من أجل ذلك ، يتم كل شيء ، استمع إلى ما تقوله. خاصة إذا كنت مبرمجًا محنكًا في اللعبة ، مجرد بيسون ، بيسون ، ولا تتناسب مع خيط حسب الحجم. تأكد من أن تأتي وتكتب شيئا.


أذكرك بأنني ، مثل أي مدون آخر ، آكل الإعجابات والتصاميم. كلما لعبت السهم لأعلى تحت هذه المشاركة بشكل أكثر عنفًا ، زاد احتمال ظهور المشاركة والتدفق التالي.


                  

© ألكسندر ريفسكي

Source: https://habr.com/ru/post/ar424971/


All Articles