游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4127|回复: 7

求助!DirectDraw 全屏模式切换到桌面再切换回去 就锁频错

[复制链接]

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2010-5-23 18:07:00 | 显示全部楼层 |阅读模式
求助!DirectDraw 全屏模式切换到桌面再切换回去 就锁频错误。。。

    while (GetMessage (&msg, NULL, 0, 0))
     {
        //MyGame.GameMain();// 如果在这里调用这个函数(下面的这个函数删除掉) 切换到桌面
                            //在切换回该程序 就切换不了  是未响应(没切换回该程序就未响应了)

         TranslateMessage (&msg) ;
         DispatchMessage (&msg) ;

         //游戏的主循环
         MyGame.GameMain();//
    }                       


  XXX::GameMain()
{
        HWND ahwnd = GetForegroundWindow();

        if(ahwnd != m_hWnd)//if(!m_bRunGame)
        {
                return 1;
        }
        else
        {
                Sleep(33); //窗口模式 马上渲染的话会内存寻址错误
        }
  //........
  //.........
  //渲染之类的....................
}//end of GameMain()

      渲染的时候锁屏错误, 很奇怪,如果不渲染倒是不出错误,但程序切换进去后 未响应 =。=
    如果是窗口模式 切换多少次都没关系  都正常运行

全屏模式的DirectDraw协作为:
   m_lpdd->SetCooperativeLevel(m_hWnd,
                        DDSCL_ALLOWMODEX | DDSCL_FULLSCREEN |
                        DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT )))
全屏模式的窗口风格为:
   SetWindowLong(m_hWnd,GWL_STYLE, WS_POPUP | WS_VISIBLE);




窗口模式的DirectDraw协作为:
  m_lpdd->SetCooperativeLevel(m_hWnd,DDSCL_NORMAL)
窗口模式的窗口风格为:
        SetWindowLong(m_hWnd,GWL_STYLE, WS_CAPTION        |
                                        WS_SYSMENU        |  
                                        WS_MINIMIZEBOX);




  郁闷死了阿 调试了几个小时还是没解决
  
    哪位大大抽点宝贵时间  帮我指出错误并纠正。。。
        在此万分感谢啦

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2010-5-23 18:47:00 | 显示全部楼层

Re:求助!DirectDraw 全屏模式切换到桌面再切换回去 就锁频

    while (GetMessage (&msg, NULL, 0, 0))
     {
          MyGame.GameMain();// 如果先调用它的话 窗口模式切换也会内存错误
         TranslateMessage (&msg) ;
         DispatchMessage (&msg) ;
    }  

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2010-5-23 23:29:00 | 显示全部楼层

Re:求助!DirectDraw 全屏模式切换到桌面再切换回去 就锁频

1 需要切换回去
2 需要恢复所有表面

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2010-5-23 23:43:00 | 显示全部楼层

Re: Re:求助!DirectDraw 全屏模式切换到桌面再切换回去 就锁

instemast: Re:求助!DirectDraw 全屏模式切换到桌面再切换回去 就锁频错误。。。

1 需要切换回去
2 需要恢复所有表面


大大怎么实现阿。。。。
太抽象了 我不懂呃

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2010-5-23 23:46:00 | 显示全部楼层

Re:求助!DirectDraw 全屏模式切换到桌面再切换回去 就锁频

   刚才我去试了一下 D3D龙书(3D游戏程序设计入门) 的框架
他的全屏模式切换到桌面 然后 切换到程序  程序也不正常了
  
   

0

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2010-5-27 12:38:00 | 显示全部楼层

Re:求助!DirectDraw 全屏模式切换到桌面再切换回去 就锁频

因为全屏下你用了 离屏页面, 但是一旦在非全屏下时, 离屏页面就不可用了, 你Flip 就会失败。

0

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2010-5-27 12:39:00 | 显示全部楼层

Re:求助!DirectDraw 全屏模式切换到桌面再切换回去 就锁频

应该说是 GetAttachSurface ,  这个得到的surface 没用了

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2010-5-28 18:33:00 | 显示全部楼层

Re:求助!DirectDraw 全屏模式切换到桌面再切换回去 就锁频

1 要等切换回游戏,才能成功执行以下操作。(在WM_DISPLAYCHANGE时执行即可)
2 首先调用 hr = m_pddraw->RestoreAllSurfaces();
3 重画所有不是每帧都重写的表面(就是怪物图片之类),或者干脆重新创建并重画。
(因为可能不知道该如何重画这些表面(要从资源中加载),所以,应当用个虚函数)
4 对于前台和后台缓冲,因为每帧都重写,所以没有必要重新加载。

参考下我的代码:

void CGraphics::Reset()
{
        if(m_pddraw==null) throw new C2DErr(C2DErr::INVALID_MEMBER);
        HRESULT hr;
        if(FAILED( hr = m_pddraw->RestoreAllSurfaces() )) throw new C2DErr(C2DErr:X_ERR,hr);
        CSurf::Reset();
}
void CSurf::Reset()
{
        for(std::list<CSurf *>::iterator i = s_SurfWithCreator.begin(); i != s_SurfWithCreator.end(); i++)
        {
                INST_ASSERT(*i);
                INST_ASSERT((*i)->m_pCreator);
                if((*i)->GetMemory() != MEM_SYSTEM) // 系统内存的无需重建
                {
                        (*i)->m_pCreator->CreateSurf(*i); // 创建ddraw表面并加载图片
                }
        }
}
CSurf::CSurf(ISurfCreator *creator) // 创建一个带有creator的表面对象
{
        INST_ASSERT(creator);
        m_pCreator=creator;
        s_SurfWithCreator.push_back(this);
        m_pCreator->CreateSurf(this); // 建创建ddraw表面并加载图片
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-9 14:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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