bada 2D遊戲程式設計之一——圖形繪制
在2D遊戲中,使用者見到的畫面通常是通過兩種方式實作的,一種是圖形繪制,就是在螢幕上繪制各種幾何圖元,如線條和矩形等;還有一種是圖像繪制,也就是常說的貼圖,遊戲中的很多畫面都是一張張的圖檔貼上去的。
其實在智能機時代,完全采用圖形繪制的遊戲已經很難吸引玩家的眼球了,圖形繪制在遊戲中更多的是扮演一個輔助的角色,下面給大家舉兩個常用的例子。
1,畫線類遊戲。這類遊戲中有的會通過繪制線條來控制精靈的運動軌迹。
2,繪制精靈對應的幾何體。在碰撞檢測中,都會根據遊戲精的形狀将其分解成對應的幾何體,如分解成矩形或者圓形等,而在遊戲的調試階段會對這些幾何體進行繪制并顯示出來,這樣可以便于觀察精靈的運作是否與實體世界規律相吻合。(這部分可能讀起來有點費勁,等大家看到後面的實體引擎部分就明白了)
接下來主要給大家介紹一下繪制相關的類和對應的API,這些類都包含在Osp::Graphics命名空間當中。同時為了友善了解,我給這些類都統稱為“繪制上下文”,并根據個人的了解按照“繪制的工具”、“繪制的樣式”和“繪制的内容”對它們進行了分類。下面對這些類進行簡單的說明。
1. 繪制的内容
“繪制的内容”是指那些實實在在被繪制出來的,并顯示在螢幕上的實體。如點、圖檔、矩形、文本等。
類 | 作用 |
Bitmap | 表示圖檔内容 |
Dimension | 表示一個不帶有坐标位置的矩形區域 |
EnrichedText | 表示文本内容 |
Point | 表示一個坐标點 |
Rectangle | 表示一個帶有坐标位置的矩形區域 |
2. 繪制的樣式
“繪制的樣式”就是對繪制的内容進行修飾和美化。如繪制的顔色和樣式等。
類 | 作用 |
Font | 表示字型,包括字型的樣式等屬性 |
Color | 表示ARGB (Alpha, Red, Green, Blue)顔色模式 |
3. 繪制的工具
我對“繪制的工具”的了解是指能夠通過這些類(工具類)進行繪制,它們都包含有各種繪制(Draw)函數,根據指定的繪制的内容和繪制的樣式直接調用這些Draw函數進行繪制就可以了,不需要關心是如何繪制出各種圖形圖像的。
3.1 Canvas類
Canvas的英文意思是畫布,在bada平台上它起到的作用也是和畫布非常類似的,因為它表示的是顯示裝置上的一塊矩形的區域,在這塊區域上可以進行各種繪制(圖形,圖像和文本),非常像繪畫時用到的畫布,而且它還提供了各種繪制函數。
函數 | 功能描述 |
SetFont(constFont &font) | 設定字型 |
SetForegroundColor(constColor &color) | 設定顔色 |
SetLineWidth(int width) | 設定線條粗細 |
DrawBitmap(constPoint &point, const Bitmap &bitmap) | 繪制位圖 |
DrawEllipse(constRectangle &rect) | 繪制橢圓 |
DrawLine(constPoint &point1, const Point &point2) | 繪制直線 |
DrawRectangle (const Rectangle &rect) | 繪制矩形 |
DrawText(constPoint &point, const EnrichedText &enrichedText) | 繪制文本 |
DrawTriangle(constPoint &point1, const Point &point2, const Point &point3) | 繪制三角形 |
詳細的說明大家可以去參考一下幫助文檔。
3.2 BufferInfo類
BufferInfo可以了解成它表示的是Canvas在bada系統中的記憶體,通過它的可以直接操作Canvas的記憶體。這樣我們就可以通過改變記憶體資料來改變Canvas要顯示的内容。很明顯這樣操作起來會非常的不友善,即使是畫一條直線的也得經過大量的運算,寫出大量的代碼。
這個類在2D遊戲開發中基本不會用到,是以就不進行深入的介紹的。
大家可以參考《通過Canvas進行直接像素通路》這篇文章:
http://developer.bada.com/article/Direct-pixel-accessing-with-graphic-Canvas
最後給大家展示一下如何進行圖形繪制。使用bada SDK提供的API進行圖形繪制的主要步驟如下:
(1) 建立一個基于Form的應用程式
(2) 重寫Form對象的OnDraw()方法
(3) 在OnDraw()方法中添加繪制圖形的代碼
resultMainForm::OnDraw(void)
{
result r = E_SUCCESS;
//擷取繪制的工具Canvas
Canvas* pCanvas =GetCanvasN();
if(pCanvas){
//設定繪制的樣式
Font font;
font.Construct(FONT_STYLE_PLAIN,32);
pCanvas->SetFont(font);
pCanvas->SetForegroundColor(Color::COLOR_BLACK);
//根據繪制的内容進行繪制
pCanvas->DrawText(Point(10,10),"This is the draw text test");
pCanvas->DrawEllipse(Rectangle(10, 100, 460, 100));
pCanvas->DrawLine(Point(10, 250),Point(470, 250));
pCanvas->DrawRectangle(Rectangle(10, 300, 460, 100));
pCanvas->DrawTriangle(Point(10,750),Point(240,450),Point(470,750));
delete pCanvas;
}
return r;
}
繪制的效果圖: