仍是做一个同样界面同样功能的数独游戏,但是所花费的时间远远超出我用Android或者J2ME来做同样的事情,当然运行效率也很明显(我将J2ME实现的数独放在N73上跑过,因为重绘屏幕的代码没有优化,所以效果不好,但同样的算法在BREW或者Symbian上就跑得相当顺畅)。
言归正传,关于数独在Android上的实现,可参考这个:
http://blog.csdn.net/sharetop/archive/2008/02/27/2124153.aspx这次我主要谈谈在做这个 Symbian版本中遇到的几个问题,希望以后自己不要再犯同样的错误了。
1、多视图的应用程序框架的问题我用的是Carbide C++ IDE环境,不知道为什么不能生成多视图的架子,所以只能在HelloWorld框架的代码上自己手工改写,结果就弄出一个Panic折腾了我很久,问题出在
千万不要在析构函数中去删除创建的CAknView,如下代码(注掉是正确的,否则就在退出应用时会出错):
CSuDoScAppUi::~CSuDoScAppUi()
...{
//if(iAppCtrol!=NULL){
//this->RemoveView(iAppCtrol->Id());
//deleteiAppCtrol;
//iAppCtrol=NULL;
//
//RDebug::Printf("deleteiAppCtrol");
//}
//RDebug::Printf("deleteUi");
}
我们需要负责清除对象的地方是在CAknView中负责删掉CCoeControl,因为在它的DoActivateL/DoDeactivateL两个函数中负责创建和删除CoeControl,但是如果退出时这个DoDeactivateL是不会主动调用的,因此在析构时可以调用一下它:
CSuDoScAppCtrol::~CSuDoScAppCtrol()
...{
iFs.Close();
iList.Close();
DoDeactivate();
RDebug::Printf("deleteCtrol");
}
2、关于显示字体的问题在调用CWindowGc的DrawText方法时,
必须要设置一下字体否则不会有东西显示出来,而设置字体有一段标准代码可以参考(来源于网上):
CWindowGc&gc=SystemGc();
CFont*font=NULL;
TFontSpecfontSpec=iEikonEnv->LegendFont()->FontSpecInTwips();
fontSpec.iHeight-=fontSpec.iHeight/6;
iCoeEnv->ScreenDevice()->GetNearestFontInTwips(font,fontSpec);
gc.UseFont(font);
//dosth.
gc.DiscardFont();
iCoeEnv->ScreenDevice()->ReleaseFont(font);
3、关于SVG图像的显示我将所有的数字小图片都做成SVG格式,
在显示SVG图像的时候必须设置它的尺寸,否则也无法显示。另外,因为制作时它的背景色为白色,所以要显示为透明则需要用到它的MASK了。
for(TInti=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<CFbsBitmap>对象,这里我在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);
4、关于按键处理我仍是按BREW手机的模式,左软键菜单,右软键切换模式,*#则用来切换题目。在Symbian中对键值的定义比其它平台要复杂一些,让人有点摸不着头脑,比如数字健没有定义在头文件中(不是那个EStdKeyNkp1等枚举),只能自己去尝试一下:
TKeyResponseCSuDoScAppView::OfferKeyEventL(constTKeyEvent&aKeyEvent,TEventCodeaType)
...{
if(aType==EEventKeyUp)
...{
if(aKeyEvent.iScanCode>=EStdKeyLeftArrow&&aKeyEvent.iScanCode<=EStdKeyDownArrow)
returnTreatNavKey(aKeyEvent,aType);
elseif(aKeyEvent.iScanCode>=48&&aKeyEvent.iScanCode<=57)
returnTreatNumKey(aKeyEvent,aType);
elseif(aKeyEvent.iScanCode==EStdKeyDevice1||aKeyEvent.iScanCode==EStdKeyHash||aKeyEvent.iScanCode==EStdKeyNkpAsterisk)
returnTreatChrKey(aKeyEvent,aType);
}
returnEKeyWasConsumed;
}
5、关于消息对话框在显示“解题成功”的对话框时,记得不要画蛇添足地去消除对话框,如下面代码中注掉的代码是多余的:
TBoolCSuDoScAppView::ShowSuccessDlg()
...{
if(iState==EGSTATE_WRITE&&CSuDoScHelper::CheckSuccess(iGrid))...{
TBuf<32>str;
iCoeEnv->ReadResource(str,R_TEXT_SUCCESS);
CAknInformationNote*dlg=new(ELeave)CAknInformationNote(ETrue);
//CleanupStack::PushL(dlg);
dlg->ExecuteLD(str);
//CleanupStack::PopAndDestroy(1);
returnETrue;
}
returnEFalse;
}
暂时就这些吧。
分享到:
相关推荐
数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏...
Python数独游戏是一种基于Python编程语言开发的桌面应用程序,它利用了Python的灵活性和易读性,为用户提供了一个交互式的数独游戏体验。这个压缩包包含的文件是"main.py"和"build.py",它们构成了游戏的核心部分。 ...
这个压缩包文件“一个用python编的数独游戏”显然提供了一个用Python编程语言实现的数独游戏程序。 首先,我们要理解Python是如何处理这种逻辑问题的。Python是一种高级编程语言,以其简洁的语法和强大的功能而闻名...
综上所述,这个数独游戏项目结合了编程语言、图形库和软件工程原则,提供了一个学习和实践C++、OpenGL以及游戏开发架构的良好平台。通过这个项目,开发者不仅可以提升编程技能,还能深入了解图形渲染、事件处理和...
数独游戏是一款经典的逻辑谜题,它通过填充一个9×9的网格,使得每一行、每一列以及每一个小的3×3宫格内的数字都从1到9不重复出现,以此来锻炼玩家的逻辑思维和推理能力。VB(Visual Basic)是一种由微软公司开发的...
数独游戏的核心在于9×9的网格被划分为9个3×3的小宫格,初始状态下,部分单元格已填有数字,玩家的目标是根据已知数字,通过逻辑推理填满剩余的空白单元格,使得每一行、每一列以及每一个小宫格内的数字从1到9都...
这个“一个java做的数独游戏解决器”项目,显然利用了Java编程语言来实现数独问题的自动化求解算法。 Java是一种广泛使用的面向对象的编程语言,以其跨平台性、强大的类库支持和高效性能而著名。在这个项目中,Java...
当我们遍历到一个无法填充的空位时,意味着当前路径无法解决数独,此时就需要回溯,尝试另一条路径。 5. **状态保存**:在递归过程中,我们需要保存当前数独盘面的状态,以便于回溯。可以使用另一个二维数组或者栈...
这个项目不仅展示了如何用C++和MFC实现一个功能齐全的数独游戏,还体现了算法设计和问题解决的能力。对于学习者来说,通过阅读和理解这个项目的源代码,可以深入理解数独算法的工作原理,同时也能提升C++编程和MFC...
在本项目中,"shudu.rar" 是一个包含C++实现的数独游戏GUI的压缩文件。数独是一种逻辑推理游戏,通常以9x9的九宫格形式呈现,分为9个3x3的小宫格。每个宫格内的数字1到9只能出现一次,而整个大宫格的每一行、每一列...
总的来说,"数独游戏 MFC 源代码"是一个结合了基础编程技术、图形用户界面设计和算法实现的综合性项目,对于学习和掌握MFC及Windows应用开发具有很好的实践价值。通过这个项目,开发者可以深入理解MFC的工作原理,...
总之,这款“可以打草稿的数独游戏”是一个结合了Unity技术、游戏设计和逻辑思维的项目,对于想要学习Unity游戏开发的人来说,是一个很好的实践案例。通过深入研究其源代码和设计思路,可以提升对Unity引擎的理解,...
几何数独游戏,微博[@屠龙的胭脂](https://weibo.com/1852299857?refer_flag=1001030103_)所介绍[几何数独游戏视频介绍](https://video.weibo.com/show?fid=1034:4737961351381034)同款。源码在:[蛇蛇数独游戏源...
这需要实现两个函数:一个是生成随机数独,通常是通过回溯算法实现;另一个是验证每行、每列和每个小宫格的数字是否唯一。 4. **事件处理**:VB中的事件驱动编程模型使得当用户点击按钮或改变单元格值时,可以触发...
- **box**:一个下拉框组件,可能用于选择难度等级。 - **data[][]、ansdata[][]、row[][]、col[][]、sql[][][]**:用于存储数独数据及其解决方案的数组。 - **text[][]、atext[][]**:文本字段数组,用于显示...
数独是一种广受欢迎的逻辑推理游戏,它基于一个9x9的网格,被分为9个3x3的小九宫格。每个小九宫格、每一行、每一列都必须填入1到9的数字,且每个数字在每行、每列和每个小九宫格内只能出现一次。这个游戏的魅力在于...
本项目是使用C++编程语言,结合MFC(Microsoft Foundation Classes)框架来实现的一个数独游戏程序。 C++是面向对象的编程语言,它的特点是高效、强大且灵活。在本项目中,C++用于定义类和对象,实现数独游戏的核心...
在提供的压缩包文件中,“数独.exe”可能是一个编译好的可执行程序,用户可以直接运行来玩数独游戏。“save”可能包含了游戏的保存状态,方便用户保存进度并继续游戏。“image”和“sound”文件夹可能分别存储了游戏...
通过这个uniapp数独小游戏项目,开发者可以学习到uniapp的基本用法,以及如何结合游戏逻辑和UI设计来实现一个完整的应用。对于初学者,这是一个很好的实践项目,可以加深对uniapp框架的理解,同时提升解决问题的能力...
请设计一个数独游戏,要求包括: 1, 基本要求:能按照不同难度级别设置随机的初始数独,允许用户在空格处填入数字完成数独游戏;在用户输入数字时,判断冲突,给出错误提示;计时,记录用户完成数独所用时间。 2, ...