windows app上的應用要怎麼寫呢?
1.下載安裝 microsoft visual studio express 2012 for windows 8
2.在上面工程下面創建一個win8的目錄
然後創建一個direct3d的遊戲工程在win8目錄下:
3.爲什麼要創建3D的遊戲工程?
因爲我在裏面很容易找到了遊戲主循環。
4.因爲創建的是一個D3D的工程。所以需要做些修改。
這裏主函數就使用win8自帶的,所以包含項目代碼的時候,上面jni\src目錄不需要包含進來
5.修改CubeRenderer.cpp,去掉原來的繪製界面函數,改成我們自己的
void CubeRenderer::Render()
{
{
m_d2dContext->BeginDraw();
g_SkGame.show(&g_SkShow);
// 忽略 D2DERR_RECREATE_TARGET。此錯誤指示設備
// 丟失。將在下一次調用 Present 時對其進行處理。
HRESULT hr = m_d2dContext->EndDraw();
if (hr != D2DERR_RECREATE_TARGET)
{
DX::ThrowIfFailed(hr);
}
}
6.因爲我們的遊戲是2D的,修改Direct3DBase.cpp添加2D支持
ComPtr < IDXGIDevice > dxgiDevice;
// 創建 Direct2D 設備對象和對應的上下文。
D2D1_FACTORY_OPTIONS options;
ZeroMemory(&options, sizeof(D2D1_FACTORY_OPTIONS));
DX::ThrowIfFailed(
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,
__uuidof(ID2D1Factory1), &options, &m_d2dFactory));
DX::ThrowIfFailed(m_d3dDevice.As(&dxgiDevice));
DX::ThrowIfFailed(
m_d2dFactory->CreateDevice(dxgiDevice.Get(), &m_d2dDevice));
DX::ThrowIfFailed(
m_d2dDevice->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE,
&m_d2dContext));
DX::ThrowIfFailed(
DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory), &m_dwriteFactory));
DX::ThrowIfFailed(
CoCreateInstance(CLSID_WICImagingFactory, nullptr,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_wicFactory)));
SkRenderer * pSkRenderer = new SkRenderer();
pSkRenderer->init(m_wicFactory, m_dwriteFactory, m_d2dContext);
g_SkShow.init(pSkRenderer);
修改
// 在 SizeChanged 事件的事件處理程序中調用此方法。
void Direct3DBase::UpdateForWindowSizeChange()
{
if (m_window->Bounds.Width != m_windowBounds.Width
|| m_window->Bounds.Height != m_windowBounds.Height
|| m_orientation != DisplayProperties::CurrentOrientation) {
ID3D11RenderTargetView* nullViews[] = { nullptr };
m_d3dContext->OMSetRenderTargets(ARRAYSIZE(nullViews), nullViews,
nullptr);
m_d2dContext->SetTarget(nullptr);
m_d2dTargetBitmap = nullptr;
m_renderTargetView = nullptr;
m_depthStencilView = nullptr;
m_d3dContext->Flush();
CreateWindowSizeDependentResources();
g_SkGame.resize();
}
}
7.修改原來的函數主邏輯文件xxx.cpp
void SkyparkGame::Run()
{
//BasicTimer^ timer = ref new BasicTimer();
//while (!m_windowClosed)
//{
// if (m_windowVisible)
// {
// timer->Update();
// CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
// m_renderer->Update(timer->Total, timer->Delta);
// m_renderer->Render();
// m_renderer->Present(); // 此調用將同步爲顯示幀速率。
// }
// else
// {
// CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending);
// }
//}
g_SkGame.init();
Sint64 siGameBegin = g_SkGameTimer.getGameMTime();
g_SkGameTimer.m_siGameLastTime = siGameBegin;
g_SkGameThread.run(g_SkGameTimer.m_siGameLastTime);
Sint64 siShowBegin = siGameBegin;
while (!m_windowClosed) {
Sint64 iCurTime = g_SkGameTimer.getGameMTime();
while (g_SkGameTimer.m_siGameLastTime + g_SkGameTimer.siGameLoopMsec
< iCurTime) {
g_SkGameTimer.m_siGameLastTime += g_SkGameTimer.siGameLoopMsec;
g_SkGameThread.run(g_SkGameTimer.m_siGameLastTime);
}
if (m_windowVisible) {
CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(
CoreProcessEventsOption::ProcessAllIfPresent);
m_renderer->Render();
m_renderer->Present(); // 此調用將同步爲顯示幀速率。
} else {
CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(
CoreProcessEventsOption::ProcessOneAndAllPending);
}
}
}
8.使用D2D的函數替換SDL函數實現。
9.編譯運行: