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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值