选择显示字体大小

基于nokia s60的游戏开发之三

  symbian os可以被理解为一个面向位图的操作系统。symbian os中所有的应用程序都可以使用位图,尤其是游戏程序。虽然使用基本绘图方法(例如drawline和drawellipse)能够画出更加小型的图形,但是位图能够更有效地画屏,而且输出的图形更加细腻。

  symbian os有自己的位图文件格式mbm,这是一种多位图文件。 窗口位图使用一个位图转化工具bmconv来创建mbm。 由于一个mbm文件可能包含多个位图,所以bmconv还产生一个位图头文件mbg,这个头文件提供了一个访问位图的id。当从mbm文件加载一张位图的时候,应该包括相应的头文件,同时应当使用恰当的标识符作为加载位图的方法的参数。 位图可以在项目文件中定义:

start bitmap [target-file]
header
targetpath [targetpath]
sourcepath [sourcepath]
source [colour-depth] [source-bitmap]
end 

  bmconv可以创建两种不同类型的symbian os位图:只读存储位图和非只读存储位图。非只读存储位图,亦称文件存储位图,使用编码rle压缩,它们在使用之前需要被装载到ram中。为了提高描画速度,一般不压缩只读存储位图,并且可以直接从rom中使用它们。默认情况下是bmconv建立文件存储位图(即非只读存储位图)。

  symbian os提供对蒙版(mask)的支持。蒙版是黑白位图,白色描画透明区--只有蒙版中的黑色区域上的像素是从原始位图上根据想要的图形描画来的。因为蒙版只需要两种颜色,所以它们应该被转化为1bit的位图以节省存储空间。图1说明了使用蒙版的示例。

图1 使用蒙版来描画透明位图的示例

  series 60提供了一个名为makemask的命令行工具,用来从8 bit位图中创建1 bit的蒙版。 makemask使用原位图中的最后一个调色板索引作为透明色。

  虽然symbian os提供了设置位图调色板的应用程序编程接口,但是这些接口并没有实现。一旦补充这些应用程序编程接口,系统就支持彩色显示。当添加支持的时候,symbian os判定只支.netscape调色板色彩立方校正。 series 60提供它自己的8 bit位图调色板。bmvconv被修改来把8 bit位图转换为使用series 60调色板(提供216种颜色和10种灰色调)。 这能防止第三方开发者使用它们自己的调色板,因为使用它们自己的调色板经常会对位图输出造成影响。 尤其是需要一种颜色的多种色调的位图,例如创建一个颜色渐变位图,至少应该转化为12位的位图。 series 60调色板定义在thirdpartybitmap.pal调色板文件中。

  位图的管理由cfbsbitmap类来完成,这个类提供了用于创建和装载位图的方法,并且定义它们的色深度和尺寸。它使用rfbssession类来访问fbs,因此用户是接触不到会话类的。 cfbsbitmap还提供了直接访问位图图像数据的方法。 可以使用dataaddress方法获得一个指向数据地址的指针,并且可以使用getscanline方法访问一条指定的扫描线。

  根据位图的尺寸把位图分解到fbs中的两个不同的堆里。小于4kb的位图被保存到一个堆里,大于4kb的位图保存到另一个堆里。进行这种分解是为了防止存储碎片,存储碎片是大的位图被创建和销毁的时候经常出现的--大位图的堆能自动整理碎片。由于碎片整理的原因,当操作大位图的内容时,堆需要被锁定。为了防止碎片整理和操作同步进行,tbitmaputil类提供了锁定堆和解锁堆的操作。只有在一个位图的图像数据被直接编辑的时候才需要锁定堆--描画和复制方法提供了自动锁定功能。 下面的示例在位图是大的位图并且使用颜色填充位图的情况下锁定fbs。它假定位图的每个象素都使用16位。这适用于12位和16位位图。

// lock the heap if a large bitmap
if ( bitmap->islargebitmap() )
{
 tbitmaputil bitmaputil( bitmap );
 bitmaputil.begin( tpoint(0,0) );
}
// edit bitmap
tsize bitmapsize = bitmap->sizeinpixels();
tuint16* bitmapdata = (tuint16*)bitmap->dataaddress();
tuint16 colour = 0;
for ( tint y = 0; y < bitmapsize.iheight; y++ );
{
 for ( tint x = 0; x < bitmapsize.iwidth; x++ )
 {
  *bitmapdata++ = colour++;
 }
}
// release the heap
if ( bitmap->islargebitmap() )
{
 bitmaputil.end();

  为了使描画位图比使用cfbsbitmaps还快,窗口服务器提供它自己的位图类cwsbitmap。它通过取得位图处理的所有权来除去窗口服务器和fbs之间多余的上下文转换。cwsbitmap从cfbsbitmap继承而来,并且实现了其所有相同的方法。如果你在开发应用程序的时候很重视描画速度,那么你应该使用cwsbitmap来替代它的基类。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons