首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

关于DirectX的显示模式由16位晋级至32位

2013-02-24 
关于DirectX的显示模式由16位升级至32位之前也发过一个帖子:http://topic.csdn.net/u/20111019/10/1fbfaac

关于DirectX的显示模式由16位升级至32位
之前也发过一个帖子:
http://topic.csdn.net/u/20111019/10/1fbfaacb-5b25-4836-ada7-646e22f07fb2.html
现在我说下详细的情况
现在手头有个游戏的资源编辑器的源码,由于时间比较早(01年的),所以是16位显示的。
1、不设置显示模式也就是说默认系统的32位显示效果如下:
关于DirectX的显示模式由16位晋级至32位
由于32位显示感觉是被压扁了,所以右侧的字也显示出来了
设置显示模式16位显示如下所示:
关于DirectX的显示模式由16位晋级至32位
创建Surface如下:


  // Create the primary surface
  ZeroMemory(&ddsd, sizeof(ddsd));
  ddsd.dwSize        =sizeof(ddsd);
  ddsd.dwFlags       =DDSD_CAPS;
  ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
  ddrval=lpDD4->CreateSurface(&ddsd,&lpDDSPrimary,NULL);
  //Back Surface
   ZeroMemory(&ddsd,sizeof(ddsd));
  ddsd.dwSize        =sizeof(ddsd);
  ddsd.dwFlags       =DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
  ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY|DDSCAPS_3DDEVICE;
  ddsd.dwWidth       =SCREENWIDTH;
  ddsd.dwHeight      =SCREENHEIGHT;
  ddrval=lpDD4->CreateSurface(&ddsd,&lpDDSBack,NULL);
  //Buffer Surface
  ZeroMemory(&ddsd, sizeof(ddsd));
  ddsd.dwSize        =sizeof(ddsd);
  ddsd.dwFlags       =DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;//|DDSD_PIXELFORMAT;
  ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
  ddsd.dwWidth       =SCREENWIDTH;
  ddsd.dwHeight      =SCREENHEIGHT;
  ddrval=lpDD4->CreateSurface(&ddsd,&lpDDSBUF,NULL);
  //buffer surface
  ZeroMemory(&ddsd, sizeof(ddsd));
  ddsd.dwSize        =sizeof(ddsd);
  ddsd.dwFlags       =DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
  ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
  ddsd.dwWidth       =MAXMAPWIDTH;
  ddsd.dwHeight      =MAXMAPHEIGHT;
  ddrval=lpDD4->CreateSurface(&ddsd,&lpDDSMAP,NULL); 

希望有经验的大侠能给指点下看看是什么地方的问题造成了,本人刚接触DX不久,谢谢
[解决办法]
应该是绘图的问题。和创建的表面大小还是后备表面没关系。

诸多绘图函数都是基于Pitch进行表面指针移动的,而Pitch又是以字节为单位,
在32位中,Pitch要比16的Pitch大两倍,绘画时原来的坐标就相当于被缩小了。

修改所以牵扯Pitch的绘画函数看是否能解决问题。
[解决办法]
没错,就是这个函数在按16来处理的.

这样改太麻烦了,可能你整个源码有80%以上的代码需要改动,最简单的办法是在程序初始化时,把显示器的显示模式改成16位的(相当于手动在控制面板中更改,但用DX函数更改会在DX显示设备释放时自行恢复).

热点排行