SDL 2.0レッスンサイクル:レッスン1



翻訳者から: 一連の記事に触発されて、私はSDLで手を試すことにしました。 はい、それは不運です。ロシア語のSDLバージョン2.0で賢明な教訓を見つけることができませんでした。 これは私がTwinklebearチュートリアルの素晴らしいシリーズをここで利用可能なオリジナルに翻訳することを促しまし



ようこそ


これらのレッスンの目的は、SDL 2.0およびC ++ゲーム乙女の基本を紹介することです。 読者は、C ++プログラミングの経験があり、配列、ベクトル、制御構造、関数、およびポインターに関する最小限の知識しか持っていないと理解されています。



例のコードの解析に問題がある場合は、 StackOverflowのこのすばらしいリストにある本のいずれかを使用してください。



完全なソースを表示したり、レッスンのリソースをダウンロードしたい場合は、 GitHubですべて入手できます。 しかし、コピーしないでください!



SDL 2.0ドキュメントは、 このwikiで読むこともできます



レッスン1:Hello World!



このチュートリアルでは、ウィンドウを開き、レンダリングコンテキストを作成し、ロードされた画像を画面に描画する方法を学習します。 以下に、描画するBMP画像を選択できます。 プロジェクトのどこかに保存します。 それでは始めましょう!



画像



SDLの発売


通常、最初のステップはSDLヘッダーファイルを含めることです。



#include <SDL2/SDL.h>
      
      





SDLの使用を開始するには、使用するさまざまなSDLサブシステムを初期化する必要があります。 これは、 SDL_Init関数を使用して実行できます。この関数は、初期化するサブシステムを示す一連のフラグを受け入れます。 ここで、すべてを初期化したいと言っていますが、必要に応じてこれを変更できます。 レッスンに必要な最小値はSDL_INIT_VIDEOです。 すべてがうまくいけば、SDL_Initは0を返し、そうでなければエラーを出力して終了します。



Visual Studioユーザーへの注意:リンカー設定でシステム値をWindowsに設定した場合、コンソールへの標準出力は取得されません。 これを防ぐには、システム値をコンソールに変更する必要があります。



 if (SDL_Init(SDL_INIT_EVERYTHING) != 0){ std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; return 1; }
      
      





窓開き


レンダーで表示できるようにウィンドウが必要です。 SDL_CreateWindow関数を使用して作成できます。SDL_CreateWindow関数は、ウィンドウの名前、座標、高さ、幅、およびいくつかのフラグを使用してウィンドウパラメーターを設定します。 この関数はSDL_Window *を返します。 ウィンドウの作成中に問題が発生した場合、このポインターはNULLになります。



 SDL_Window *win = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN); if (win == nullptr){ std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl; return 1; }
      
      





レンダラーの作成


これで、 SDL_CreateRendererを使用してレンダラーを作成できます。 これは、ウィンドウに描画できるようにするために必要です。 この関数は、レンダラーを関連付ける必要があるウィンドウへのポインター、レンダリングに使用されるドライバーインデックス(または、要件に合った最初のインデックスを選択する場合は-1)、および必要なレンダラーのタイプを示すために使用されるさまざまなフラグを受け入れます。 この場合、ハードウェアアクセラレーションと垂直同期を有効にしたレンダラーをリクエストします。 SDL_Renderer *を取得します。何か問題が発生するとNULLになります。



 SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == nullptr){ std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl; return 1; }
      
      





BMP画像のアップロード


BMPイメージをレンダリングするには、まずそれをメモリにロードし、次に使用するレンダリングデバイス(この場合はGPU)にロードする必要があります。 SDL_LoadBMPを使用してイメージをロードできます。 この関数はSDL_Surface *を返します。これをSDL_Textureにロードして、レンダラーで使用できるようにします。



SDL_LoadBMPは、プロジェクトの構造に合わせて変更する必要があるイメージへのパスを取得し、エラーがある場合はSDL_Surface *またはNULLを返します。



 SDL_Surface *bmp = SDL_LoadBMP("../res/Lesson1/hello.bmp"); if (bmp == nullptr){ std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl; return 1; }
      
      





これで、 SDL_CreateTextureFromSurfaceを使用して画像をレンダラーにロードできます。 レンダリングコンテキストとメモリ内の画像(SDL_Surface)を渡し、ロードされたテクスチャを取得します。 何か問題が発生した場合は、NULLを取得します。 また、SDL_Surfaceはもう必要ないので、占有しているメモリを解放します。



 SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp); SDL_FreeSurface(bmp); if (tex == nullptr){ std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl; return 1; }
      
      





テクスチャレンダリング


あとは、画面にテクスチャを表示するだけです! 最初にレンダラーをクリーニングし 、テクスチャレンダリングした更新された画面を表示して結果を確認します。 イメージ全体をレンダリングし、画面に収まるようにストレッチするため、SDL_RenderCopyのソースおよびターゲットの四角形としてNULLを渡します。 また、プログラムが終了するまで結果を確認するためにウィンドウをしばらく開いたままにしておきたいので、 SDL_Delay呼び出しを追加します。



 SDL_RenderClear(ren); SDL_RenderCopy(ren, tex, NULL, NULL); SDL_RenderPresent(ren); SDL_Delay(2000);
      
      





ガベージコレクション


終了する前に、さまざまなSDL_DestroyX関数で作成したすべてのオブジェクトを破棄し、SDLを完了する必要があります。



 SDL_DestroyTexture(tex); SDL_DestroyRenderer(ren); SDL_DestroyWindow(win); SDL_Quit();
      
      





レッスンの終わり


成功すると、起動時にウィンドウ全体に画像が表示され、2秒後にプログラムが終了します。 問題が発生した場合は、SDLが正しくインストールおよび構成されていることを確認してください。 さまざまなプラットフォーム用にSDLをインストールおよび構成するための詳細な手順については、 こちらをご覧ください



レッスン2でお会いしましょう:すべてをmainにプッシュしないでください



All Articles