BaseCrossDx12ドキュメント

【Sample000】Emptyプロジェクト

 このサンプルはSamples/Sample000ディレクトリ内にあります。VisualStdioで該当ソリューション(VS2022でBaseCrossDx12VS2022.sln)を開いてください。ビルド後実行すると、以下の画面が現れます。Escキーを押す×ボタンで終了します。Altを押しながらEnterで、全画面に変更できます。Windowモードに戻すときは、再びAltを押しながらEnterを押します。
Emptyプロジェクトとは
 Emptyプロジェクトとは、ゲーム制作開始時の何も表示しないプロジェクトを指します。
 何も表示しないと言っても、フレームワークごとの特有の情報や仕組みが実装されているのが通常です。
 BaseCrossDx12も例外ではなく、現在のFPS値とElapsedTime値が表示されています。
BaseCrossDx12の構造
 BaseCrossDx12は以下のような構造を持ちます。


 Sample000のようにSample0..で始まるサンプルは、かなりシンプルなサンプルです。DirectX12オブジェクトもある程度作らなければいけません。
 Sample101のようにSample1..で始まるサンプルは、ゲームステージ、コンポーネントなど、ある程度個別ライブラリの形でそろっています(フルセットサンプル)。BaseCrossの前バージョンであるBaseCross64を使った時がある人はわかると思いますが、そのままゲーム制作を始められます。
Emptyプロジェクトの内容
 Emptyプロジェクトのソリューションは以下の通りです。
 Libsの中は、シンプルバージョンのライブラリです。ソース ファイルおよびヘッダー ファイルがコンテンツ側の内容ですが、見てみるとほとんど記述がありません。
 まず一番重要なScene.h/cppを見てみます
Scene.h
/*!
@file Scene.h
@brief シーンクラス
*/
#pragma once
#include "stdafx.h"
#include "Project.h"

namespace basecross {

	//--------------------------------------------------------------------------------------
	// シーン
	//--------------------------------------------------------------------------------------
	class Scene : public BaseScene
	{
	public:
		Scene(UINT frameCount, PrimDevice* pPrimDevice);
		virtual ~Scene();
	protected:
		virtual void CreateAssetResources(ID3D12Device* pDevice, ID3D12GraphicsCommandList* pCommandList)override{}
		virtual void Update(double elapsedTime)override{}
		virtual void UpdateConstantBuffers()override{}
		virtual void CommitConstantBuffers()override{}
		virtual void UpdateUI(std::unique_ptr<UILayer>& uiLayer)override;
		virtual void ShadowPass(ID3D12GraphicsCommandList* pCommandList)override {}
		virtual void ScenePass(ID3D12GraphicsCommandList* pCommandList){}
	};
}
//end namespace basecross
 よく見るとCreateAssetResources()、Update()、UpdateConstantBuffers()、CommitConstantBuffers()、ShadowPass()、ScenePass()は、実体をもってない(というか何もしない)のがわかります。
 この6つの関数をコンテンツに合った形で記述すれば、様々なオブジェクトを管理、表示することができます。
 以下はScene.cppの実装です。
Scene.cpp
/*!
@file Scene.cpp
@brief シーンクラス 実体
*/
#include "stdafx.h"
#include "Project.h"

namespace basecross {

	//--------------------------------------------------------------------------------------
	// シーン
	//--------------------------------------------------------------------------------------
	Scene::Scene(UINT frameCount, PrimDevice* pPrimDevice) :
		BaseScene(frameCount, pPrimDevice)
	{
	}
	Scene::~Scene()
	{
	}


	void Scene::UpdateUI(std::unique_ptr<UILayer>& uiLayer) {
		auto device = BaseDevice::GetBaseDevice();
		//1秒間に1回更新される安定したfpsを得る
		auto fps = device->GetStableFps();
		//1秒間に1回更新される安定したelapsedTimeを得る
		auto elapsedTime = device->GetStableElapsedTime();
		std::wstring uiText = L"";
		wchar_t buff[512];
		swprintf_s(buff, 500, L"FPS: %.1f\n", fps);
		uiText = buff;
		swprintf_s(buff, 500, L"ElapsedTime: %.6f\n", elapsedTime);
		uiText += buff;
		uiLayer->UpdateLabels(uiText);
	}


}
// end namespace basecross
 BaseCrossDx12で最低限必要なコンテンツ側の処理はこれだけです。
 UpdateUI()関数は、デバッグ文字列としてFPSとElapsedTimeを表示します。もし何も表示したくなければ
	void Scene::UpdateUI(std::unique_ptr<UILayer>& uiLayer) {
		uiLayer->UpdateLabels(L"");
	}
 と書けば問題ありません。
 他のファイルProject.hはほぼ何も書かれてないですし、resource.h、stdafx.h、stdafx.cpp、WinMain.cppは、サンプルが変わっても同じ内容です。