您的位置:首页 > 其它

关于一个D3D设备支持多个win32窗口- -

2010-08-05 14:58 330 查看
光速的完成了ProduceSystem的client和srv后,数了数,3000行,2周,一个累字了得。。。。休息了两天后,钢哥给我说,来看看聊天面板的帧动画和外置聊天窗口。- -, 最蛋疼的外置聊天窗口还是要做~~诶,之前看过一下此版本的外置窗口实现,纯WIN32 GDI~怎一个痛苦了得,帧动画到时用引擎现成的接口封装完毕~~~但是外置的就很痛苦了,于是就想,外置的窗口不都是win32吗,好,改成3D窗口的试试,改成了,就可以用现成的底层引擎支持~~~~~。

刚开始,看了看源代码,看到了 由游戏的主WinMain传入进来的hWnd和hInstance建立了一个wc窗口风格,然后下面的就是直接调用API Creat(...); 来创建的窗口,看看了Creat的返回参数,OK , HWND, 保存了这个返回值在用

// 初始化3D窗口
if( NULL == ( m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return false;

if( FAILED( m_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
m_hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,
&gTalkDecvice ) ) )
{
return false;
}

OK, 顺利成功,直接顺利渲染出3D窗口,但是过程万多不容易。。。。啊,但是貌似引擎底层是主游戏里的D3Ddevice来初始化很多资源的,怎么办?外部的gTalkDecvice 根本就不用。。。

达人出现,一开发引擎的同事给我说就用主游戏里的D3Ddevice来渲染外部窗口~~ (这么凶?)。。。上代码:

// .h

IDirect3DSwapChain9 *m_pD3dSwapChain9;

// .cpp

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.hDeviceWindow = m_hWnd; // 这里很重要,之前没有写这里

GetD3dDevice()->CreateAdditionalSwapChain( &d3dpp, &m_pD3dSwapChain9 );
if ( !m_pD3dSwapChain9 )
{
return false;
}

// 渲染

// GetD3dDevice() 获取主游戏3D设备句柄

if( NULL == m_pD3dSwapChain9 )
return 0;

IDirect3DSurface9 *pTempD3dSurface9 = NULL;
IDirect3DSurface9 *pTempOldD3dSurface9 = NULL;
m_pD3dSwapChain9->GetBackBuffer( 0, D3DBACKBUFFER_TYPE_MONO, &pTempD3dSurface9 );
GetD3dDevice()->GetRenderTarget( 0, &pTempOldD3dSurface9 );
if ( NULL == pTempD3dSurface9 || NULL==pTempOldD3dSurface9 )
{
return 0;
}
GetD3dDevice()->SetRenderTarget( 0, pTempD3dSurface9 );

GetD3dDevice()->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(221,2,2), 1.0f, 0 );
if( SUCCEEDED( GetD3dDevice()->BeginScene() ) )
{

GetD3dDevice()->EndScene();
}

m_pD3dSwapChain9->Present( NULL, NULL, NULL, NULL, NULL);

pTempD3dSurface9->Release();
pTempD3dSurface9=NULL;

GetD3dDevice()->SetRenderTarget( 0, pTempOldD3dSurface9 );
pTempOldD3dSurface9->Release();
pTempOldD3dSurface9=NULL;

哦也,顺利在外部窗口上渲染出3D界面,而引擎现在也可以使用部分套件,移植GUI。。努力,膜拜达人同事+1.hehe,我们游戏的外置窗口一定要比其它游戏丰富了!呵呵
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: