类,同时也负责产生AppUi。
CreateAppUiL:创建控制界面,把当前Control控制器给构造出来,如果有文件关联,会与传统的程序走向不同,会去调用该类父类的OpenFile方法加载文件;资源文件中的NewFile的参数,表示该文件与程序关系,参考SDK,查阅:Newfile,Group Name:在手机上产生一个图标,Hidden:可以将图标隐藏,CHARACTER_SET UTF8:设置支持中文。
UI:主要是负责控制(单视图):UI主要负责管理command菜单控制和View之间的切换的控制;
View:是个容器,也是个环境。
Draw:由系统框架自动调用。
iCoeEnv:AppRun提供的环境对象;
CEikonEnv类:系统提供的框架方法[4]。
下图则是基于Avkon的Symbian程序的继承类图:
图4-1 Avkon架构
Fig. 4-1 Avkon structure
4.2 程序框架
本程序选择采用Avkon视图切换架构。
首先由于俄罗斯方块只是一个简单的游戏,没有什么UI控件需要保持私有性,所以采用该架构不会有这方面的弊端。
而且,程序需要进行视图的切换:程序内部需要有游戏界面和显示积分榜界面的切换;由于在执行游戏的过程中,可能需要切换到短信或是电话等功能程序,所以需要用这种架构更好的实现了应用程序间的无缝导航。
使用Avkon视图切换架构。大多数情况下,这种架构是最佳的架构,但它也具有局限性,如:视图切换方案没有任何内置的方法来保存视图切换的上下文。也就是说,没有提供用于定位到前面激活视图的机制,没有类似于浏览器上后退功能的按钮的功能。但是DoActivateL()确实收到了前面激活视图的标志符,因此可以自定义后退按钮功能。
使用基于控件的传统Symbian OS架构:程序可能只需要一个视图应用程序具有UI控件,必须保证这些UI控件的私有性。
使用基于对话框的架构。可以在资源文件中定义控件,让对话框自动处理布局和绘画,这比实现自定义绘画行为更为容易。仅当应用程序的视图之间没有任何循环导航路径时,才可以对这种应用程序使用"基于对话框"的方法[5]。
4.3 游戏实体
4.3.1 TGrid 类
这个类的作用是初始化游戏界面的属性,函数定义如下:
表4-1 TBlock类
Tablet.4-1 TBlock Class
方法名 返回值类型 声明 功能 Clear void public 初始化游戏界面 DoesCollide bool public 判断方块是否向P点移动后越界(离开游戏界面),若越界返回true,否则返回false PutBlock bool public 将某一块放在一个位置,改变该位置的各个块的状态
需要详细介绍的是界面的设计思路:
const int KGridY = 19;
TFixedArray < TUint16, KGridY > iMask;
for (int i = 0; i < KGridY; i++)
{
iMask[i] = 0x0003; //记录某个位置是否有方块
}
上面是初始化游戏界面的程序段。iMask是结合类的数组变量,用它来表示游戏界面的属性。和方块的设计一样,iMask[i]代表第i+1行(从屏幕的上方开始数),将每一行的4位16进制数转化位16位的2进制数,然后取其中的高14位代表每一行的14个位置是否有方块。这样游戏初始化的界面就是19*14的了,而且初始时设置为每个位置都是没有方块的。
4.3.2 TBlock 类
这个类的功能就是初始化方块的基本属性:形状和颜色。类包含的方法和具体说明如下:
表4-2 TBlock类
Tablet.4-2 TBlock Class
方法名 返回值类型 声明 功能 SetNormalbl void public 初始化不同种类的方块 Changecolorflag void public 针对不同级别,传入不同的信息 BlockCount Int public 获得方块的种类数 Block TBlock protect 获得方块的形状属性 RandomBlock TBlock Public 随机生成一种形状的方块 Rotate void public 旋转方块的操作 RowMask TInt8 public 获得下落方块的某一行的信息 Color TInt8 public 根据方块生成颜色
需要详细介绍的:
方块的设计原则:
将四个同样大小的正方形方格(平面图形)以边连接的方式(就是每个正方形与其他的有公共边)连在一起,一共可以组成7种不同的类型(通过平面旋转的方式一样的视为同一种类型)。
而每种类型通过旋转90°共有4种状态(有些方块可能有几种状态是相同的形状)。
方块类型、状态的设计
const int numBlocks = 7; //方块的类型数
TUint16 bl_types[4][numBlocks]
void TBlock::SetNormalbl()
{
bl_types[0][0] = 0x2222;
bl_types[0][1] = 0x0e20;
bl_types[0][2] = 0x0740;
bl_types[0][3] = 0x06c0;
bl_types[0][4] = 0x0c60;
bl_types[0][5] = 0x0660;
bl_types[0][6] = 0x0e40;
//省略其他类似定义
}
如上面的两段变量定义和一个函数声明初始化了方块的形状属性,具体的实现方法是把一个4位的16进制数看成一个4*4的方阵,而每一位的16进制数代表方阵的一行,某一位的数值为1则代表该位置被填充,将所有被填充的方格连在一起便是我们需要的一个个俄罗斯方块单元。
例如bl_types[3][6] = 0x2620表示第7(6+1)种类型的方块的第4(3+1)种状态,将这种数字由低位到高位转化位2进制数为(矩阵形式):
0 0 0 0
0 0 1 0
0 1 1 0
0 0 1 0
看上面所有的1组成的形状就是产生的俄罗斯方块的形状。
下面使所有方块的所有类型的所有状态的各种形状的方块的设计。
颜色的设计:为了方便玩家,对于初级和中级,一种类型的方块采用一种特殊的颜色,而对于高级,为了规则需要,将一种形状的方块设计成一种颜色,而将其他形状的方块设计成另外一种颜色。
而方块形状的具体设计,请参看下图:
图4-2 俄罗斯方块形状具体定义
Fig.4-2 Detailed definition of Tertris blocks shapes
4.4 界面组件
具体的程序框架结构采用Model-View-Controller模式,具体来说:Model部分定义方块的属性、并且引入声音资源;View部分显示游戏界面和积分榜界面;Controller部分控制整个程序的运行。三个部分相互独立并且相互调用来实现整个程序的功能。
Symbian OS的GUI设计现在比较流行的有三种:
原生的Symbian OS控件。这种方式只需要一个View,然后使用Symbian OS的控件搭建界面。
对话框模式。
视图模式[6]。
视图模式即View模式。即使用AppUi核心为控制器控制切换视图显示不同的界面。该部分有四个类:CRectangleMainView、CRectangleMainContainer、CRectangleScoreView和CRectangleScoreContainer。下面分别介绍它们的作用和实现。
4.4.1 CrectangleMainView 类
这个类的作用是响应游戏界面下菜单的响应并且处理相应操作,并且通过调用其他类激活游戏界面。类包含的方法和具体说明如下:
表4-3 CrectangleMainView类
Tablet.4-3 CrectangleMainView Class
方法名 返回值类型 声明 功能 NewLC CRectangleMainView * public 第二阶段构造 NewC CRectangleMainView * public 第二阶段构造 ConstructL void private 构造函数可能Leave Id Tuid public 获得菜单资源ID MainViewReDraw void public 重画游戏界面 HandleCommandL void public 处理菜单响应 DynInitMenuPaneL void private 处理菜单的修改,在游戏进行时菜单只可以选择暂停,而在游戏暂停时,只可以选择重新开始 HandleViewRectChange void public 重画游戏界面 DoActivateL void private 激活游戏界面 DoDeactivate void private 关闭游戏界面,并释放资源 CRectangleMainView CRectangleMainContainer public 获得游戏界面资源指针
需要详细介绍的是函数HandleCommandL:
void CRectangleMainView::Handl
上一篇:
基于Qt与Android的KTV管理系统设计与实现(word文档)
下一篇:
面向android系统的测试工具_毕业论文