|
|

楼主 |
发表于 2007-4-30 00:52:00
|
显示全部楼层
Re: DirectPlay中的图象抖动问题
算了,还是现在就贴出来,反正回去也睡不着!
就辛苦你啦!多谢!!!
//-----------------------------------------------------------------------------
// 初始化DirectXPlay
//-----------------------------------------------------------------------------
HRESULT DPlayNetServiceProvider::InitDirectPlay(void)
{
......
// 创建IDirectPlay8Peer对象
if( FAILED( hr = CoCreateInstance( CLSID_DirectPlay8Peer, NULL,
CLSCTX_INPROC_SERVER,
IID_IDirectPlay8Peer,
(LPVOID*) &m_pDP ) ) )
{
OutputError( TEXT("Failed Creating the IDirectPlay8Peer Object"), hr );
return hr;
}
// 初始化DirectPlay
if( FAILED( hr = m_pDP->Initialize(NULL, DirectPlayMessageHandler, 0 ) ) )
{
OutputError( TEXT("Failed Initializing DirectPlay"), hr );
return hr;
}
......
}
//-----------------------------------------------------------------------------
// 回调函数。
//调用DPlayNetServiceProvider::MessageHandler处理DirectXPlay发送给应用程序的各种消息。
//-----------------------------------------------------------------------------
HRESULT WINAPI DirectPlayMessageHandler(PVOID pvUserContext, DWORD dwMessageId, PVOID pMsgBuffer)
{
HRESULT hr = S_OK;
switch( dwMessageId )
{
//处理接收到的消息
case DPN_MSGID_RECEIVE:
hr = netProvider->ReceiveMessage(pvUserContext,dwMessageId,pMsgBuffer);
break;
......
}
return hr;
}
//-----------------------------------------------------------------------------
//处理接收到的消息。
//-----------------------------------------------------------------------------
HRESULT DPlayNetServiceProvider::ReceiveMessage(PVOID pvUserContext, DWORD dwMessageId, PVOID pMsgBuffer)
{
PDPNMSG_RECEIVE pMsg=NULL;
pMsg = (PDPNMSG_RECEIVE) pMsgBuffer;
//将接收到的BYTE*类型的数据转换为矩阵指针类型
m_recMatrix = (D3DXMATRIX*)(pMsg->pReceiveData);
return S_OK;
}
//-----------------------------------------------------------------------------
// 向会话中的所有玩家发送消息
//-----------------------------------------------------------------------------
HRESULT DPlayNetServiceProvider::SendDirectPlayMessage(BYTE* sendData)
{
......
dpnBuffer.pBufferData = sendData;
dpnBuffer.dwBufferSize = sizeof(D3DXMATRIX);
if( FAILED( hr = m_pDP->SendTo( DPNID_ALL_PLAYERS_GROUP, // dpnid
&dpnBuffer, // pBufferDesc
1, // cBufferDesc
0, // dwTimeOut
NULL, // pvAsyncContext
NULL, // pvAsyncHandle
DPNSEND_SYNC |
DPNSEND_NOLOOPBACK ) ) ) // dwFlags
{
// OutputError( TEXT("Failed Sending Data"), hr );
//return hr;
}
return S_OK;
}
//-----------------------------------------------------------------------------
//获取收到的matrix(表示位置的矩阵)
//-----------------------------------------------------------------------------
D3DXMATRIX* DPlayNetServiceProvider::GetReceivedMatrix()
{
return m_recMatrix;
}
///////////////////////////////////////////////////////////////////////////////////
//以上为网络通信的相关代码
//以下为在整个程序中与网络相关的部分
///////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hIns,HINSTANCE hPre,LPSTR lpCmdLine,int nShow)
{
........
CoInitializeEx(NULL,COINIT_MULTITHREADED);
........
netProvider = new DPlayNetServiceProvider;
// Init the DirectPlay system
if( FAILED( hr = netProvider->InitDirectPlay() ) )
{
}
........
while(msg.message != WM_QUIT) {
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
if(msg.message != WM_QUIT) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else {
g_pd3dEnv->Render();
Sleep(20);
}
.........
}
void CD3DEnv::Render()
{
.......
DrawPlane();//显示自己
............
//render guest plane
RenderGuestPlane();//显示另外一架
...........
}
void CD3DEnv: rawPlane()
{
//先显示自己,然后把自己的位置发送给远程玩家。
.............
//----------------------------------------------------------------
//发送消息
BYTE *pByte;
pByte = (BYTE*)(&mat);
netProvider->SendDirectPlayMessage(pByte);
//------------------------------------------------------------------
}
void CD3DEnv::RenderGuestPlane()
{
static D3DXMATRIX matPlane;
D3DXMATRIX matIdentity;
D3DXMatrixIdentity(&matIdentity);
if((netProvider) && (netProvider->GetReceivedMatrix() != NULL))
{
matPlane = *(netProvider->GetReceivedMatrix());
.............
} |
|