轉貼 基於Nokia S60的遊戲開發之三

2021-03-31 14:31:12 字數 2308 閱讀 9574

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判定只支援***scape調色盤色彩立方校正。 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() )

// edit bitmap

tsize bitmapsize = bitmap->sizeinpixels();

tuint16* bitmapdata = (tuint16*)bitmap->dataaddress();

tuint16 colour = 0;

for ( tint y = 0; y < bitmapsize.iheight; y++ ); }

// release the heap

if ( bitmap->islargebitmap() )

為了使描畫點陣圖比使用cfbsbitmaps還快,視窗伺服器提供它自己的位圖類cwsbitmap。它通過取得位圖處理的所有權來除去視窗伺服器和fbs之間多餘的上下文轉換。cwsbitmap從cfbsbitmap繼承而來,並且實現了其所有相同的方法。如果你在開發應用程式的時候很重視描畫速度,那麼你應該使用cwsbitmap來替代它的基類。

Nokia S60的幾個問題

nokia s60的幾個問題 1.不能每幀呼叫 system.gc 否則嚴重降低fps 2.nokia s60機器的不同機型對於translate 和 setclip的處理不一樣。在nokia n gage qd等機型中,setclip是相對於translate以後的座標計算的,而在nokia 66...

Nokia S60的幾個問題

1.不能每幀呼叫 system.gc 否則嚴重降低fps 2.nokia s60機器的不同機型對於translate 和 setclip的處理不一樣。在nokia n gage qd等機型中,setclip是相對於translate以後的座標計算的,而在nokia 6600,6670等機型中,set...

Nokia S60的幾個問題

nokia s60的幾個問題 1.不能每幀呼叫 system.gc 否則嚴重降低fps 2.nokia s60機器的不同機型對於translate 和 setclip的處理不一樣。在nokia n gage qd等機型中,setclip是相對於translate以後的座標計算的,而在nokia 66...