DirectDraw6的初级编程应用 —— 配合实例讲解,让你迅速入门 (转)

DirectDraw6的初级编程应用 —— 配合实例讲解,让你迅速入门 (转)[@more@]

DirectDraw6的初级编程应用
by Gamster H. S

目录:
1. VC的环境设置.
2. 浅谈COM.
3. DirectDraw简述.
4. DirectDraw的初级编程应用.


第一篇:VC的环境设置.
在进行任何DirectX有关的编程之前,你得先设置VC的环境变量值.主要是方便以后的项目设计.
我使用的是VC5和DirectX6,这是我的设置:

1. 选择Options.
2. 选择Directories Tab.
3. 在Show directories for框中选择include files
4. 在Directories框中选择一项新项,键入C:mssdkinclude,此目录将含有所有有关的头文件
如:ddraw.h, dsound.h, ...
5. 在Show directories for框中选择Library files
6. 在Directories框中选择一项新项,键入C:mssdklib,此目录将含有所有有关的库文件,
如:ddraw.lib, dsound.lib, dxguid.lib, ...
7. 选择OK

当你编译建立微软的程式时,以下是基本步骤是:

1. 将整个ddex1(c:mssdkmultimediaddrawddrawsrcddex1)目录copy到你任为合适的目
录中(如d:mydd,全称为d:myddddex1).
2. 在VC5的菜单项Files中选择New.
3. 选择win32 Application.
4. 键入合适的Location(如d:mydd).
5. 键入合适的Project Name(在此为ddex1).
6. 选择菜单项Project->Add to Project->Files,加入*.cpp文件,*.rc文件.在ddex1项目中,
你要加入ddex1.cpp和ddex1.rc文件.
7. 选择菜单项Project->Settings,在Link中的object/Library Modules中加入ddraw.lib
dxguid.lib.
8. Build and run.
9. Any prblems? You know where to find me!

第二篇:浅谈COM.
我不大清楚,但没几个人混得清楚的.他们要么知道点皮毛,要么还在oop阶段锻练着.别人问
起,只说DirectX3,5,6运用许多COM技术.

第三篇:DirectDraw简述.
DirectX大大提高硬件在Win环境下的运用.DirectDraw提高各种显示硬件的工作.

第四篇:DirectDraw的初级编程应用.
本文将简述ddex1至ddex5中各种DirectDraw api的运用(in detail),至于更高的设计运用,望各位
自己慢慢从其他人手中学之.

1. DirectDraw例子中的全局变量.

file://-----------------------------------------------------------------------------
// Global data
file://-----------------------------------------------------------------------------
LPDIRECTDRAW4  g_pDD = NULL;  // DirectDraw object
LPDIRECTDRAWSURFACE4  g_pDDSPrimary = NULL;// DirectDraw primary surface
LPDIRECTDRAWSURFACE4  g_pDDSBack = NULL;  // DirectDraw back surface
LPDIRECTDRAWSURFACE4  g_pDDSOne = NULL;  // Offscreen surface 1
LPDIRECTDRAWPALETTE  g_pDDPal = NULL;  // The primary surface palette
BOOL  g_bActive = FALSE;  // Is application active?

以上全局变量分别为:
1)IDirectDraw4的对象指针.用它建立其它几个全局变量.
2)IDirectDrawSurfce4的对象指针,在此是3个:
  g_pDDSPrimary是显示缓冲块,用于显示;
  g_pDDSBack是幕后显示缓冲块,从后屏缓冲区截图后拼在此缓冲块上,随后翻成显示缓冲
块,原有显示缓冲块翻成幕后显示缓冲块;
  g_pDDSOne是后屏缓冲区,用于存储不同图形资料.
3)IDirectDrawPalette的对象指针,用于存储特定BITMAP的调色板.用在Color manipulation.
4)另一变量和DirectDraw无任何关系.只是确认程序是否处于运行状态.
以上的编码含有说明,所以对任何人都易理解.Any problems? You know where to find me!


2.初始化所有全程变量
这些原码我抄自ddex5.cpp中的static HRESULT InitApp(HINSTANCE hInstance, int nCmdShow)函数中:

1)定义几个局部变量:
  DDSURFACEDESC2  ddsd;  // the structure contain information about a particluar DirectDrawSurface.
  DDSCAPS2  ddscaps;  // this is important for further step
  HRESULT  hRet;   // error output
  LPDIRECTDRAW  pDD;  // IDirectDraw Object.

2)组建各项对象:

  ///////////////////////////////////////////////////////////////////////////
  // Create the main DirectDraw object
  ///////////////////////////////////////////////////////////////////////////
  hRet = DirectDrawCreate(NULL, &pDD, NULL);
  if (hRet != DD_OK)
  return InitFail(hWnd, hRet, "DirectDrawCreate FAILED");

先建立一个IDirectDraw Object,hRet装有DirectDrawCreate()的返回值,这一招非常有用,所有的DirectX
函数都返回一定的数值,DirectDraw的函数返回DD_OK表示函数调用成功.DDERR_***的返回值表示函数
调用失败(或其他原因).检查函数返回值,以备以后布骤不会出错.我将推迟解释InitFail()函数.

  // Fetch DirectDraw4 interface
  hRet = pDD->QueryInterface(IID_IDirectDraw4, (LPVOID *) & g_pDD);
  if (hRet != DD_OK)
  return InitFail(hWnd, hRet, "QueryInterface FAILED");

我们用COM中的QueryInterface申请一个IDirectDraw4对象,不同于DIRECTX5,DirectDraw增加了IDirectDraw4
界面,同时新增了几个更有用的函数(METHODS).你可以从DirectX的帮助文件中查到.虽是英文,
但好好啃一啃还是有收获的.

  // Get exclusive mode
  hRet = g_pDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
  if (hRet != DD_OK)
  return InitFail(hWnd, hRet, "SetCooperativeLevel FAILED");

我们接着设置显示方式,你可设置全屏,或视窗型,或MODEX,从DDEX1到DDEX5的程式中使用的显
示方式都是DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN,全屏!你可以从DirectX的帮助文件中查到有关
SetCooperativeLevel()的注解.虽是英文,但好好啃一啃还是有收获的.

  // Set the video mode to 640x480x8
  hRet = g_pDD->SetDisplayMode(640, 480, 8, 0, 0);
  if (hRet != DD_OK)
  return InitFail(hWnd, hRet, "SetDisplayMode FAILED");

我们接着设置屏幕大小,色素和刷新速度.你可以从DirectX的帮助文件中查到有关SetDisplayMode()的
注解.虽是英文,但好好啃一啃还是有收获的.全屏下你所设显示可为320X200, 640X480, 800X600,
1024X768, 1280X1024, 1600X1280等等.色素从8, 16, 24, 32BITs.

  // Create the primary surface with 1 back buffer
  ZeroMemory(&ddsd, sizeof(ddsd));
  ddsd.dwSize = sizeof(ddsd);
  ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
  DDSCAPS_FLip |
  DDSCAPS_COMPLEX;
  ddsd.dwBackBufferCount = 1;
  hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSPrimary, NULL);
  if (hRet != DD_OK)
  return InitFail(hWnd, hRet, "CreateSurface FAILED");

  // Get a pointer to the back buffer
  ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
  hRet = g_pDDSPrimary->GetAttachedSurface(&ddscaps, &g_pDDSBack);
  if (hRet != DD_OK)
  return InitFail(hWnd, hRet, "GetAttachedSurface FAILED");

建立一显示缓冲块附带一块幕后显示缓冲块.首先你初始化DDSURFACEDESC2的对象.如下:

  ZeroMemory(&ddsd, sizeof(ddsd));
  ddsd.dwSize = sizeof(ddsd); // you will fail without this!!

我观查到的现象是,每个DirectDraw结构含有dwSize成员,一定要初始化这个成员如下:
  ddStructObj.dwSize = sizeof(DDSTRUCT); // you will fail without this!!

以下一段编码

  ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
  DDSCAPS_FLIP |
  DDSCAPS_COMPLEX;

表示所建DirectDrawSurface是Primary Surface(显示缓冲块),Flipable(前后翻转),有Back Buffer
(幕后显示缓冲块)连接到Primary Surface(attached to).

  ddsd.dwBackBufferCount = 1;

表示Back Buffer(幕后显示缓冲块)只有一块.

  hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSPrimary, NULL);
  if (hRet != DD_OK)
  return InitFail(hWnd, hRet, "CreateSurface FAILED");

  // Get a pointer to the back buffer
  ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
  hRet = g_pDDSPrimary->GetAttachedSurface(&ddscaps, &g_pDDSBack);
  if (hRet != DD_OK)
  return InitFail(hWnd, hRet, "GetAttachedSurface FAILED");

这一段编码建立Primary Surface,再建立Back Buffer.至此我们的初始工程基本结束!

3.出错处理.
现在介绍初始化过程中错误的处理.
  return InitFail(hWnd, hRet, "...... FAILED");
这一语段的运用是,当某一步初始化过程出错,整个程序退出,并显示一个对话框.其定义如下:

file://-----------------------------------------------------------------------------
// Name: InitFail()
// Desc: This function is called if an initialization function fails
file://-----------------------------------------------------------------------------
HRESULT InitFail(HWND hWnd, HRESULT hRet, LPCTSTR szError,...)
{
  char  szBuff[128];
  va_list  vl;

  va_start(vl, szError);
  vsprintf(szBuff, szError, vl);
  ReleaseAllObjects();
  MessageBox(hWnd, szBuff, TITLE, MB_OK);
  DestroyWindow(hWnd);
  va_end(vl);
  return hRet;
}

你要增写一个RelaeseAllObject()函数,此函数将释放所有的DDRAW对象.有一点值得申明.如果对
象早已被释放,程序不知,试图释放不存在的对象将有严重后果,小心!!!!

file://-----------------------------------------------------------------------------
// Name: ReleaseAllObjects()
// Desc: Finished with all objects we use; release them
file://-----------------------------------------------------------------------------
static void ReleaseAllObjects(void)
{
  if (g_pDD != NULL)
  {
  if (g_pDDSPrimary != NULL)
  {
  g_pDDSPrimary->Release();
  g_pDDSPrimary = NULL;
  }
  if (g_pDDSOne != NULL)
  {
  g_pDDSOne->Release();
  g_pDDSOne = NULL;
  }
  if (g_pDDPal != NULL)
  {
  g_pDDPal->Release();
  g_pDDPal = NULL;
  }
  g_pDD->Release();
  g_pDD = NULL;
  }
}

这里,程序先释放IDirectDraw4下属的对象,再释放IDirectDraw4的对象.释放前,程序先确认各对
象是否存在,如对象还驻留于内村中,释放对象,并赋值对象指针NULL.

4.如何恢复暂时丢失的对象值.
在你按ALT+TAB键后,应用程序相互切换,当你从其他应用程序转换到DirectDraw有关应用程序时,原
有的对象缓冲区将在切换过程中被I/O系统释放.称为丢失(LOST).要重新建立.只有IDirectDraw4对
象属下的IDirectDrawSuface4对象有丢失的可能,所以IDirectDrawSurface4提供了Restore()程式.使用方式
如下:

file://-----------------------------------------------------------------------------
// Name: RestoreAll()
// Desc: Restore all lost objects
file://-----------------------------------------------------------------------------
HRESULT
RestoreAll(void)
{
  HRESULT  hRet;

  hRet = g_pDDSPrimary->Restore();
  if (hRet == DD_OK)
  {
  hRet = g_pDDSOne->Restore();
  if (hRet == DD_OK)
  {
      // 重新将Bitmap读入内存.DDReloadbitmap()
  }
  }

  return hRet;
}

一般,DirectDrawSuface4对象的丢失将冲刷对象所含的Bitmap.故要使用DDReLoadBitmap()函数重新从
Bitmap文件中读入内存.此函数收藏於DDUTIL.CPP文件中.并不属于DirectX的一部分.下面,就让我
介绍如何使用DDUTIL.CPP中的函数.

5.使用DirectDraw Utilities!!
为了方便开发者,初学者对DirectX的困惑,MS DirectX设计组专门写了一个DDUTIL.CPP文件来帮助大
家.它提供了方便的函数来进行读取Bitmap并赋值于IDirectDrawSurface4对象,从Bitmap中读取调色板
信息,设置透明色等方程.定义如下:

/*==========================================================================
 *  File:  ddutil.cpp
 *  Content:  Routines for loading bitmap and palettes from resources
 ***************************************************************************/

#ifdef __cplusplus
extern "C" {  /* Assume C declarations for C++ */
#endif /* __cplusplus */

extern IDirectDrawPalette  *DDLoadPalette(IDirectDraw4 *pdd, LPCSTR szBitmap);
extern IDirectDrawSurface4 *DDLoadBitmap(IDirectDraw4 *pdd, LPCSTR szBitmap, int dx, int dy);
extern HRESULT  DDReLoadBitmap(IDirectDrawSurface4 *pdds, LPCSTR szBitmap);
extern HRESULT  DDCopyBitmap(IDirectDrawSurface4 *pdds, HBITMAP hbm, int x, int y, int dx, int dy);
extern Dword  DDColorMatch(IDirectDrawSurface4 *pdds, COLORREF rgb);
extern HRESULT  DDSetColorKey(IDirectDrawSurface4 *pdds, COLORREF rgb);

#ifdef __cplusplus
}
#endif /* __cplusplus */


-> DDLoadPalette(IDirectDraw4 *pdd, LPCSTR szBitmap):
从Bitmap文件中读出调色板信息,并将此信息交送于IDirectDraw4的对象.
1)参数IDirectDraw4 *是IDirectDraw4的对象指针.
2)参数LPCSTR,是Bitmap文件全名.
3)使用实例:
  g_pDDPal = DDLoadPalette(g_pDD, "C:hanmybitmap1.bmp");
  if (g_pDDPal)
  g_pDDSPrimary->SetPalette(g_pDDPal);
4)详情请参阅DDEX3-5.CPP

->DDLoadBitmap(IDirectDraw4 *pdd, LPCSTR szBitmap, int dx, int dy):
创建一块含有指定Bitmap的IDirectDrawSurface4对象,先创建一块足以容纳指定Bitmap的IDirectDrawSurface4
对象.再将Bitmap读入内存.
1)参数IDirectDraw4 *是对象指针.
2)参数LPCSTR,是Bitmap文件全名.
3)dx, dy表示Bitmap大小.
4)使用实例:
  g_pDDSOne = DDLoadBitmap(g_pDD, "C:hanmybitmap.bmp", 640, 490);
  if(g_pDDSOne == NULL)
  {
  // Abort the program.
  }
5)没有实例,多试试.

->DDReLoadBitmap(IDirectDrawSurface4 *pdds, LPCSTR szBitmap):
把一块Bitmap读入一个指定的IDirectDrawSurface4对象指针.
1)参数IDirectDrawSurface4 *是对象指针,将接收Bitmap.
2)参数LPCSTR,是Bitmap文件全名.
3)使用实例:
  hRet = DDReLoadBitmap(g_pDDSOne, "C:hanmybitmap.bmp");
  if(FAILED(hret))
  {
  // Abort the program.
  }
4)详情请参阅DDEX3-5.CPP
5)我用此函数最多.

->DDCopyBitmap(IDirectDrawSurface4 *pdds, HBITMAP hbm, int x, int y, int dx, int dy):
You don't need to know.

->DDColorMatch(IDirectDrawSurface4 *pdds, COLORREF rgb):
You don't need to know.

->DDSetColorKey(IDirectDrawSurface4 *pdds, COLORREF rgb):
在指定的参数IDirectDrawSurface4的对象指针上设置一transparent Colorkey.
1)参数IDirectDrawSurface4 *是对象指针,将接收ColorKey.
2)COLORREF, Colorkey的数值.
3)使用实例:
  hRet = DDReLoadBitmap(g_pDDSOne, "C:hanmybitmap.bmp");
  if(FAILED(hret))
  {
  // Abort the program.
  }
4)详情请参阅DDEX3-5.CPP
5)我用此函数也很多.

For more information about those functions, you better observe the examples microsoft provided (DDEX1 - DDEX5) for
details.It is the easy way. All the implementations about those functions is in DDUTIL.CPP file.

6.BLIT, FLIP, &Color fill.
这三个应用是DirectDraw的主要应用.其功能为在BackBuffer上画上Bitmap图块,或填上一定的颜色,
再翻到屏幕上.所用函数为:
1>.Blt和BltFast在BackBuffer上画上Bitmap图块.

file://BltFast Example;
RECT rcRect;

rcRect.left = 0;
rcRect.top = 0;
rcRect.right = 640;
rcRect.bottom = 480;

 while(1) {
  ddrval = g_pDDSBack->BltFast(0, 0, g_pDDSOne, &rcRect, DDBLTFAST_WAIT);
  if(ddrval == DD_OK) 
  {
  break;
  }
  else if(ddrval == DDERR_SURFACELOST)
  {
  // use the restore all function!
  RestoreAll();
  }
}

我常用Blt function:

file://Blt Example;
RECT srcRect = {0, 0, 640, 480};
RECT dstRect = {0, 0, 640, 480};

DDBLTFX tempFX; // you will fail if you don't have this!
tempFX.dwsize = sizeof(DDBLTFX); // you will fail if you don't have this!

 while(1) {
  ddrval = g_pDDSBack->Blt(dstRect, g_pDDSOne, srcRect, DDBLT_WAIT, &tempFX);
  if(ddrval == DD_OK) 
  {
  break;
  }
  else if(ddrval == DDERR_SURFACELOST)
  {
  // use the restore all function!
  RestoreAll();
  }
  else if(ddrval != DDERR_WASSTILLDRAWING)
  {
  break;
  }
}

若想使用透明色(COLORKEY),改DDBLTFAST_WAIT(BltFast的最后一个参数)为
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY. 改DDBLT_WAIT(Blt的倒数第二个参数)为
DDBLT_WAIT | DDBLT_COLORSRC.

2.>用Blt在BackBuffer上填充颜色,(我从未成功过).

RECT dstRect = {0, 0, 640, 480};
DDBLTFX tempFX; // you will fail if you don't have this!
tempFX.dwsize = sizeof(DDBLTFX); // you will fail if you don't have this!
tempFX.dwFillColor = RGB(0, 255, 0); // green.

 while(1) {
  ddrval = g_pDDSBack->Blt(dstRect, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &tempFX);
  if(ddrval == DD_OK) 
  {
  break;
  }
  else if(ddrval == DDERR_SURFACELOST)
  {
  // use the restore all function!
  RestoreAll();
  }
  else if(ddrval != DDERR_WASSTILLDRAWING)
  {
  break;
  }
}

这个例码将在dstRect(0, 0, 640, 480)的长方形中填充绿色.长方形的大小和位置以你定义
的RECT对象确定.用Blt和BltFast的几个弱点是:
1)当dstRect(目标长方块)不和srcRect(源长方块)大小一致,Blt和BltFast将十分慢.
2)当dstRect部分超出屏幕,如屏幕大小640X480,你想在长方块{500, 500, 800, 600}中显示
图块,此图块不将处显,因为你定义的图块在屏幕以外!解决方法将在续篇(Advanced Section)中提出.

3.>使用Flip:
将准备好的BackBuffer翻到屏幕上,原来的Primar Surface变成BackBuffer.
 while(1) {
  ddrval = g_pDDSPrimary->Flip(NULL, DDFLIP_WAIT);
  if(ddrval == DD_OK) 
  {
  break;
  }
  else if(ddrval == DDERR_SURFACELOST)
  {
  // use the restore all function!
  RestoreAll();
  }
  else if(ddrval != DDERR_WASSTILLDRAWING)
  {
  break;
  }
}

4.总结:
1) 建立暂时的IDirectDraw对象.
2) 用COM中的QueryInterface来建立IDirectDraw4的对象.
3) SetCooperativeLevel (视窗或全屏).
4) SetDisplayMode(屏幕大小,色度,刷新速度).
5) 建立primary surface(屏幕显示内存),back buffer(幕后显示内存),和off-screen sufaces(备用显示内存,用于
存储图块).
6) 使用ddutil文件中的函数来读入Bitmap,设置ColorKey(当你进行Blt操作,这种颜色将不被显示).
7)  用Blt和BltFast将图块打入back buffer,用Flip来将准备好的back buffer翻成primary surface.原有的
primary surface翻成back buffer,等待下一轮Blt和BltFast的调用.

这些是DirectDraw版本6中的基本操作!我将写一个续篇(Advanced Section).Enjoy programming!
请大胆提出问题,写信给我或留言于留言板!感谢Doug Klopfenstein!他的Basic DirectDraw Programming
(谭翁编译了这一文章!)给我很大帮助.


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-988059/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-988059/

Least-squares-fitting-of-two-3-D-point-sets Least-squares-fitting-of-two-3-D-point-sets-IEEE-T-Pattern-Anal 立即下载

相关推荐

Optimal iso planar cutting direction based on machine kinematic metric

Optimal iso-planar cutting direction based on machine kinematic metric: A differential geometry method for freeform surface finishing tool path computation

DirectDraw6初级编程应用 —— 配合实例讲解,让你迅速入门

DirectDraw6初级编程应用by Gamster H. S目录:1. VC的环境设置.2. 浅谈COM.3. DirectDraw简述.4. DirectDraw初级编程应用.第一篇:VC的环境设置.在进行任何DirectX有关的编程之前,你得先设置VC的环境变量值.主要是方便以后的项目设计.我使用的是VC5和DirectX6,这是我的设置:1. 选择Options.2. 选

silver的专栏 2118

DirectDraw7编程基础

首先定义一个指向DirectDraw对象的指针,创建DirectDraw对象,查询以获取最新的DirectDraw接口,设置协作等级,设置显示模式。

VA6访问局域网获得许可的问题

VA6会在启动时访问局域网获得许可信息。在WIN XP上,可以在启动VC6前,临时禁止MSDEV.EXE访问网络;启动后,再允许其访问网络。做成一个batch如下:netsh firewall set allow "C:\Pro...

212

游戏开发基础(4)

游戏开发基础(4)第四章 diectxdarw基础篇 第一节 DirectDraw简介Grubers的一个观点是DirectDraw“只是一个bltting发动机”。这是相当准确的,但却太简化了。更准确地讲,DirectDraw是一个可以提供软件仿真测试的独立于硬件设备的bltting发动机。Dir

zhucde(虚拟闲人)的专栏 2024

DirectX加速不可用、已禁用的解决方法

        网上有很多人的DirectX加速不可用或者被禁用,最直接的表现就是大型游戏玩不了,工业软件不能用,Aero特效打不开。那么这到底是怎么回事,以及如何解决呢?下面就由我来为大家进行分析。         首先有的朋友要问了,什么是DirectX?什么是DirectX加速呢?这个说起来内容有点多,这里只是简单介绍几句,有兴趣的朋友可以自行百度。DirectX是微软开发的一套图形处理系...

VBcom的专栏 37万+

Direct Draw 01-基本概念

一、位深度 计算机中,一个字节(Byte)是由8个位(Bit)组成的。位深度指的是用来描述某状态值所使用的计算机位的个数。在DirectDraw中,通常用位深度来代表位图中的颜色值所使用的位个数,从另一个意义上讲,位深度表示了位图中颜色的丰富程度。 1字节等于8位二进制数,所以一字节所能表达的十进制整数的范围是从0到255,即一字节能且最多只能反映出256(2的8次方)种不同的状态。在位图中,如果用其中每一种状态代表图象中某一个点的颜色,那么最多可以得到256种不同的颜色,这就是我们常见的8位(256色)的

FairLikeSnow的博客 795

【2026 最新图文教程】红色警戒2共和国之辉Win10/Win11免费下载安装教程(附ddraw补丁+联机对战方案)

红色警戒2共和国之辉是国内玩家基于原版Red Alert 2 Yuri’s Revenge开发的自制MOD,以中国阵营替换了原版古巴。由于游戏引擎年代久远(基于DirectDraw渲染),在现代Windows 10/11系统上运行时会出现黑屏、闪退、有声音无画面等兼容性问题。本文档提供完整的下载安装教程及cnc-ddraw兼容补丁配置方案。红色警戒2共和国之辉在Win10/Win11上无法运行的原因本质是DirectDraw渲染兼容性问题。

2401_89926894的博客 4712

5分钟搞定:DDrawCompat终极指南,让Windows 10/11经典游戏重获新生

还在为《红色警戒2》《星际争霸》《暗黑破坏神2》等经典游戏在现代Windows系统上无法运行而烦恼吗?DDrawCompat正是你需要的DirectDraw兼容性修复方案!这款开源工具专门解决基于DirectX 1-7的老游戏兼容性问题,让经典游戏在Windows 10/11上完美运行。无论是画面显示异常、游戏崩溃还是性能问题,DDrawCompat都能提供专业级的兼容性修复方案。 ## 🎮

gitblog_00506的博客 70

云电脑如何助力游戏厂商优化办公?

游戏开发流程复杂,横跨视觉美术与技术研发。绘画、建模、PBR渲染、引擎开发、PCG内容...全都需要在图形工作站上运行。当疫情发生时,工作站又搬不回家,难以实现远程办公。 游戏行业远程办公三大痛点 家里电脑跑不动大型软件 VPN/传统桌面协议无法达到高清画质 IT管理难,担心数字资产泄露 针对游戏远程开发痛点,青椒云带来高性能云电脑,提供游戏企业远程解决方案,完美解决上述痛点。 强劲性能保障生产力 美术场景需要专业的GPU硬件,成本高,限制代价大,青椒云针对此类情况..

m0_68651505的博客 424

DirectDraw和Direct3D的区别

DirectDraw和Direct3D都是Microsoft DirectX API的重要组成部分,但它们在功能和用途上存在显著的差异。

lijian2017的博客 1305

DirectX简介 第二篇 DirectDraw简介

DirectDraw简介 1.       DirectDraw是DirectX的基石,DirectX的其他组件,如Direct3D,都是建立在它的基础上的,用DirectDraw可以访问显卡上的内存,另外,DirectDraw还可以作为位图混合器,用它可以生成、移动和换图像数据或对数据进行合成用于显示 2.       显示技术:图形协处理器、显卡内存。DirectDraw允许我们

EmberSpirit的专栏 5125

DirectDraw 基础篇

DirectDraw基础篇(学东西还是基础的好哦!)第一节 DirectDraw简介Grubers的一个观点是DirectDraw“只是一个bltting发动机”。这是相当准确的,但却太简化了。更准确地讲,DirectDraw是一个可以提供软件仿真测试的独立于硬件设备的bltting发动机。DirectDraw的主要用途是尽可能快、尽可能可靠并且尽可能连续地将图形考贝到视频显示

虫虫的专栏 1297

DDraw笔记-使用blitter进行内存填充

使用blitter进行内存填充 前面的内存填充都是利用memset()或memcpy()进行的。主要是用cpu进行的,有点慢。特别是当表面非线性时,就得一行一行的填充,就更慢了。 利用blitter我们可以直接填充或移动大块VRAM和DDraw表面,速度比较快。有两个函数如下: IDIRECTDRAWSURFACE7::Blt()IDIRECTDRAWSURFACE7::BltF...

weixin_30689307的博客 444

游戏开发新手入门之DirectX入门

游戏开发新手入门之DirectX入门[文章导读]      今天我们要接触到令人敬畏的DirectX。它比Windows GDI要快好几倍,可用于不同的语言和多种平台[正文]  ☆ 简介  今天我们要接触到令人敬畏的DirectX。它比Windows GDI要快好几倍,可用于不同的语言和多种平台,支持从绘制象素到高级3D图象,从播放简单声音到数字音乐,从键盘控制到反震手柄……它给你游戏编程所需的一

1960

DirectDraw简介

这部分主要包括 DirectDraw 组成, 操作系统及系统硬件之间联系. 有以下一些主题: 结构纵观 DirectDraw对象类型 硬件操作层(HAL) 软件摸拟 系统组成 结构纵观   多媒体软件需要高度优化的图形. 通过DirectDraw, Microsoft 使在Windows上的应用程序获得一个高级有效率高速的图形操作变为可能, 硬件系统可以的话, DirectDraw

R_hgt的专栏 1750

DirectDraw 游戏编程基础(2)

 例程1(DDEX1):DirectDraw 的基本知识 在使用 DirextDraw时,需要首先创建一个对象DirectDraw 的实体,该对象实体代表了微机显示适配器。然后,使用接口所提供的方法来操作该对象实体,使之完成有关命令和任务。接着,你还需要创建一个或多个 DirectDraw-surface对象的实体,以便能在图形表面(Surface)上展示你的游戏画面。 下面,在例程 DDEX1

龙行天下 968

DirectDraw不可用的解决方案

今天做调试一款3d写显存的程序,发现程序莫名其妙的死掉了。。每次都死,仔细跟踪才发现,说什么设备不支持。 这台电脑是公司的电脑,话说具体我之前没了解过,但我想总不会配置比98年的机器还老吧。 于是我windows+R,打开运行,输入dxdiag。点击显示选项卡,问题来了。 DirectDraw、Direct3D、AGP纹理加速均为不可用状态。 这博主哪里能忍,于是我重...

weixin_33794672的博客 5951
上一篇: 屏幕抓字教程 (转)
下一篇: Use Case的作用 (转)
csd3176
博客等级 码龄11年 20粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值