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.编译运行: