游戏ie ddrawfix int failed

|  
|  
|  
|  
|  
只需一步,快速开始
查看: 6210|回复: 2
天之痕,DDRAW Init Failed怎么办呀
主题帖子积分
高级玩家, 积分 473, 距离下一级还需 127 积分
高级玩家, 积分 473, 距离下一级还需 127 积分
听大家说,天之痕很好玩,我下了一个,可出现DDRAW Init Failed,然后黑屏,我禁止了DDraw,
试了兼容模式,可还是不行,那位大大有什么好办法呀,帮帮我吧
主题帖子积分
高级玩家, 积分 473, 距离下一级还需 127 积分
高级玩家, 积分 473, 距离下一级还需 127 积分
显卡是nvs 140M
主题帖子积分
中级玩家, 积分 166, 距离下一级还需 84 积分
中级玩家, 积分 166, 距离下一级还需 84 积分
天之痕建议玩光盘版。硬盘版问题多多。
Powered by玩征服美洲出错
Direct Draw Init Failed_征服美洲吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:743贴子:
玩征服美洲出错
Direct Draw Init Failed
以前能玩的 某次电脑重装后就不能玩了我dx9.0装了 也更新了 游戏也重装过了 还是出错哪位大侠能解决下
前几章一直正常,今天玩...
楼主从147升到了250太可...
网上的各种方法也都试了...
这人幽魂鬼泣和幽魂元素...
更新之后直接下载错误,...
RT!什么原因呢?
自打这俩天4se发售之后...
正版授权奇迹重生MU页游,震撼开启!原汁原味还原奇迹,重铸经典辉煌!
不行,是黑屏后弹出个框
贴吧热议榜
使用签名档&&
保存至快速回贴DDraw笔记-一个简单的DDraw应用程序 - fangyukuan - 博客园
一个简单的DDraw应用程序&
上次谈到DDraw是一个组件。组件由接口组成。
DDraw总共由五个接口组成:&
IUnknown:所有com接口都必须从这里继承的。(请看相关文章)
IDirectDraw:使用DDraw必须创建的主接口对象。
IDirectDrawSurface:创建、控制和显示的实际显示表面。分主显示表面和从显示表面
IDirectDrawPalette:创建、加载和控制调色板,以及将它关联到显示表面。
IDirectDrawClipper:剪切DDraw光栅和位图操作到一些可见显示表面的子集。
这些接口怎么配合起来成为一个DDraw应用程序的:&
1.& 创建DDraw对象并使用QueryInterface()来得到 一个IDirectDraw7接口,或是直接用DirectDrawCreateEx()创建一个DDraw7接口。用这个接口来设置协作级别和视频模式。
2.& 使用IDirectDrawSurface7接口至少创建 一个主显示表面用以绘图。(如果每个像素为8位或更少我们会用到一个调色板)
3.& 用IDirectDrawPalette接口创建 一个调色板。(注意如果像素高于8位,如16位、24位,32位,没有调色板,现在主流2D游戏多数是16色)
4.& 如果DDraw应用程序要使用窗口,或者要减少位图以免溢出DDraw显示表面的可见边界,我们至少需要合建一个剪裁器并将其尺寸设置为可见窗口的范围。如下图
5.& 最后就是在表面上绘图了。
下面开始介绍一个最简单的DDraw应用程序:&
创建DDraw对象:
用来DirectDrawCreateEx来直接创建DDraw对象,声明如下:
HRESULT WINAPI DirectDrawCreateEx(
GUID FAR *lpGUID,
// 视频显卡驱动的GUID,NULL表示系统默认的硬件
LPVOID *lplpDD,
// 这是返回的接口
REFIID iid,
// 请求接口相对应的ID
IUnknown FAR *pUnkOuter
// 总是高为NULL);
设置协作级别:
对DDraw来说,我们唯一关心的是视频显示设备,有两种情况:全屏模式和窗口模式。
用SetCooperativeLevel来设置DDraw的协作级别。声明如下:
HRESULT SetCooperativeLevel(HWND hWnd,
// 窗口句柄,一般使用主窗口句柄
DWORD dwFlags);
// 控制标志
dwFlags控制标志,它直接影响DDraw与Windows之间协作方式。
SetCooperativeLevel()的控制标记&
DDSCL_ALLOWMODEX
允许使用Mode X (320x200,240,400) 显示模式.公当设置DDSCL_EXCLUSIVE和DDSCL_FULLSCREEN时生效
DDSCL_ALLOWREBOOT
允许在排他(全屏)模式下检测到Ctrl+Alt+Del
DDSCL_EXCLUSIVE
请求排他级别。此标记需要与DDSCL_FULLSCREEN标记同时作用
DDSCL_FPUSETUP
表示调用 程序希望配置FPU以得到最佳的Direct3D性能(禁用度和异常),这样Direct3D不需要每次都明确地FPU。更多信息,请在DirectX SDK中查询&DDraw协作级别和FPU数度&
DDSCL_FULLSCREEN
表示使用全屏模式。其他应用程序的GDI将不能写屏,此标记必须与DDSCL_EXCLUSIVE标记同时使用。
DDSCL_MULTITHREADED
请求对于多线程安全的DDraw行为。
DDSCL_NORMAL
表示应用程序是一个通常的Windows应用程序。这个标记不能与DDSCL_ALLOWMODEX, DDSCL_EXCLUSIVE, 或 DDSCL_FULLSCREEN标记一起使用。
DDSCL_NOWINDOWCHANGES
表示不允许DDraw激活时最小化或还原应用程序窗口。
上面写了一大堆标记,其实大多数情况是下面两种情况。
全屏模式:DDSCL_FPUSETUP | DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT
窗口模式:DDSCL_NORMAL
下面例子:
因为是用于学习,没有把框架搞得太复杂,全写在一个cpp里了。
关于怎么写一个GUI应用程序,可以查看《》
//------------------------------------------------------------------------- // 文件名
: 6_1.cpp// 创建者
: // 创建时间
23:37// 功能描述
一个简单的DDraw应用程序//
注意在工程中把ddraw.lib包含进去// -------------------------------------------------------------------------#define INITGUID#include&windows.h&#include &ddraw.h&LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HWND main_window_handle = NULL;
// 主窗口句柄LPDIRECTDRAW7 lpdd
  // DDraw 对象int Game_Init(void *parms = NULL, int num_parms = 0){
// 创建ddraw对象
if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL)))
return(0);
// 窗口模式(设置协作级别)
lpdd-&SetCooperativeLevel(main_window_handle, DDSCL_NORMAL);
return 1;}/////////////////////////////////////////////////////////////int Game_Shutdown(){
lpdd-&Release();
lpdd = NULL;
return 1;}int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd){
TCHAR lpszClassName[] = TEXT("kuan");
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndP
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hI
wc.hIcon = ::LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = ::LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)::GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = lpszClassN
RegisterClass(&wc);
// WS_OVERLAPPEDWINDOW 可以改变窗口大小
// WS_OVERLAPPED 不可以改变窗口大小
// WS_POPUP 全屏
hwnd = CreateWindow(lpszClassName,
TEXT("fangyukuan"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
300,80,800,600,
hInstance,
main_window_handle =//
::ShowWindow(hwnd,SW_SHOWNORMAL);//
::UpdateWindow(hwnd);//
while(::GetMessage(&msg,NULL,0,0))//
::TranslateMessage(&msg);//
::DispatchMessage(&msg);//
Game_Init();
while(TRUE)
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
if (msg.message == WM_QUIT)
::TranslateMessage(&msg);
::DispatchMessage(&msg);
Game_Shutdown();
return msg.wP}LRESULT CALLBACK WndProc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam){
switch(message)
case WM_LBUTTONDOWN:
::MessageBeep(0);
case WM_DESTROY:
::PostQuitMessage(0);
return ::DefWindowProc(hwnd,message,wParam,lParam);
return 0;}
&程序运行效果:
转载请保留下面链接下次自动登录
现在的位置:
& 综合 & 正文
ddraw显示详解
前些时间做过一个ddraw显示来代替原来的gdi显示,显示的速度快了许多,在不断的探索中,终于明白了ddraw的用法。现在记下来。本人文字功底欠佳,如有不明白的地方,一起讨论。
1.ddraw 与 gdi的区别
两者都可以用来显示,gdi是windows比较抵触的绘图方式,ddraw是用gdi来实现的,但是ddraw利用了硬件加速。ddraw更多的应用于游戏编程当中,在wince6.0上是可以使用ddraw的,所以手机编程中用draw会提速度。
2。 我的开发环境是Windows Mobile 6.0 ,用ddraw blt方式来实现显示。
#pragma comment(lib,"ddraw.lib")
LPDIRECTDRAW
mini_suf_ddraw_
LPDIRECTDRAWSURFACE
mini_suf_dds_ptr = NULL ;
DDSURFACEDESC
mini_suf_dds_
LPDIRECTDRAWSURFACE
mini_suf_dds_buf =NULL;
/创建ddraw
不用gdi绘图
//创建DirectDraw
//DD_OK =0
ret=DirectDrawCreate(NULL, &mini_suf_ddraw_api, NULL);
if(ret != DD_OK)
InitFail(_T("DirectDrawCreate failed"));
//设置全屏
ret = mini_suf_ddraw_api-&SetCooperativeLevel(suf_hwnd, DDSCL_FULLSCREEN);
if(ret != DD_OK)
InitFail(_T("SetCooperativeLevel failed"));
memset(&mini_suf_dds_desc, 0, sizeof(mini_suf_dds_desc)) ;
//ret = mini_suf_ddraw_api-&SetDisplayMode(640, 480, 16, 0, 0);
mini_suf_dds_desc.dwSize = sizeof(mini_suf_dds_desc) ;
mini_suf_dds_desc.dwFlags = DDSD_CAPS;
mini_suf_dds_desc.ddsCaps.dwCaps =DDSCAPS_PRIMARYSURFACE;
//创建主表面
ret = mini_suf_ddraw_api-&CreateSurface(&mini_suf_dds_desc, &mini_suf_dds_ptr, NULL);
if(ret != DD_OK)
InitFail(_T("createsurface ptr faild"));
int systemWidth = GetSystemMetrics(SM_CXSCREEN);
int systemHeight = GetSystemMetrics(SM_CYSCREEN);
mini_suf_dds_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT ;//|DDSD_CAPS ;//| DDSD_CAPS;
//mini_suf_dds_desc.ddsCaps.dwCaps =
mini_suf_dds_desc.dwWidth = systemW //mini_suf_dds_desc.dwW
mini_suf_dds_desc.dwHeight = systemH //mini_suf_dds_desc.dwH
ret = mini_suf_ddraw_api-&CreateSurface(&mini_suf_dds_desc, &mini_suf_dds_buf, NULL);
if(ret != DD_OK)
InitFail(_T("createsurface backbuffer faild"));
ret = mini_suf_ddraw_api-&RestoreAllSurfaces();
if (ret != DD_OK)
InitFail( _T("restore add surfaces field/n"));
mini_suf_dds_buf-&Lock(0, &mini_suf_dds_desc, DDLOCK_WAITNOTBUSY, 0) ; //g_pddrawBitmapBuf = (U8*)0x4a72c460//(U8*)( (((U32)mini_suf_dds_desc.lpSurface+3)&&2)&&2 );
g_pddrawBitmapBuf = (U8*)mini_suf_dds_desc.lpS
printf("after modify buf address:%x /n",g_pddrawBitmapBuf);
g_dwWidth = mini_suf_dds_desc.dwW
g_dwHeigh = mini_suf_dds_desc.dwH
g_dwRGBBitCount =
mini_suf_dds_desc.ddpfPixelFormat.dwRGBBitC
mini_suf_dds_buf-&Unlock(0);
ddraw采用了COM的形式架构,如果实在 .c
的文件名下编译会有链接错误,这个注意,关于COM这个还没有顾上研究。
第一步: 创建一个DirectDraw : DirectDrawCreate(NULL, &mini_suf_ddraw_api, NULL);
第二步:设置显示模式为全屏独占模式: mini_suf_ddraw_api-&SetCooperativeLevel(suf_hwnd, DDSCL_FULLSCREEN);
第三步:创建一个主表面:
mini_suf_dds_desc.dwSize = sizeof(mini_suf_dds_desc) ;
mini_suf_dds_desc.dwFlags = DDSD_CAPS; mini_suf_dds_desc.ddsCaps.dwCaps =DDSCAPS_PRIMARYSURFACE;
//创建主表面 ret = mini_suf_ddraw_api-&CreateSurface(&mini_suf_dds_desc, &mini_suf_dds_ptr, NULL);
主表面是和显存直接相关的,可以说你往这个表面写任何东西都会直接的反映到显示屏幕上。先前我直接往这个主表面写数据,发现有刷新的问题,原因就是在这里。所以我的程序中采用了向附表面写数据然后copy到主表面,这样做是稍微有点损失效率。
第四步: 创建一个副表面:
int systemWidth = GetSystemMetrics(SM_CXSCREEN); int systemHeight = GetSystemMetrics(SM_CYSCREEN); mini_suf_dds_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT ;//|DDSD_CAPS ;//| DDSD_CAPS; //mini_suf_dds_desc.ddsCaps.dwCaps = mini_suf_dds_desc.dwWidth = systemW //mini_suf_dds_desc.dwW mini_suf_dds_desc.dwHeight = systemH //mini_suf_dds_desc.dwH ret = mini_suf_ddraw_api-&CreateSurface(&mini_suf_dds_desc, &mini_suf_dds_buf, NULL);
这个地方又有玄机:我好不容易研究出来的。为啥副表面非得指定设备的宽和高。因为主表面的创建是完全和设备相关的,显示屏啥样就创建成啥样,但是附表面只是一个缓存区,需要这些宽高。
第五步: 加锁 :
mini_suf_dds_buf-&Lock(0, &mini_suf_dds_desc, DDLOCK_WAITNOTBUSY, 0) ;
我老觉得这个Lock太害人了,我原来以为是和互斥锁差不多呢,其实根本不是那么回事。其实调用lock的时候,返回了好多参数给DDSURFACEDESC结构体,包括显存地址(这个是最关键的),包括显示的宽高。
加锁是加了副表面的锁,所以获得的是副表面的显存地址,我们就是要往这个副表面的显存里写东西。加锁加到主表面那就傻了,这个还和flip有关系
flip是创建了两个相关表面,当一个表面数据写满后交换这两个表面的地址,交换地址就是通过每次的lock来实现的。这个在后边的flip实现有详细介绍。
mini_suf_dds_ptr-&Blt(NULL, mini_suf_dds_buf, NULL, NULL, NULL);
这就没啥说的了,直接将副表面的数据copy到主表面,实现显示,和bitblt类似。
3. ddrwa的flip显示实现。
//创建ddraw
不用gdi绘图
//创建DirectDraw
//DD_OK =0
ret=DirectDrawCreate(NULL, &mini_suf_ddraw_api, NULL);
if(ret != DD_OK)
InitFail(_T("DirectDrawCreate failed"));
//设置全屏
ret = mini_suf_ddraw_api-&SetCooperativeLevel(suf_hwnd, DDSCL_FULLSCREEN);
if(ret != DD_OK)
InitFail(_T("SetCooperativeLevel failed"));
memset(&mini_suf_dds_desc, 0, sizeof(mini_suf_dds_desc)) ;
//ret = mini_suf_ddraw_api-&SetDisplayMode(640, 480, 16, 0, 0);
mini_suf_dds_desc.dwSize = sizeof(mini_suf_dds_desc) ;
mini_suf_dds_desc.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT;//|DDSD_HEIGHT|DDSD_WIDTH;
mini_suf_dds_desc.ddsCaps.dwCaps =DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP;
mini_suf_dds_desc.dwBackBufferCount = 1; //一个后台缓存
/*mini_suf_dds_desc.dwWidth = 480;
mini_suf_dds_desc.dwHeight = 640;
mini_suf_dds_desc.ddpfPixelFormat.dwRGBBitCount = 16;*/
//创建主表面
ret = mini_suf_ddraw_api-&CreateSurface(&mini_suf_dds_desc, &mini_suf_dds_ptr, NULL);
if(ret != DD_OK)
InitFail(_T("createsurface ptr faild"));
mini_suf_dds_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT ;
//mini_suf_dds_desc.dwFlags = DDSD_CAPS ;
//mini_suf_dds_desc.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
mini_suf_dds_desc.dwWidth = 480;
mini_suf_dds_desc.dwHeight = 640;
ret = mini_suf_ddraw_api-&CreateSurface(&mini_suf_dds_desc, &mini_suf_dds_buf, NULL);
if(ret != DD_OK)
InitFail(_T("CreateSurface buf"));
//创建后台缓存
ret = mini_suf_dds_ptr-&EnumAttachedSurfaces( &mini_suf_dds_buf, EnumFunction );
if(ret != DD_OK)
InitFail(_T("createsurface buf field"));
//mini_suf_ddraw_api-&SetDisplayMode(640,480,16,0,0);
//Mini_SUF_Init_Show_Lock();
ret = mini_suf_dds_buf-&Lock(0, &mini_suf_dds_desc, DDLOCK_WAITNOTBUSY, 0) ;
if(ret != DD_OK)
InitFail(_T("lock buf field"));
g_pddrawBitmapBuf = (U8*)mini_suf_dds_desc.lpS
g_dwWidth = 480 ; //mini_suf_dds_desc.dwW
g_dwHeigh = 640//mini_suf_dds_desc.dwH
g_dwRGBBitCount = 16 ;//= mini_suf_dds_desc.ddpfPixelFormat.dwRGBBitC
//memset(g_pddrawBitmapBuf,0x11,1000);
mini_suf_dds_buf-&Unlock(0) ;
第一步. 创建
基本和前面类似,参数不同而已,
mini_suf_dds_desc.dwSize = sizeof(mini_suf_dds_desc) ;
mini_suf_dds_desc.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT;//|DDSD_HEIGHT|DDSD_WIDTH;
mini_suf_dds_desc.ddsCaps.dwCaps =DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP; mini_suf_dds_desc.dwBackBufferCount = 1; //一个后台缓存
/*mini_suf_dds_desc.dwWidth = 480; mini_suf_dds_desc.dwHeight = 640; mini_suf_dds_desc.ddpfPixelFormat.dwRGBBitCount = 16;*/
//创建主表面 ret = mini_suf_ddraw_api-&CreateSurface(&mini_suf_dds_desc, &mini_suf_dds_ptr, NULL);
创建了带一个后台缓存的主表面,在真正的游戏编程当中,有很多的后台缓存表面,贴上位图,不断的进行切换,windows自带的例子有这样的。
第二步. 加锁 的时候要切换表面的显存地址的, 前面的是没有切换的注意啊。
//mini_suf_dds_buf-&Restore();
ret = mini_suf_dds_buf-&Lock(0, &mini_suf_dds_desc, 0, 0) ;
if(ret != DD_OK)
InitFail(_T("lock field"));
g_pddrawBitmapBuf = (U8 *) mini_suf_dds_desc.lpS
第三步. 显示: 就简单了。
mini_suf_dds_ptr-&Flip( NULL, 0 );
横盘的时候,和手机本身和Windwos Mobile 的版本有相当大的关系。
/**************************************************************************
*函数名:SUF_AutoFit_Show
*函数功能:自适应旋转显示
*add by guobin
***************************************************************************/
void SUF_AutoFit_Show( int wide, int heigh)
//获取到framesize马上就横屏
//只能设置一次
static int once=0;
if(once == 0){
if(wide & heigh)
DEVMODE devmode = {0};
devmode.dmSize = sizeof(DEVMODE);
devmode.dmDisplayOrientation = DMDO_270; //水平模式
devmode.dmFields = DM_DISPLAYORIENTATION;
ChangeDisplaySettingsEx(NULL, &devmode, NULL, 0, NULL);
DEVMODE devmode = {0};
devmode.dmSize = sizeof(DEVMODE);
devmode.dmDisplayOrientation = DMDO_0; //竖屏
devmode.dmFields = DM_DISPLAYORIENTATION;
ChangeDisplaySettingsEx(NULL, &devmode, NULL, 0, NULL);
这是我写的自动横屏的部分,刚开始我旋转90度,死活不行,改成270度就好了,不知道微软是咋滴了,换个手机就好了。
手机软件开发,一定不能忘记手机本身的局限性。
还要在一个问题无法解决的时候,多多尝试,自己写写demo程序,这个提高自己编码能力最快的办法。
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 ddraw.lib 下载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信