この記事は、前回書いたC++による複数のWindowの表示の続きとなっています。
開発環境
- OS:Windows 10 / 11
- IDE:Visual Studio 2022
- 言語:C++
- 追加ライブラリ:DxLib
概要
Win32 APIというものを使い複数ウィンドウを表示し、別々の描画を行う方法を書いた記事の続きです。
実装方法
今回は、前回表示したWindowに別々の描画を行っていきます。
手順1:描画の準備
まずは、ウィンドウに画像を描画するところから始めていきます。主に使う関数はこのようになっています。
-
SetDrawScreen(DX_SCREEN_BACK)
2Dイラストや3Dモデル描画をまとめ上げるグラフィック領域を設定します。 -
ScreenFlip()
グラフィック領域にまとめた画像をフロントバッファに書き出します。 -
ClearDrawScreen()
次の描画の際に画像が残ってしまうので、削除する。
(ScreenFlipで書き出されたされた画像は1つの画像として保存されて残る。)
void Draw(void)
{
// 描画先グラフィック領域の指定
SetDrawScreen(DX_SCREEN_BACK)
// カメラ
camera_->SetBeforeDraw();
// シーンの下層から順に描画
for (auto& scene : scenes_) {
scene->Draw();
}
// エフェクト描画
DrawEffekseer3D();
// フェード描画
fader_->Draw();
// フロントバッファに書き出し
ScreenFlip();
// 画面を初期化
ClearDrawScreen();
}
これでsceneクラスの画像やエフェクトの描画を行っています。
手順2:ウィンドウ別の描画
手順1のフロントバッファを変更することで、Window別描画が可能となります。変更するために、 SetScreenFlipTargetWindow(NULL) という関数を使い、作成したWindowハンドル(前回の記事の手順2)を書きだし先にします。
#include <Dxlib.h>
#include <string>
#include <Windows.h>
HWND window_;
void Init(void)
{
window_= CreateSubWindow(void);
}
// メインWindowno描画
void MainDraw(void)
{
// 描画先グラフィック領域の指定
SetDrawScreen(DX_SCREEN_BACK)
// メインウィンドウをターゲットに設定
SetScreenFlipTargetWindow(NULL);
// カメラ
camera_->SetBeforeDraw();
// メインWindow用シーンの描画
MainDraw();
// エフェクシア描画
DrawEffekseer3D();
// 暗転・明転
fader_->Draw();
// フロントバッファに書き出し
ScreenFlip();
// 画面を初期化
ClearDrawScreen();
}
// サブWindowno描画
void MainDraw(void)
{
// 描画先グラフィック領域の指定
SetDrawScreen(DX_SCREEN_BACK)
// メインウィンドウをターゲットに設定
SetScreenFlipTargetWindow(window_);
// カメラ
camera_->SetBeforeDraw();
// サブWindow用シーンの描画
SubDraw();
// エフェクシア描画
DrawEffekseer3D();
// 暗転・明転
fader_->Draw();
// フロントバッファに書き出し
ScreenFlip();
// 画面を初期化
ClearDrawScreen();
}
これにより、メインWindow ではMainDraw()、サブWindowではSubDraw()の描画がされるようになります。
まとめ
最後に、今回Windowを複数作成しそれぞれに別の描画を行う処理までの記事を2つに分けて書きましたが、私自身この方法がはっきりと正しいとは言えません。
また、そのほかにもHAND window_のパラメータでWindowを表示、非表示を切り替えたりと解説できていない部分も多く、もし実践するという方がいれば1度AI等にお聞きすることをお勧めします。