Symbian学习笔记(8)——再尝试着做一个数独游戏

仍是做一个同样界面同样功能的数独游戏,但是所花费的时间远远超出我用Android或者J2ME来做同样的事情,当然运行效率也很明显(我将J2ME实现的数独放在N73上跑过,因为重绘屏幕的代码没有优化,所以效果不好,但同样的算法在BREW或者Symbian上就跑得相当顺畅)。

这次我主要谈谈在做这个 Symbian版本中遇到的几个问题,希望以后自己不要再犯同样的错误了。

1、多视图的应用程序框架的问题

我用的是Carbide C++ IDE环境,不知道为什么不能生成多视图的架子,所以只能在HelloWorld框架的代码上自己手工改写,结果就弄出一个Panic折腾了我很久,问题出在千万不要在析构函数中去删除创建的CAknView,如下代码(注掉是正确的,否则就在退出应用时会出错):

CSuDoScAppUi::~CSuDoScAppUi()
...{
// if(iAppCtrol!=NULL){
// this->RemoveView(iAppCtrol->Id());
// delete iAppCtrol;
// iAppCtrol=NULL;
//
// RDebug::Printf("delete iAppCtrol");
// }
// RDebug::Printf("delete Ui");
}

我们需要负责清除对象的地方是在CAknView中负责删掉CCoeControl,因为在它的DoActivateL/DoDeactivateL两个函数中负责创建和删除CoeControl,但是如果退出时这个DoDeactivateL是不会主动调用的,因此在析构时可以调用一下它:

CSuDoScAppCtrol::~CSuDoScAppCtrol()
...{
iFs.Close();
iList.Close();

DoDeactivate();

RDebug::Printf("delete Ctrol");
}

2、关于显示字体的问题

在调用CWindowGc的DrawText方法时,必须要设置一下字体否则不会有东西显示出来,而设置字体有一段标准代码可以参考(来源于网上):

CWindowGc& gc = SystemGc();
CFont *font = NULL;
TFontSpec fontSpec = iEikonEnv->LegendFont()->FontSpecInTwips();
fontSpec.iHeight -= fontSpec.iHeight / 6;

iCoeEnv->ScreenDevice()->GetNearestFontInTwips( font, fontSpec );
gc.UseFont( font );

// do sth.

gc.DiscardFont();
iCoeEnv->ScreenDevice()->ReleaseFont( font );

3、关于SVG图像的显示

我将所有的数字小图片都做成SVG格式,在显示SVG图像的时候必须设置它的尺寸,否则也无法显示。另外,因为制作时它的背景色为白色,所以要显示为透明则需要用到它的MASK了。

for(TInt i=0,j=0;i<9;i++,j+=2)...{
CFbsBitmap * b=NULL;
CFbsBitmap * c=NULL;
AknIconUtils::CreateIconL(b,c,iMFileName,EMbmSudoscY1+j,EMbmSudoscY1+j+1);
AknIconUtils::SetSize(b, TSize(22, 22));
AknIconUtils::SetSize(c, TSize(22, 22));
iThumbNormal.AppendL(b);
iThumbNormalMask.AppendL(c);
}

iThumbNormal和iThumbNormalMask是两个RPointerArray对象,这里我在ContructL时就加载所有的数字图,这种方法可以有效地减轻在重绘时加载照成的闪屏。然后在显示时这样即可:

if( CSuDoScHelper::CheckGrid(iGrid,i%9,i/9,iGrid[i].value) )
gc.BitBltMasked(TPoint(xx,yy),iThumbNormal[iGrid[i].value-1],r,iThumbNormalMask[iGrid[i].value-1], EFalse);
else
gc.BitBltMasked(TPoint(xx,yy),iThumbError[iGrid[i].value-1],r,iThumbErrorMask[iGrid[i].value-1], EFalse);

时间: 2024-08-30 05:16:57

Symbian学习笔记(8)——再尝试着做一个数独游戏的相关文章

利用Android做一个数独游戏

问题描述 利用Android做一个数独游戏 如何在Android中绘制出数独游戏九宫格的画面?是在Java代码中编写?数独游戏的算法如何实现 解决方案 开源项目opensudokuhttp://code.google.com/p/opensudoku-android/

Symbian学习笔记

Symbian学习笔记(22) - 关于皮肤的小结 Symbian学习笔记(21)--原来还有这个工具wsdl2cpp,访问webserv Symbian学习笔记(20)--用gSOAP更简单地实现Web Services Clien Symbian学习笔记(19)--初探WebServices API的使用(下) Symbian学习笔记(18)--初探WebServices API的使用(中) Symbian学习笔记(17)--初探WebServices API的使用(上) Symbian学习

stellaris-如何用Stellaris LM4F120 做一个LCD游戏

问题描述 如何用Stellaris LM4F120 做一个LCD游戏 如何用Stellaris LM4F120 做一个LCD游戏,例如pong(乒乓).俄罗斯方块.贪吃蛇.等等

net asp-用.net 做一个网页游戏的战斗画面思路应该是怎么样?最好有片段代码,谢谢了

问题描述 用.net 做一个网页游戏的战斗画面思路应该是怎么样?最好有片段代码,谢谢了 我手里有一个文字版的网页游戏,文字版网页游戏的战斗这个功能应该怎么实现,有没有好心人说一下思路,或者有片段代码最好了. 解决方案 网页游戏.net只能提供数据之类后端逻辑,本身要用js html5 flash等实现.

android做一个QQ游戏大厅之类的软件求帮忙

问题描述 android做一个QQ游戏大厅之类的软件求帮忙 大家好我,现在在做一个QQ游戏大厅这样的软件,就是现在写出来了各个界面.然后接下来怎么写谁能教我点思路.求求各位大神帮帮那个忙.. 解决方案 接下来就是后台.数据库........

我们现在在做一个手机游戏,大概一个月之后就能发布,面向国外用户,服务器打算采用aws运维。

问题描述 我们现在在做一个手机游戏,大概一个月之后就能发布,面向国外用户,服务器打算采用aws运维.

Symbian学习笔记(17)——初探WebServices API的使用(上)

很久没有学习Symbian了,今天研究一下如何使用Symbian中提供的WebService框架来SayHello. 从SDK文档中提供的资料来看这个接口似乎有点复杂,包括了Connection API.Description API和Manager API三套东西,此外还涉到了XML的解析之类的一些API的应用. 阅读了一下它的例子程序(S60Ex目录下的AddressBook),让我更晕乎了.怎么跟自己平时使用的WebService不一样了? 在SDK文档中关于CSenServiceConn

Symbian学习笔记(13)

如何在S60第三版中做一个自启动应用. 参考这篇文章:How to autostart an application on boot up in 3rd- Startup List Management API:http://wiki.forum.nokia.com/index.php/How_to_autostart_an_application_on_boot_up_in_3rd-_Startup_List_Management_API 第一步:写一个RSS文件,就用自己的那个UID作为文件

Symbian学习笔记(4)——在GUI应用中使用图像

学习一下如何修改GUI程序中的图标与如何加载图像. 与2nd.不同的是,3rd.支持svg格式的可缩放图标(最大好处在于一个图标搞定,以前用bmp时为了应用程序的菜单图标得要做四个小图标).而且,现在有了一种新的图像打包格式mif(这名字咋跟BREW中那个MIF一样啊).虽然还支持以前的MBM方式但是不建议使用了. 要在应用程序中增加图像图标资源,过程如下: 第一步,先将要加入的图像放在工程的/gfx目录下,如: qgn_menu_DemoUI.svg splash2.bmp 前面一个就是应用程