Baru saja muncul dengan pemikiran - Anda perlu menemukan semacam hobi. Jika tidak, Anda dapat memindahkan gulungan. Dan karena saya adalah orang yang sangat tidak berguna, yang tidak bisa melakukan apa-apa selain menekan tombol, hobinya akan seperti ini: setidaknya seminggu sekali mengatur aliran dengan penulisan mainan. Setelah streaming, catatan dipublikasikan di HabrΓ©. (Anda dapat mencoba memposting langsung di Habr, tetapi itu jauh lebih sulit).
Menulis sangat didorong oleh umpan balik - jika seseorang membutuhkan penjelasan, maka saya bisa menjelaskan bagaimana saya bisa. Jika ada saran - Saya akan mencoba mempertimbangkan. Pada habr, semua komentar dibaca sampai akhir, di tempat lain - bagaimana kelanjutannya.
Pancake pertama kental di sini:
Di bawah cutscene adalah deskripsi tesis bagi mereka yang baru saja menghabiskan satu setengah jam menonton.
Membimbing ide
Aspek menarik pertama adalah bahwa Anda ingin menulis semuanya tanpa pengantin pria. Bagaimana cara kerja javist biasa? Ada masalah - Anda mengetahui kesuraman, tergantung pada itu, dan itu memecahkan masalah untuk Anda. Harga untuk ini adalah karena babi seperti itu, proyek berubah menjadi kandang babi, dan tidak ada yang bisa menentukan dengan tepat apa yang terjadi. Saya ingin mencoba menulis tanpa peternakan babi ini, bersih dan rapi. Mungkin ini tidak mungkin - beri tahu kami di komentar.
Aspek kedua. Saya telah mengkode Java dan PHP sepanjang hidup saya. Ada pengalaman dalam mengembangkan mainan, tetapi hanya di bagian server dengan jawaban melalui jaringan, dan tidak sekali - aplikasi desktop nyata di C ++. Oleh karena itu, pada dasarnya, ini akan menjadi pertunjukan yang aneh - orang yang tidak mengerti masalah akan mencoba menjelaskan dengan kata-katanya sendiri apa yang terjadi.
Tidak, semua ini tidak memiliki nilai praktis. Ini agar tidak keluar dari kumparan, dan untuk memotivasi paman-paman berjanggut dewasa untuk mengambil keyboard dan juga memecahkan mainan.
Rutin menyerang nikel
Sayangnya, pemrograman tidak pernah dimulai dengan hiburan yang mudah dan menyenangkan. Awalnya, ada periode penggalian yang menyakitkan di lingkungan dan pengaturan IDE.
Hal pertama yang saya mengerti tentang Visual Studio adalah alat yang hebat untuk seorang profesional, tetapi membuat kesan yang sangat membuat frustrasi pada pemula. Setelah Eclipse dan IntelliJ IDEA, semuanya, Anda tahu, adalah semacam tidak wajar, lilac sedikit sia-sia dengan berlangganan ulang. Ini bukan tentang VS sama sekali, ini tentang saya :-)
Dan dengan plugin selalu ada beberapa masalah.

Karena itu, dengan keputusan yang disengaja, kami meninggalkan Vizhualka dan melihat apa lagi. Vim, Emacs, dan editor lain yang tidak mengerti struktur sumber dikirim oleh hutan. Upaya pertama untuk menggunakan Eclipse gagal, jadi alat itu dipilih CLion .
Masalah dengan CLion adalah bahwa itu masih tidak dapat sepenuhnya bekerja dengan kompiler Visual Studio. Jika Anda mencoba melakukan sesuatu di dalamnya, akan terlihat seperti ini:

Tentu saja, akan ada utas untuk berlari ke goshnik dan mulai menjerit dengan suara bernada tinggi bahwa ada cukup cetakan debugging untuk semua orang. Tapi kami tidak akan mendengarkan mereka, tentu saja.
Oleh karena itu, Anda memerlukan apa yang dapat dilakukan CLion dengan baik, dan ini adalah MinGW.
Memilih MinGW
Ada tabel versi besar.

Dan itu menunjukkan bahwa masuk akal untuk hanya melihat Cygwin dan Msys2. Msys2 agak aneh - memiliki beberapa committer, paketnya ada di github pribadi dari salah satu penulis. Di sisi lain, ini sangat keren - ada kompiler baru dan banyak paket. Ini sangat penting.
Instalasi terdiri dari memanggil next-next-ok, dan kemudian berulang kali mengeksekusi perintah pembaruan ( pacman -Syu
, seperti di Archlinux) dengan me-restart terminal Msys2 sampai dikatakan bahwa semuanya berubah dengan cara terbaik.
Jika Anda cukup menginstal Msys2 sesuai dengan instruksi dan mencoba menambahkannya ke CLion, tidak ada toolchain yang akan ditemukan. Anda perlu menginstalnya sendiri, ini dilakukan oleh perintah pacman -S mingw-w64-x86_64-toolchain
.
Setelah menginstal paket ini, CLion meluncurkan helloworld (yang dihasilkan secara otomatis saat membuat proyek baru) dan debugging berfungsi di dalamnya.
Fitur Periksa # 1: jendela sederhana
Pertama, saya ingin mengerti apakah setidaknya beberapa aplikasi desktop akan mulai sama sekali. Namun, ini bukan PlatformSDK asli, tetapi MinGW.
Untuk ini, program sederhana yang menggambar jendela menggunakan vinapi sangat cocok.
Dan ya, dengan MinGW dimulai. Tetapi dengan toolchain Visual Studio, itu menuangkan beberapa jenis kesalahan, tapi saya tidak mengatasinya, karena - tetapi mengapa, jika platform target sudah bekerja untuk kita?
Fitur Periksa # 2: Segitiga dengan Shader
Jelas bahwa untuk menulis sesuatu yang layak tidak cukup untuk menampilkan piksel pada jendela. Pengereman, tidak nyaman, tidak ada barang mewah. Singkatnya, kita membutuhkan DirectX.
Pertanyaan kunci tentang CLion + MinGW adalah ini. Jika mereka tidak dapat menggunakan DirectX, maka mereka dikirim ke tempat sampah.
Untuk pengujian, tutorial yang sangat singkat di -google-kan, terdiri dari hanya dua file: dalam satu, semua kode C ++, yang lain, shader. Tantangannya adalah membuatnya bekerja.
Selain sifat satu-file, tutorial ini sangat bagus karena menceritakan pada jari bagaimana cara kerjanya. Mungkin artikel ini harus ditransfer ke Habr (tulis dalam komentar).
Hasil akhirnya ada di sini GitHub . Di sini saya akan menjelaskan masalah apa yang telah bertemu
Benda-benda kecil dan sampah
Banyak L-line telah menjadi string saja. Anda dapat menghapus huruf L. Di banyak tempat, Anda harus mengganti NULL dengan 0 agar tidak jatuh.
Terlepas dari kenyataan bahwa set(CMAKE_CXX_STANDARD 17)
, tidak ada yang menarik sama sekali dalam hal ini, tidak ada yang berantakan.
Header dan Libs
Faktanya, tentu saja, adalah bahwa contoh ini sangat kuno, ditulis pada hari-hari jauh sebelum Windows 10. DirectX tidak lagi dalam DirectX SDK terpisah seperti pada masa muda kita yang kontroversial, tetapi didorong langsung ke Windows SDK.
Oleh karena itu, hal pertama yang harus dilakukan adalah menjalankan penginstal Visual Studio dan memverifikasi bahwa versi terbaru dari Windows SDK diinstal.
Pertanyaan kedua ada di berita utama.
#include <d3d11.h> #include <d3dx11.h> #include <d3dx10.h>
Mereka tidak lebih, Anda perlu sesuatu seperti:
#include <d3d9.h> #include <d3d10.h> #include <d3d11.h> #include <dxgi.h>
Dan kemudian di CMakeLists menambahkan pencarian ke mereka di akhir file:
set(LIBS d3d9 d3d11 d3dcompiler_43) target_link_libraries(src ${LIBS})
API Tidak Ada
Sebelumnya, ada struktur seperti itu:
typedef struct D3DXCOLOR { FLOAT r; FLOAT g; FLOAT b; FLOAT a; } D3DXCOLOR, *LPD3DXCOLOR;
Dan dia tidak ada lagi. Namun, di semua tempat di mana itu benar-benar dibutuhkan, ternyata untuk menggantikan D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f)
dengan {0.0f, 0.2f, 0.4f, 1.0f}
.
Masalahnya ternyata lebih menarik dengan D3DX11CompileFromFile
. Dia tidak ada lagi!
Dalam artikel Living tanpa D3DX, diusulkan untuk menggantinya dengan D3DCompileFromFile
.

Tapi ini masalahnya, D3DCompileFromFile
juga tidak tersedia karena alasan tertentu!
Investigasi kecil menunjukkan bahwa dokumentasi Microsoft menyarankan menggunakan versi API yang sangat baru:

Dan MinGW mengirim kami kembali ke masa lalu selama beberapa tahun:

Namun, dalam versi 32-bit ada header yang lebih baru, tetapi saya tidak mengerti bagaimana menambahkannya ke 64-bit. 32 bit pada, mungkin, dalam Gambar tidak menyerah.
Di satu sisi, ini sangat menyedihkan, karena menandakan pendarahan dalam hubungan dengan MinGW di masa depan. Saya ingin tahu siapa yang sopan santun dari semua masalah ini.
Di sisi lain, jika kita mengambil D3DCompile
hilang dan D3DCompile
yang ada:
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 );
ternyata hanya ada perbedaan dalam hal berikut:
in LPCWSTR pFileName,
menentang
in LPCVOID pSrcData, in SIZE_T SrcDataSize, in_opt LPCSTR pSourceName,
Sayangnya, saya tidak tahu C ++, jadi saya memberi tahu Anda bagaimana saya bisa: Saya baru saja menambahkan pengurangan file dan mengarahkan ulang data ini ke 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); }
Satu-satunya perbedaan penting antara D3DX11CompileFromFile
dan D3DCompileFromFile
buatan kami adalah kurangnya ID3DX11ThreadPump
sebagai parameter dalam API baru. Apakah ini sesuatu untuk asinkron, mungkin semacam kumpulan utas? Namun, dia tidak digunakan dalam tutorial, ada 0 di tempatnya.
Ringkasan
Sekelompok DirectX + MinGW + Msys2 + CLion cukup layak untuk memotong permainan sederhana. Ada kesempatan tidak hanya untuk menggunakan vinapi dasar, tetapi juga untuk menggambar, dan bahkan dengan shader.
Secara umum, itu saja. Saya mengingatkan Anda bahwa hasil sederhana terletak pada GitHub .
Harap ingat bahwa ini bukan kode saya, tetapi teks yang dimodifikasi dari tutorial - namun, saya harap penggunaannya jujur ββdan tepat sasaran. Namun demikian, itulah sebabnya tidak ada lisensi normal di sana .

Umpan balik
Silakan tulis komentar dan saran Anda di komentar. Demi ini, semuanya dilakukan, dengarkan apa yang Anda katakan. Terutama jika Anda adalah programmer game yang berpengalaman, hanya bison, bison, dan Anda tidak muat di utas berdasarkan ukuran. Pastikan untuk masuk dan menulis sesuatu.
Saya mengingatkan Anda bahwa saya, seperti blogger lainnya, makan suka dan desain. Semakin keras Anda memutar panah ke atas di bawah pos ini, semakin besar kemungkinan pos dan aliran berikutnya akan keluar.
Β© Alexander Raevsky