Symbian多平台游戏引擎开发日记 2006-5-22

来源:互联网 发布:nginx 外网访问 编辑:程序博客网 时间:2024/05/17 03:37
         上周完成了部分TG_Display、TG_2DSurface、TG_Texture的方法,TG_Display用Create2DSurface来创建一个离屏缓存,UpdateScreen方法把TG_2DSurface的图象翻转到屏幕上。翻转方法直接使用NOKIA提供的方法,大致如下:
 switch( drawBuffer )
 {
 case 0://BitmapCopy
  {
   iGc.BitBlt( TPoint( 0,0 ), iPrimarySurface->GetFbsBitmap() );
   break;
  }
 case 1://DoubleBuffered
  {
   TInt numPixels = iScreenSize.iWidth * iScreenSize.iHeight;
   Mem::Copy( iSrnAdd, iPrimarySurface->iFbsBitmapBuffer->DataAddress(), numPixels * 2 );
   break;
  }
 }
这个方法提供了两种屏幕翻转的方法,其中BitmapCopy方法是通过屏幕服务翻转到屏幕上,DoubleBuffered是直接取得屏幕显存的地址,然后把图象数据直接复制到显存中,当然这种方式只能用在真机上,不能在模拟器上使用。在这两种方法中,理论上说第二种方法可能更快些,不过我没有测试过。
         TG_2DSurface提供Lock,Unlock方法防止在往上面绘图的时候内存移动位置。BitBlt方法把TG_Texture图象复制到TG_2DSurface指定的位置。TG_2DSurface的核心数据是CFbsBitmap,创建TG_2DSurface时,显示模式必须与屏幕相同,不能创建屏幕显示模式之外的CFbsBitmap对象,BitBlt在实现时需要注意显示模式的匹配。目前主要用到EColor4K(12位色屏幕)、EColor64K(16位色屏幕)、EColor16M(24位色屏幕),12位色屏幕为444模式,16位色为565模式,24位色屏幕为888模式。另外,每次向TG_2DSurface中绘制图片时,都要通过DataAddress方法重新获得CFbsBitmap的内存地址,否则在绘制时会出现指针位置错位的情况。TG_Texture目前还只能载入24位色BMP点阵位图,在载入时将每个象素转化为与屏幕显示模式相同的象素值,转换方法如下:
#define CONVERT16MTO4K(color)  (  ((color) & 0xF0)  >>  4 ) |  ((( (color) & 0xF000) >> 8) & 0xF0) | ((((color) & 0xF00000) >> 12) & 0xF00)
#define CONVERT16MTO64K(color)  (  ((color) & 0xF8)  >>  3 ) |  ((( (color) & 0xFC00) >> 5) & 0x7E0) | ((((color) & 0xF80000) >> 8) & 0xF800)
         接下来要继续完善TG_2DSurface绘制TG_Texture时的各种效果,比如关键色、alpha混合、带alpha通道的图片混合,同时还要区分16位色和32位色的区别,以及TG_Texture载入256色的索引位图,还将要添加TG_Palette来管理调色板。
原创粉丝点击