游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1524|回复: 0

郁闷DX

[复制链接]

2

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-5-23 20:25:00 | 显示全部楼层 |阅读模式
#include "StdAfx.h"
#include ".\game.h"
#include <mmsystem.h>
#include <mmreg.h>
#include <dsound.h>

CGame::CGame(void):
m_pDevice(NULL),
m_pD3D(NULL),
m_pSound(NULL)
{
}

CGame::~CGame(void)
{
SAFE_RELEASE(m_pSound);
SAFE_RELEASE(m_pDevice);
SAFE_RELEASE(m_pD3D);
CoUninitialize();
}

BOOL CALLBACK CGame:SEnumProc(LPGUID lpGUID, LPCTSTR lpszDesc, LPCTSTR lpszDrvName, LPVOID lpContext)
{
HWND    hCombo = (HWND)lpContext;
LPGUID lpTemp = NULL;

if (lpGUID != NULL)
{
if (NULL == (lpTemp = (LPGUID)malloc(sizeof(GUID))))
{
return (TRUE);
}
memcpy(lpTemp,lpGUID,sizeof(GUID));
}

ComboBox_AddString(hCombo,lpszDesc);
ComboBox_SetItemData(hCombo,ComboBox_FindString(hCombo,0,lpszDesc),lpTemp);

free(lpTemp);

return (TRUE);
}

bool CGame::Init( HINSTANCE hInstance, HWND hWnd )
{
// COM初始化
CoInitialize(NULL);

if(FAILED(_InitD3D(hWnd)))
return false;

if (FAILED(DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,(VOID*)&hWnd)))//此处有问题
{
EndDialog(hWnd,TRUE);
return (TRUE);
}

if (FAILED(DirectSoundCreate8(NULL,&m_pSound,NULL)))
return false;

m_pSound->SetCooperativeLevel(hWnd,DSSCL_PRIORITY);

LPDIRECTSOUNDBUFFER pSoundBuffer;
DSBUFFERDESC        dsdesc;
memset(&dsdesc,0,sizeof(dsdesc));
dsdesc.dwSize                      = sizeof(dsdesc);
dsdesc.dwFlags                    = DSBCAPS_PRIMARYBUFFER;
dsdesc.dwBufferBytes              = 0;
dsdesc.lpwfxFormat                = NULL;


if (FAILED(m_pSound->CreateSoundBuffer(&dsdesc,&pSoundBuffer,NULL)))
return false;

WAVEFORMATEX pwfmt;
memset(&pwfmt,0,sizeof(pwfmt));
pwfmt.wFormatTag                  = WAVE_FORMAT_PCM;
pwfmt.nChannels                    = 2;
pwfmt.nSamplesPerSec              = 44100;
pwfmt.wBitsPerSample              = 16;
pwfmt.nBlockAlign                  = pwfmt.wBitsPerSample/8 * pwfmt.nChannels;
pwfmt.nAvgBytesPerSec              = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign;

pSoundBuffer->SetFormat(&pwfmt);
SAFE_RELEASE(pSoundBuffer);

HMMIO hmmio;
if (FAILED(hmmio = mmioOpen("tomorrow will be better.wav",NULL,MMIO_ALLOCBUF|MMIO_READ)))
return false;

MMCKINFO ckRiff;
ckRiff.fccType                    = mmioFOURCC('W','A','V','E');

MMRESULT mmresult;
mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
if (mmresult != MMSYSERR_NOERROR) return false;

MMCKINFO ckInfo;
ckInfo.ckid                        = mmioFOURCC('f','m','t',' ');

mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
if (mmresult != MMSYSERR_NOERROR) return false;

WAVEFORMATEX swfmt;
if (mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1) return false;

mmresult = mmioAscend(hmmio,&ckInfo,0);

ckInfo.ckid = mmioFOURCC('d','a','t','a');

mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
if (mmresult != MMSYSERR_NOERROR) return false;

DWORD size;
size = ckInfo.cksize;

mmioClose(hmmio,0);

LPDIRECTSOUNDBUFFER pSBuffer;
DSBUFFERDESC        dsdesc1;
memset(&dsdesc1,0,sizeof(dsdesc1));
dsdesc1.dwSize                      = sizeof(dsdesc1);
dsdesc1.dwFlags                    = DSBCAPS_STATIC|DSBCAPS_CTRLPAN|DSBCAPS_CTRLVOLUME|DSBCAPS_GLOBALFOCUS;
dsdesc1.dwBufferBytes              = size;
dsdesc1.lpwfxFormat                = &swfmt;

if (FAILED(m_pSound->CreateSoundBuffer(&dsdesc1,&pSBuffer,NULL)))
return false;

LPVOID pAudio;
DWORD  bytesAudio;

if (FAILED(pSBuffer->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL))) return false;

if (mmioRead(hmmio,(HPSTR)pAudio,bytesAudio) == -1) return false;//此处有问题

if (FAILED(pSBuffer->Unlock(pAudio,bytesAudio,NULL,NULL))) return false;

mmioClose(hmmio,0);

pSBuffer-&gtlay(0,0,1);
//pSBuffer->Stop();
//pSBuffer->SetVolume(0);
//pSBuffer->SetPan(0);

return true;
}

HRESULT CGame::_InitD3D(HWND hWnd)
{
// COM interface
if( NULL == ( m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;

// current display mode
D3DDISPLAYMODE d3ddm;
if( FAILED(m_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm)))
return E_FAIL;

RECT rect;
GetClientRect(hWnd, &rect);

ZeroMemory(&m_d3dpp, sizeof(m_d3dpp));
m_d3dpp.Windowed = TRUE/*FALSE*/;
m_d3dpp.BackBufferCount = 1;
m_d3dpp.BackBufferFormat = d3ddm.Format;
m_d3dpp.BackBufferWidth = rect.right - rect.left;
m_d3dpp.BackBufferHeight = rect.bottom - rect.top;
//m_d3dpp.BackBufferWidth = d3ddm.Width;
//m_d3dpp.BackBufferHeight = d3ddm.Height;
m_d3dpp.hDeviceWindow = hWnd;
m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
m_d3dpp.EnableAutoDepthStencil = TRUE;  

// Create D3D Device  
if( FAILED( m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&m_d3dpp, &m_pDevice ) ) )
{
return E_FAIL;
}

return S_OK;
}

void CGame::Update(float fElapsedTime)
{
}

void CGame::Render(float fElapsedTime)
{
// 在每次渲染前判断是否发生设备丢失
HRESULT hr;

// 后备缓冲区须与窗口大小一致才能正确获得D3DERR_DEVICENOTRESET
// 否则检测系统协调层级只能获得D3DERR_DEVICELOST
if( m_bDeviceLost == true )
{
Sleep( 100 ); // 100 milliseconds
// 检查系统协调层级,系统可以根据函数返回值判断设备丢失时采取的措施
if( FAILED( hr = m_pDevice->TestCooperativeLevel() ) )
{
if( hr == D3DERR_DEVICELOST )
return;

// 设备丢失能够被自动重置,这时候返回进行再次尝试
if( hr == D3DERR_DEVICENOTRESET )
{
// 清空内存资源
InvalidateDeviceObjects();
// 调用Reset函数重置设备
hr = m_pDevice->Reset( &m_d3dpp );
if( FAILED(hr ) )
return;
// 重新设置内存资源里的数据
RestoreDeviceObjects();

return;
}
}
m_bDeviceLost = false;
}

m_pDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
  D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

m_pDevice->SetRenderState(D3DRS_LIGHTING,TRUE);

m_pDevice->BeginScene();

m_pDevice->EndScene();

hr = m_pDevice->Present( NULL, NULL, NULL, NULL );
if( hr == D3DERR_DEVICELOST )
m_bDeviceLost = true;
}

void CGame::InvalidateDeviceObjects(void)
{
}

void CGame::RestoreDeviceObjects(void)
{
}

有两处问题,求教大家!

if (FAILED(DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,(VOID*)&hWnd)))//此处有问题
{
EndDialog(hWnd,TRUE);
return (TRUE);
}

if (mmioRead(hmmio,(HPSTR)pAudio,bytesAudio) == -1) return false;//此处有问题

第一处报错:
e:\C++\Direct\Direct Sound\MechWarrior\Game.cpp(52): error C2440: “类型转换” : 无法从“overloaded-function”转换为“LPDSENUMCALLBACKA”

第二处报错:
干脆就Init不成功,窗口根本就不显示,注销后Init成功并显示窗口!

请教大牛!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 07:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表