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

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

  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;
}

  暂时就这些吧。

【编辑推荐】

  1. Symbian每6个月发布一款新开源操作系统
  2. 微软建WindowsMarketplace 完善智能机平台
  3. 大力模仿Android 传微软WM6.5可装插件
责任编辑:庞桂玉 来源: it168
相关推荐

2021-12-17 10:06:42

鸿蒙HarmonyOS应用

2009-04-12 09:00:08

Symbian诺基亚移动OS

2009-04-12 09:02:32

Symbian诺基亚移动OS

2009-04-12 08:59:05

Symbian诺基亚移动OS

2009-04-12 09:01:05

Symbian诺基亚移动OS

2009-04-12 09:06:00

Symbian诺基亚移动OS

2009-04-12 09:03:50

Symbian诺基亚移动OS

2009-04-12 08:57:50

Symbian诺基亚移动OS

2022-07-29 14:47:34

数独Sudoku鸿蒙

2009-04-12 08:55:18

Symbian诺基亚移动OS

2013-08-19 10:45:36

社交游戏手机游戏

2009-04-12 08:36:09

Symbian诺基亚移动OS

2013-06-17 12:44:38

WP7开发Windows Pho数独游戏

2022-10-19 15:27:36

数独Sudoku鸿蒙

2022-10-18 15:45:17

数独Sudoku鸿蒙

2022-10-19 15:19:53

数独Sudoku鸿蒙

2011-06-16 15:36:56

Qt Quick Symbian

2009-04-12 08:51:50

Symbian诺基亚移动OS

2015-07-03 11:27:30

程序员自己神器

2021-12-23 09:50:46

Python游戏脚本
点赞
收藏

51CTO技术栈公众号