eCommandL(TInt aCommand)
{
CRectangleAppUi *vAppUi = (CRectangleAppUi*)CCoeEnv::Static()->AppUi();
CRectangleEngine *vEngine = vAppUi->GetEngine();
CRectangleDocument *vDoc = vAppUi->GetDocument();
switch (aCommand)
{
case EEikCmdExit:
case EAknSoftkeyExit: //退出游戏
vAppUi->Exit();
break;
case ERectangleNewGame: //开始新游戏
vDoc->Reset();
TBlock::SetNormalbl();
vEngine->Reset();
vAppUi->UpdateBoard();
if (iContainer->clx != 2)
iContainer->clx = 1;
if(vEngine->Dif!=2&&vEngine->Dif!=3)
vEngine->Dif=1;
break;
case ERectanglePause: //暂停或是开始游戏
//其他代码省略
}
4.4.2 CrectangleMainContainer 类
这个类的作用是显示游戏界面。类包含的方法和具体说明如下:
表4-4 CRectangleMainContainer类
Tablet.4-4 CrectangleMainContainer Class
方法名 返回值类型 声明 功能 ConstructL void public 初始化游戏界面的显示 FocusChanged void public 游戏暂停的处理 Draw void private 显示游戏的运行 OfferKeyEventL TKeyResponse private 游戏进行中,响应按键的操作 ComponentControl CCoeControl private 光标定位在显示分数或是级别的控件上 CountComponentControls TInt private 光标从显示分数或是级别的控件位置移走
4.4.3 CrectangleScoreView 类
这个类的作用是响应显示积分榜界面下菜单的响应并且处理相应操作,并且通过调用其他类激活积分榜显示界面。类包含的方法和具体说明如下:
表4-5 CRectangleScoreView类
Tablet.4-5 CrectangleScoreView Class
方法名 返回值类型 声明 功能 NewL CRectangleScoreView public 第二阶段构造 NewLC CRectangleScoreView public 第二阶段构造 ConstructL void private 构造函数可能Leave Id Tuid public 获得菜单资源ID HandleCommandL void public 处理菜单响应 HandleViewRectChange void public 重画显示积分榜的界面 DoActivateL void private 激活积分榜显示界面 DoDeactivate void private 关闭积分榜显示界面,并释放资源 Container CRectangleMainContainer * public 获得游戏界面资源指针
4.4.4 CrectangleScoreContainer类
这个类的作用显示积分榜界面。类包含的方法和具体说明如下:
表4-6 CRectangleScoreContainer类
Tablet.4-6 CrectangleScoreContainer class
方法名 返回值类型 声明 功能 ConstructL CRectangleScoreView public 构造函数 SizeChanged CRectangleScoreView public 改变显示的大小 ComponentControl void private 光标定位在显示积分榜的控件上 CountComponentControls Tuid public 光标从显示积分榜控件位置移走 Draw void public 获得画图的控件 OfferKeyEventL void public 响应按键的操作
4.5 图形图像组件
Symbian OS的图形功能,主要由系统的图形设备接口 (GDI ) 来负责。GDI定义了基本的绘图操作,提供了包括绘制文字、图形和位图的函数接口。所有的系统绘图组件最终都依赖于GDI[7]。
绘图的操作是由图形上下文 ( Graphic Context) 和图形设备来完成的。GDI提供了 一个抽象的图 形上下文类CGraphics Context,它是所有图形上下文的基类,定义了像画笔、画刷等绘图参数,并且提供了绘图相关的应用程序接口函数。而图形设备,会根据图 形上下文提供的信息,真正的完成绘制的操作。它是所有图形设备的抽象基类,它详细定义了一个图形设备所需具有的属性。
4.6 游戏资源
4.6.1 Symbian OS中资源的定义
Symbian OS中资源一般定义在单独的RSS、RH等文件中。
图4-3 Symbian OS中各种文件的关系和编译
Fig. 4-3 Relationships among various types of file
4.6.2 ID资源(Rectangle.hrh)
下面是系统菜单资源ID的定义(简略),这也是程序中菜单项目所对应ID值的定义:
enum TRectangleIds
{
ERectangleNewGame = 1,
ERectanglePause,
//以下省略
};
4.6.3 资源文件(Rectangle.rss)
Symbian OS中资源的定义非常特殊。一般都会将常用的字符串、菜单命令的枚举类型等定义在外部的RSS、HRH等文件中。而为了实现多语言(本地化)而又不占用大量资源,各种语言具体定义也可以在LOC文件中,然后由程序动态调用[8]。
下面是资源文件中一些重要资源的定义:
//菜单
RESOURCE MENU_PANE r_mainview_menu
{
items = {MENU_ITEM {command = ERectangleDifficulty; cascade=r_submenu; txt = "Difficulty";},
MENU_ITEM {command = ERectangleNewGame; txt = "New Game";},
//省略
};
} //其余菜单省略
而在程序中,要使用这些资源只要将其名字等写入代码即可:
BaseConstructL(R_RECTANGLE_MAINVIEW);这样一来就算将来在系统资源改变再大,程序代码也不用进行修改。
4.7 引擎对象(活动对象)
俄罗斯方块中的引擎其实是个活动对象,下面先介绍一下活动对象。
4.7.1 活动对象
活动对象和一个活动调度器共同提供了非抢先式多任务,可用于替代Symbian OS 中的多线程。使用活动对象可获得的好处是:与使用线程相比较,它编程简洁,且CPU 的效率更高。
Symbian OS 基于微内核结构。各种服务的使用都通过异步接口。活动对象和活动调度器针对异步服务的使用提供了方便的框架:某个活动对象发起一些异步请求,并处理该请求。有一个变量用于指出服务器何时已完成该请求。活动调度器追踪那些活动对象,当其发现有一个请求已完成时,它会调用所分配的活动对象的RunL()方法,而后者会去处理该服务器响应[9]。
继承自CActive 的某个类被称为一个活动对象。
下图为活动对象机制的图解。
图4-4 活动对象机制
Fig. 4-4 Active object facility
4.7.2 CrectangleEngine 类
这个类的作用是处理游戏进程中的所有操作,它调用CRectangleDocument的方法。类包含的方法和具体说明如下:
表5-2 CRectangleEngine类
Tablet.5-2 CrectangleEngine class
方法名 返回值类型 声明 功能 NewL CRectangleScoreView public 第二阶段构造 NewLC CRectangleScoreView public 第二阶段构造 ConstructL void protected 第二阶段构造 KeyLeft Tuid public 按下手机左键的操作--将方块左移 KeyRight void public 按下手机右键的操作--将方块右移 KeyDrop void public 按下手机下键的操作--将方块双倍下移 KeyRotate void public 按下手机上键的操作--将方块旋转 Reset void public 重新开始游戏 DoPause void protected 暂停游戏 LoadSortFile void public 打开积分榜文件,读出积分榜信息 SetUserName void public 比较当前的积分是否可以进入积分榜 SaveNewScore void public 如果当前的积分可以进入积分榜,则将积分的分数和用户名存入积分榜 ToUnicodeL void private 读文件的编码转换 FromUnicodeL void private 写文件的编码转换 GetUserName HBufC public 通过积分帮忙名次获得用户 GetUserScore TInt public 通过积分帮忙名次获得用户分数 GetUserCount TInt public 通过积分帮忙名次获得用户数量 RunL void protected 运行游戏
RunL函数几乎可以说是描述了整个游戏运行的过程。下面是这个函数的伪代码。
void CRectangleEngine::RunL()
{
if (!iDoc->MoveBlock(iDoc->iBlockPos + TPoint(0, 1)))
//如果到底,返回false,执行if内的语句,如果没有到底,继续下移
{
//进行下移图像的绘制
//如果游戏失败返回false,执行if内的语句
{
if (vGameUserName->ExecuteLD(R_RECTANGLE_NA
上一篇:
基于Qt与Android的KTV管理系统设计与实现(word文档)
下一篇:
手机媒体营销分析