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(const Font &font) |
设置字体 |
SetForegroundColor(const Color &color) |
设置颜色 |
SetLineWidth(int width) |
设置线条粗细 |
DrawBitmap(const Point &point, const Bitmap &bitmap) |
绘制位图 |
DrawEllipse(const Rectangle &rect) |
绘制椭圆 |
DrawLine(const Point &point1, const Point &point2) |
绘制直线 |
DrawRectangle (const Rectangle &rect) |
绘制矩形 |
DrawText(const Point &point, const EnrichedText &enrichedText) |
绘制文本 |
DrawTriangle(const Point &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()方法中添加绘制图形的代码
result MainForm::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;
}
绘制的效果图: