⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kldshow.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
字号:
//--------------------------------------------------------------------------------------------------------
//                        游戏媒体播放模块
//KLDShow.cpp
//游戏引擎中的媒体播放部分
//作者:吴振华(kylinx)
//E-mail:game-diy@163.com
//创建于:2003/5/24 by Kylinx
//--------------------------------------------------------------------------------------------------------
#include"kldshow.h"
KGDShow::~KGDShow()
{
}
KGDShow* KGDShow::KGDShowCreate()
{
	return new KGDShowInstance();
}
KGDShowInstance::KGDShowInstance()
{
	m_pGraphBuilder=NULL;
	m_pMediaControl=NULL;
	m_pVideoWindow=NULL;
	m_pMediaSeeking=NULL;
	m_pMediaEvent=NULL;
	m_bLoaded=false;
	m_bLoop=false;
	m_dwState=MS_NULL;
	memset(m_szErrMsg,0,1024);
}
KGDShowInstance::~KGDShowInstance()
{
	Release();
}
bool KGDShowInstance::InitDirectShow()
{
	HRESULT hr=::CoInitialize(NULL);
	if(FAILED(hr))
	{
		wsprintf(m_szErrMsg,"初始化COM失败!");
		return false;
	}
	hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(void**)&m_pGraphBuilder);
	if(FAILED(hr))
	{
		wsprintf(m_szErrMsg,"创建DirectGraph对象失败!");
		return false;
	}
	
	return true;
}
bool KGDShowInstance::LoadMedia(char*szMediaFile)
{
	Release();
	if(!InitDirectShow())
		return false;
	
	HRESULT hr;
	
	WCHAR wstrFile[MAX_PATH];
    MultiByteToWideChar(CP_ACP,0,szMediaFile,-1,wstrFile,MAX_PATH);
	hr=m_pGraphBuilder->RenderFile(wstrFile,NULL);
	if(FAILED(hr))
	{
		wsprintf(m_szErrMsg,"RenderFile Failed!");
		return false;
	}
	hr=m_pGraphBuilder->QueryInterface(IID_IMediaControl,(void**)&m_pMediaControl);
	if(FAILED(hr))
	{
		wsprintf(m_szErrMsg,"获得DirectGraphMediaControl接口失败!");
		return false;
	}
	hr=m_pGraphBuilder->QueryInterface(IID_IMediaEventEx,(void**)&m_pMediaEvent);
	if(FAILED(hr))
	{
		wsprintf(m_szErrMsg,"获得DirectGraphMediaEventEx接口失败!");
		return false;
	}
	hr=m_pGraphBuilder->QueryInterface(IID_IVideoWindow,(void**)&m_pVideoWindow);
	if(FAILED(hr))
	{
		wsprintf(m_szErrMsg,"获得DirectGraphVideoWindow接口失败!");
		return false;
	}
	hr=m_pGraphBuilder->QueryInterface(IID_IMediaSeeking,(void**)&m_pMediaSeeking);
	if(FAILED(hr))
	{
		wsprintf(m_szErrMsg,"获得DirectGraphMediaSeeking接口失败!");
		return false;
	}
	if(!CheckMediaKinds())
		return false;
	m_pMediaEvent->SetNotifyWindow((OAHWND)GetActiveWindow(),UM_GRAPHNOTIFY,0);
	m_bLoaded=true;
	return true;
}
bool KGDShowInstance::HandleGraphEvent()
{
    LONG evCode, evParam1, evParam2;
	if(!m_pMediaEvent || !m_pMediaSeeking)
		return false;
	while(SUCCEEDED(m_pMediaEvent->GetEvent(&evCode,&evParam1,&evParam2,0)))
    {
        m_pMediaEvent->FreeEventParams(evCode,evParam1,evParam2);
        if(EC_COMPLETE==evCode)
        {
			if(m_bLoop==false)
			{
				Release();
				return true;
			}
            LONGLONG pos=0;
			if(FAILED(m_pMediaSeeking->SetPositions(&pos, AM_SEEKING_AbsolutePositioning ,
												   NULL, AM_SEEKING_NoPositioning)))
			{
				if(!m_pMediaControl)
					return false;
				if(FAILED(m_pMediaControl->Stop()))
                {
                    return false;
                }
                if (FAILED(m_pMediaControl->Run()))
                {
                    return false;
                }
            }
        }
    }
	return true;
}
BOOL KGDShowInstance::CheckMediaKinds()
{
	if(NULL==m_pVideoWindow)
	{
		m_bAudioFile=true;
		return true;
	}
	long visible;
	HRESULT hr=m_pVideoWindow->get_Visible(&visible);
	m_bAudioFile=false;
	if(FAILED(hr))
	{
		if(E_NOINTERFACE==hr)
		{
			m_bAudioFile=true;
			return true;
		}
		else
		{
			wsprintf(m_szErrMsg,"Get Visible State Failed!");
			return false;
		}
	}
	return true;
}
char* KGDShowInstance::GetErrorMessage()
{
	return m_szErrMsg;
}
bool KGDShowInstance::Play(HWND hWnd,BOOL bLoop)
{
	if(!m_bLoaded)
	{
		wsprintf(m_szErrMsg,"Media haven't loaded!");
		return false;
	}
	HRESULT hr;

	if(!m_bAudioFile)
	{
		m_pVideoWindow->HideCursor(OATRUE);
		hr=m_pVideoWindow->put_Owner((OAHWND)hWnd);
		if(FAILED(hr))
		{
			wsprintf(m_szErrMsg,"Put Owner Failed!");
			return false;
		}
		RECT rect;
		::GetClientRect(hWnd,&rect);
		 
		hr=m_pVideoWindow->SetWindowPosition(rect.left,
											 rect.top,
											 rect.right,
											 rect.bottom);
 	 	m_pVideoWindow->put_WindowStyle(WS_CHILD);

	}
	LONGLONG llPos=0;
	m_pMediaSeeking->SetPositions(&llPos,AM_SEEKING_AbsolutePositioning,NULL,AM_SEEKING_NoPositioning);

	hr=m_pMediaControl->Run();
	if(FAILED(hr))
	{
		wsprintf(m_szErrMsg,"Run Failed!");
		return false;
	}

	m_dwState=MS_PLAYING;
	m_bLoop=bLoop;
	return true;
}
bool KGDShowInstance::Pause()
{
	if(!m_pMediaControl)
	{
		wsprintf(m_szErrMsg,"No Media!");
		return false;
	}
	if(m_dwState!=MS_PLAYING)
		return false;
	if(FAILED(m_pMediaControl->Pause()))
		return false;
	if(m_pMediaSeeking)
		m_pMediaSeeking->GetCurrentPosition(&m_llCurrentPos);
	m_dwState=MS_PAUSE;
	return true;
}
bool KGDShowInstance::StopAndRelease()
{
	if(!m_pMediaControl)
	{
		wsprintf(m_szErrMsg,"No Media!");
		return false;
	}
	if(FAILED(m_pMediaControl->Stop()))
		return false;
	LONGLONG llPos=0;
	if(m_pMediaSeeking)
		m_pMediaSeeking->SetPositions(&llPos,AM_SEEKING_AbsolutePositioning,NULL,AM_SEEKING_NoPositioning);
	Release();
	return true;
}
bool KGDShowInstance::Reset()
{
	if(!m_pMediaControl)
	{
		wsprintf(m_szErrMsg,"No Media!");
		return false;
	}
	LONGLONG llPos=0;
	if(m_pMediaSeeking)
		m_pMediaSeeking->SetPositions(&llPos,AM_SEEKING_AbsolutePositioning,NULL,AM_SEEKING_NoPositioning);
	m_pMediaControl->Pause();
	m_dwState=MS_STOP;
	return true;
}
bool KGDShowInstance::IsPlaying()
{
	if(m_dwState==MS_PLAYING)
		return true;
	return false;
}
bool KGDShowInstance::Continue()
{
	if(m_pMediaControl)
	{
		if(m_dwState==MS_PAUSE)
		{
			if(m_pMediaSeeking)
				m_pMediaSeeking->SetPositions(&m_llCurrentPos,AM_SEEKING_AbsolutePositioning,NULL,AM_SEEKING_NoPositioning);
			m_pMediaControl->Run();
			m_dwState=MS_PLAYING;
			return true;
		}
	}
	wsprintf(m_szErrMsg,"m_pMediaControl==null");
	return false;
}
void KGDShowInstance::Release()
{
	if(m_pMediaControl)
		m_pMediaControl->Stop();
	if(m_pVideoWindow)
	{
		m_pVideoWindow->put_Visible(OAFALSE);
		m_pVideoWindow->put_Owner(NULL);
	}
	if(m_pMediaControl)
	{
		m_pMediaControl->Release();
		m_pMediaControl=NULL;
	}
	if(m_pMediaSeeking)
	{
		m_pMediaSeeking->Release();
		m_pMediaSeeking=NULL;
	}
	if(m_pMediaEvent)
	{
		m_pMediaEvent->Release();
		m_pMediaEvent=NULL;
	}
	if(m_pVideoWindow)
	{
		m_pVideoWindow->Release();
		m_pVideoWindow=NULL;
	}
	if(m_pGraphBuilder)
	{
		m_pGraphBuilder->Release();
		m_pGraphBuilder=NULL;
	}
	m_bLoaded=false;
	m_bLoop=false;
	m_dwState=MS_NULL;
	::CoUninitialize();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -