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

仍是做一个同样界面同样功能的数独游戏,但是所花费的时间远远超出我用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());
//        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(
2222));
        AknIconUtils::SetSize(c, TSize(
2222));
        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等枚举),只能自己去尝试一下:
TKeyResponse CSuDoScAppView::OfferKeyEventL( const  TKeyEvent &  aKeyEvent,TEventCode aType)
    
{
        
if(aType==EEventKeyUp)
        
{
            
if( aKeyEvent.iScanCode>=EStdKeyLeftArrow && aKeyEvent.iScanCode<=EStdKeyDownArrow)
                
return TreatNavKey(aKeyEvent,aType);
            
else if( aKeyEvent.iScanCode>=48 && aKeyEvent.iScanCode<=57)
                
return TreatNumKey(aKeyEvent,aType);
            
else if( aKeyEvent.iScanCode==EStdKeyDevice1 || aKeyEvent.iScanCode==EStdKeyHash || aKeyEvent.iScanCode==EStdKeyNkpAsterisk)
                
return TreatChrKey(aKeyEvent,aType);            
        }

        
return EKeyWasConsumed;
    }

5、关于消息对话框
在显示“解题成功”的对话框时,记得不要画蛇添足地去消除对话框,如下面代码中注掉的代码是多余的:
TBool CSuDoScAppView::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);    
        
        
return ETrue;
    }

    
return EFalse;
}

暂时就这些吧。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值