首頁 > 技術文章 > Symbian > 基于Nokia S60的游戲開發之三

基于Nokia S60的游戲開發之三

52RD.com 2005年12月22日 CSDN            評論:0條 我來說兩句
  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來替代它的基類。
(52RD.com)
讀取...
相關報道
評 論
文章導航 Navigation
精彩評論 Commentmore...
贊助商鏈接 Support
特別推薦 Recommend
内蒙古11选5走势图一定牛网