SDL遊戲之路(二)--多平臺支持--wp8

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.編譯運行:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章