Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 游戏天堂 > 游戏开发 > HGE中的视频播放
【标  题】:HGE中的视频播放
【关键字】:HGE
【来  源】:http://blog.csdn.net/ITuring/archive/2007/01/23/1491619.aspx

HGE中的视频播放

Your Ad Here
       声明:本文章经由作者本人同意转载到此,如果您有任何问题或意见需要向作者请教,请您到文章的源出处http://blog.sina.com.cn/u/4b7f61c9010007jm交流您的意见,谢谢!
        HGE的确是2D游戏开发的利器,不过并不是所有东西它都给你提供好了,比如中文输入显示,视频播放等。中文输入显示已经在之前谈过,视频播放则可通过微软的DirectShow库进行开发。网上讲游戏中视频播放大多是用DirectShow建ddraw表面,但HGE底层使用的是D3D,所以我们需要一种更简便的方法。
        其实MSDN中有个在win32应用程序中播放视频的例子已展示了如何使用dshow播放视频,只需要取得窗口句柄,初始化各种com接口,很简单的。HGE里取得窗口句柄可以用HWND hwnd = hge->System_GetState(HGE_HWND)。这样我封装了一个VideoManager类进行视频播放管理。

//VideoManager.h

#include <hge.h>
#include <dshow.h>

//视频管理类
class VideoManager
{
public:
 VideoManager();
 ~VideoManager();

 void Init();     //初始化
 void Release();  //释放资源
 
 void PlayFile(const WCHAR* filename);  //加载视频
 void Play();    //播放
 void Pause();   //暂停
 void Stop();    //停止 

 bool IsPlaying()const { return m_bIsPlaying;} //释放正在播放
 void SetContinuePlay(bool value) { m_bIsContinuePlay=value; }
 bool HandleEvent(); //消息处理
private:
 HGE*            m_phge;
 IGraphBuilder* m_pGraph;
 IMediaControl* m_pMediaControl;
 IMediaEventEx* m_pEvent;
 HWND            m_hwnd;
 IVideoWindow* m_pVidWin;

 bool  m_bIsPlaying; //是否在播放
 bool  m_bIsContinuePlay; //是否持续播放(不间断)
};

#include "stdafx.h"
#include "VideoManager.h"

#define WM_GRAPHNOTIFY  WM_APP + 1


VideoManager::VideoManager()

 m_bIsPlaying = false;
 m_phge = 0;
 m_pGraph = 0;
 m_pMediaControl = 0;
 m_pEvent = 0; 
 m_pVidWin = 0;
 m_bIsContinuePlay = false;
}

VideoManager::~VideoManager()

}

//初始化
void VideoManager::Init()
{
 m_phge = hgeCreate(HGE_VERSION);
  m_hwnd = m_phge->System_GetState(HGE_HWND);    
}

//释放资源
void VideoManager::Release()
{
 m_pGraph->QueryInterface(IID_IVideoWindow, (void **)&m_pVidWin);
    m_pVidWin->put_Visible(OAFALSE);
    m_pVidWin->put_Owner(NULL);

    // Stop the graph.
    m_pMediaControl->Stop(); 

    long evCode;
    m_pEvent->WaitForCompletion(INFINITE, &evCode);

    if(m_pMediaControl) m_pMediaControl->Release();
    if(m_pEvent) m_pEvent->Release();
    if(m_pGraph) m_pGraph->Release();

    m_pGraph = NULL;
    m_pVidWin = NULL;
    m_pMediaControl = NULL;
    m_pEvent = NULL;
}

//加载视频
void VideoManager::PlayFile(const WCHAR* filename)

 Stop();

 m_pGraph->RenderFile(filename,NULL);

 RECT rc;
 GetClientRect(m_hwnd, &rc);
 m_pVidWin->SetWindowPosition(0, 0, rc.right, rc.bottom);
 m_pVidWin->put_Owner((OAHWND)m_hwnd); 
    m_pVidWin->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS);
  
 Play();
}

//播放视频
void VideoManager::Play()
{
 if(m_pMediaControl)
 {
  m_pMediaControl->Run();
  m_bIsPlaying = true;  

  if(m_bIsContinuePlay)
  {
   long evCode;
   m_pEvent->WaitForCompletion(INFINITE, &evCode);  //强制持续播放(不接受其他消息)
   m_bIsPlaying = false;
  }
 }
}

//暂停
void VideoManager::Pause()
{
 if(m_pMediaControl) m_pMediaControl->Pause();
}

//停止
void VideoManager::Stop()
{
 if(m_pMediaControl)
 {
  m_pMediaControl->Stop();
  m_pMediaControl->Release();
  m_bIsPlaying = false;
 }
    if(m_pEvent)  m_pEvent->Release();
    if(m_pGraph)  m_pGraph->Release();
 if(m_pVidWin) m_pVidWin->Release();

 CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&m_pGraph);

    m_pGraph->QueryInterface(IID_IVideoWindow, (void **)&m_pVidWin);  
    m_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent);
    m_pEvent->SetNotifyWindow((OAHWND)m_hwnd, WM_GRAPHNOTIFY, 0);
  
    m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);  
}

//消息处理
bool VideoManager::HandleEvent()
{
    long evCode, param1, param2;
    HRESULT hr;
    while (hr = m_pEvent->GetEvent(&evCode, &param1, &param2, 0), SUCCEEDED(hr))
    {
        hr = m_pEvent->FreeEventParams(evCode, param1, param2);
        if ((EC_COMPLETE == evCode) || (EC_USERABORT == evCode))
        {    
   Stop();    
            break;
        }
    }
 return false;
}

使用时就先初始化,然后播放,最后释放。可以使用IsPlaying()判断视频是否正在播放,若是则不绘制其他东西;但是有个问题就是若正在播放视频时还每次进行逻辑检测,则会使视频画面不连贯较卡;一般来说游戏播放视频时是不能打断的,所以可以在m_pMediaControl->Run()后加上m_pEvent->WaitForCompletion来强制连续播放,直到视频结束。

 
(转贴)关于《三体》的天文学:【上一篇】
使用HGE模拟“苍之涛”的GUI:【下一篇】
【相关文章】
  • SHGetSpecialFolderLocation
  • HGE中文显示的一个解决方案
  • 用Hge && Lua写游戏(0)
  • 用Hge && Lua写游戏(1)
  • 解决Hge窗口切换变问题
  • SHGetFileInfo
  • 在Nebula2中编mangalore时出现dGeomTriMeshGetOpcodeModel未定义的解决方法
  • 批处理应用:使用FLASHGET检查Mcafee SuperDat更新
  • 用shell模访flashget批量下载
  • 设置flashget下载任务完成后自动调用avast!扫描文件
  • 【随机文章】
  • 凡是用到swing包的程序不能编译-一个问题的解决
  • 一个模拟显示自然云彩的C程序
  • IBM郑州总代理--IBM TotalStorage 3583-L36磁带库性能介绍
  • 使用gm_board_info查找不通的节点
  • 开发者发行版: B2D Linux 20061108
  • FlashFXP 1.2.602 破解
  • Delete不了(SQL)
  • Webwork将加入Struts!
  • 英语会话精灵 V2.0 算法分析
  • Windows 2000 为USB移动盘建立“回收站”
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.