DirectXは仮でどのように作成するかを確認しただけなので、いったん削除して今度は受け取り用のGameMainClassを作ってみる。
ひとまず、サンプルを見つつ「sample3DGameDX」を分解しつつ勉強中。surfaceなどのパッド系は考えていないのでOrientationは必要か怪しいけどとりあえず書いておく。
#pragma once
#include <winrt/Windows.ApplicationModel.Activation.h>
#include <winrt/Windows.ApplicationModel.Core.h>
#include <winrt/Windows.UI.Core.h>
class GameMain : public winrt::implements<GameMain, winrt::Windows::Foundation::IInspectable>
{
public:
GameMain();
virtual ~GameMain();
void Run();
void Close();
void Suspend();
void Resume();
void Visibility(bool visible);
private:
bool m_windowClosed;
bool m_visible;
winrt::agile_ref<winrt::Windows::UI::Core::CoreWindow> m_window;
};
#include "pch.h"
using namespace winrt;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::UI::Core;
GameMain::GameMain()
: m_windowClosed(false)
, m_visible(false)
{
}
GameMain::~GameMain()
{
}
void GameMain::Run()
{
while (!m_windowClosed)
{
if (m_visible)
{
CoreWindow::GetForCurrentThread().Dispatcher().ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
}
else
{
CoreWindow::GetForCurrentThread().Dispatcher().ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending);
}
}
}
void GameMain::Close()
{
m_windowClosed = true;
}
void GameMain::Suspend()
{
}
void GameMain::Resume()
{
}
void GameMain::Visibility(bool visible)
{
if (visible && !m_visible)
{
}
m_visible = visible;
}
#pragma once
#include <windows.h>
#include <Unknwn.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.ApplicationModel.Core.h>
#include <winrt/Windows.UI.Core.h>
#include <winrt/Windows.UI.Composition.h>
#include <winrt/Windows.UI.Input.h>
#include <winrt/Windows.Graphics.Display.Core.h>
#include "GameMain/GameMain.h"
#include "pch.h"
using namespace winrt;
using namespace Windows;
using namespace Windows::ApplicationModel;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::Foundation::Numerics;
using namespace Windows::UI;
using namespace Windows::UI::Core;
using namespace Windows::UI::Composition;
using namespace Windows::UI::Input;
using namespace Windows::Graphics::Display;
struct App : implements<App, IFrameworkViewSource, IFrameworkView>
{
IFrameworkView CreateView()
{
return *this;
}
// This method is called on application launch.
void Initialize(CoreApplicationView const& applicationView)
{
applicationView.Activated({ this, &App::OnActivated });
CoreApplication::Suspending({this, &App::OnSuspending });
CoreApplication::Resuming({ this, &App::OnResuming });
// DeviceResourceの作成(DirectXなど)
}
void Load(winrt::hstring const& /*entryPoint*/)
{
if (!m_gameMain)
{
m_gameMain = winrt::make_self<GameMain>();
}
}
void OnActivated(CoreApplicationView const& /* applicationView */, IActivatedEventArgs const& /* args */)
{
// Activate the application window, making it visible and enabling it to receive events.
CoreWindow::GetForCurrentThread().Activate();
}
winrt::fire_and_forget OnSuspending(IInspectable const& /* sender */, SuspendingEventArgs const& args)
{
auto lifetime = get_strong();
SuspendingDeferral deferral = args.SuspendingOperation().GetDeferral();
co_await winrt::resume_background();
m_gameMain->Suspend();
deferral.Complete();
}
void OnResuming(IInspectable const& /* sender */, IInspectable const& /* args */)
{
m_gameMain->Resume();
}
// This method is called after Load.
void Run()
{
m_gameMain->Run();
}
// This method is called after Initialize.
void SetWindow(CoreWindow const& window)
{
window.PointerCursor(CoreCursor(CoreCursorType::Arrow, 0));
PointerVisualizationSettings visualizationSettings{ PointerVisualizationSettings::GetForCurrentView() };
visualizationSettings.IsContactFeedbackEnabled(false);
visualizationSettings.IsBarrelButtonFeedbackEnabled(false);
window.Activated({ this, &App::OnWindowActivationChanged });
window.SizeChanged({ this, &App::OnWindowSizeChanged });
window.Closed({ this, &App::OnWindowClosed });
window.VisibilityChanged({ this, &App::OnVisibilityChanged });
DisplayInformation currentDisplayInformation{ DisplayInformation::GetForCurrentView() };
currentDisplayInformation.DpiChanged({ this, &App::OnDpiChanged });
currentDisplayInformation.OrientationChanged({ this, &App::OnOrientationChanged });
currentDisplayInformation.StereoEnabledChanged({this, &App::OnStereoEnabledChanged});
DisplayInformation::DisplayContentsInvalidated({ this, &App::OnDisplayContentsInvalidated });
}
// This method is called before the application exits.
void Uninitialize()
{
}
private:
void OnWindowActivationChanged(CoreWindow const& /* sender */, WindowActivatedEventArgs const& args)
{
CoreWindow::GetForCurrentThread().Activate();
}
void OnWindowSizeChanged(CoreWindow const& /* sender */, WindowSizeChangedEventArgs const &args)
{
/* ウィンドウのサイズが変化した時に呼び出される */
}
void OnWindowClosed(CoreWindow const& /* sender */, CoreWindowEventArgs const& args)
{
m_gameMain->Close();
}
void OnVisibilityChanged(CoreWindow const& /* sender */, VisibilityChangedEventArgs const& args)
{
/* ウィンドウの表示状態が変わった時に呼び出される */
}
void OnDpiChanged(DisplayInformation const& /* sender */, IInspectable const& /* args */)
{
/* 解像度変更が発生した時に呼び出される */
}
void OnOrientationChanged(DisplayInformation const& sender, IInspectable const& /* args */ )
{
/* 縦横変わった時に来る - Windowsで使用する場合は必要ない */
}
void OnStereoEnabledChanged(DisplayInformation const& /* sender */, IInspectable const& /* args */)
{
/* サウンド関係?変更時 */
}
void OnDisplayContentsInvalidated(DisplayInformation const& /* sender */, IInspectable const& /* args */)
{
/* コンテンツが非有効になった場合 */
}
private:
winrt::com_ptr<GameMain> m_gameMain;
};
int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
CoreApplication::Run(make<App>());
}
だいぶん、スッキリ。テキストを見る感じIInspectableがいわゆるSystem.Objectと似た概念らしい。継承させることでcom_ptrで使用する事ができるみたいで便利。
多分オブジェクト管理したいときに継承させるみたい。
次はDeviceResourceのクラスを作ってそっちもつなげてみようと思う。