游戏开发论坛

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

一个DirectDraw的问题,困惑了我很久。。。。

[复制链接]

9

主题

48

帖子

53

积分

注册会员

Rank: 2

积分
53
QQ
发表于 2005-2-1 03:01:00 | 显示全部楼层 |阅读模式
只是简单的在屏幕上随机的画点,640*480*8,只有一个主表面,不带后台缓冲。但是在不同的地方释放DDraw的对象,会有不同的结果。  

//////////////////  
//以下代码运行正常  
//////////////////  
int  WINAPI  WinMain(.........)  
{  
       //...............省略若干  
       GameInit(hwnd);  
       while(1)  
       {  
           if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))  
           {  
                       if  (msg.message  ==  WM_QUIT)  
                                   break;  
                       TranslateMessage  (&msg)  ;  
                           DispatchMessage  (&msg)  ;  
           }  
           GameMain();  
           Sleep(30);  
         }  
         GameOut();      //在这里释放  
         return  msg.wParam  ;  
}  

int  GameMain()  
{  
       if(GetAsynckeyState(VK_ESCAPE))  
               SendMessage(hwnd,WM_CLOSE,0,0);  

         //....................  
}  

********************************  
********************************  


但是如果我把GameOut()的调用放到下面这里,在按esc退出后,就弹出非法操作的提示框(就是那个什么即将关闭,报不报告错误)。  

int  WINAPI  WinMain(.........)  
{  
       //...............  
       GameInit(hwnd);  
       while(1)  
       {  
           if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))  
           {  
                       if  (msg.message  ==  WM_QUIT)  
                                   break;  
                       TranslateMessage  (&msg)  ;  
                           DispatchMessage  (&msg)  ;  
           }  
           GameMain();  
           Sleep(30);  
         }  
           //不在这里释放  
         return  msg.wParam  ;  
}  

int  GameMain()  
{  
       if(GetAsynckeyState(VK_ESCAPE))  
       {  
               GameOut();    //在这里释放  
               SendMessage(hwnd,WM_CLOSE,0,0);  
         }  
         //....................  
}

9

主题

48

帖子

53

积分

注册会员

Rank: 2

积分
53
QQ
 楼主| 发表于 2005-2-1 03:01:00 | 显示全部楼层

Re:一个DirectDraw的问题,困惑了我很久。。。。

另外,在后一种方法中,我把  
       if(GetAsynckeyState(VK_ESCAPE))  
       {  
               GameOut();    //在这里释放  
               SendMessage(hwnd,WM_CLOSE,0,0);  
         }  
改成  
       if(GetAsynckeyState(VK_ESCAPE))  
       {  
               GameOut();    //在这里释放  
               exit(0);  
         }  
又没有问题了。  
真是奇怪

3

主题

186

帖子

190

积分

注册会员

Rank: 2

积分
190
发表于 2005-2-1 10:10:00 | 显示全部楼层

Re:一个DirectDraw的问题,困惑了我很久。。。。

SendMessage(hwnd,WM_CLOSE,0,0);  
改成
SendMessage(hwnd,WM_QUIT,0,0);  
试试

9

主题

48

帖子

53

积分

注册会员

Rank: 2

积分
53
QQ
 楼主| 发表于 2005-2-1 15:33:00 | 显示全部楼层

Re:一个DirectDraw的问题,困惑了我很久。。。。

也不行,而且按esc后半天不退出,只得alt+F4

24

主题

229

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2005-2-1 16:07:00 | 显示全部楼层

Re:一个DirectDraw的问题,困惑了我很久。。。。

可能是这里的问题:

int  GameMain()  
{  
       if(GetAsynckeyState(VK_ESCAPE))  
       {  
               GameOut();    //在这里释放  
               SendMessage(hwnd,WM_CLOSE,0,0);  
         }  
         //....................  
}
你省略的渲染代码在GameOut()之后还会执行,而你的ddraw已经被GameOut()是放掉了。已经无效,所以会非法操作。
改成这样试试:
int  GameMain()  
{  
       if(GetAsynckeyState(VK_ESCAPE))  
       {  
               GameOut();    //在这里释放  
               SendMessage(hwnd,WM_CLOSE,0,0);
               return 0;  //加上这句!!试试
         }  
         //....................  
}

9

主题

48

帖子

53

积分

注册会员

Rank: 2

积分
53
QQ
 楼主| 发表于 2005-2-1 16:10:00 | 显示全部楼层

Re:一个DirectDraw的问题,困惑了我很久。。。。

唉,还是怪我没把Windows消息机制搞清楚。我去试试看

9

主题

48

帖子

53

积分

注册会员

Rank: 2

积分
53
QQ
 楼主| 发表于 2005-2-1 16:19:00 | 显示全部楼层

Re:一个DirectDraw的问题,困惑了我很久。。。。

谢谢,解决了!哈哈,真是如释重负。
这么说来WM_CLOSE是放在消息队列里轮循的响应的,而不是抢先响应的咯?

24

主题

229

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2005-2-1 16:27:00 | 显示全部楼层

Re:一个DirectDraw的问题,困惑了我很久。。。。

你这个问题不是wm_close得问题,而是你的GameMain得问题。
释放掉了ddraw再渲染肯定出问题。我也遇到过同样问题。自己多小心把。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-24 06:19

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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