從J2ME學Symbian遊戲開發(二)

gudesheng發表於2008-01-03

        上一節我們講到了“按鍵事件”在J2me和Symbian中的類似處理過程,其實這些東西都是一個遊戲裡必須做的處理,無論是在任何平臺。     

        那麼在手機遊戲裡,選單也是必不可少的。而在Symbian裡是不分什麼高階UI和低階UI的,只有系統控制元件和自定義控制元件之分。

        那麼介面互動部分我們一樣可以和J2ME做個對比:

       J2ME裡的高階UI+CommandAction()                       Symbian裡的系統控制元件+HandleCommandL()

       J2ME裡的低階UI+KeyPressed()                               Symbian裡的自定義控制元件+OfferKeyEventL()

(三)系統選單

      和J2ME裡不一樣的是,Symbian裡的系統控制元件是通過在資原始檔中編輯,在原始碼之外獨立地指定應用程式的可見控制元件。在資源中可以定義的系統控制元件包括選單、對話方塊、列表等。

      應用程式框架在應用程式啟動時會開啟資原始檔,並根據在.rsg中建立的資源識別符號,根據需要把各個資源載入到C++程式碼中。

      這樣的架構有一定的好處就是:資原始檔和C++原始檔之間可以共享資原始檔中定義的資料。

      通常在一個字尾名為.hrh的檔案中定義命令選單中使用的識別符號。

      如下例項摘自SDK自帶的Graphics例項:

      #ifndef __GRAPHICS_HRH__
      #define __GRAPHICS_HRH__

      // Graphics enumerate command codes
      enum TGraphicsIds
      {
         EGaphicsNoOffScreenDemo = 1,
         EGaphicsOffScreenDemo,
         EGaphicsStopDemo
      };

      #endif // __GRAPHICS_HRH__
      可見資原始檔的處理使用的是C的前處理器,以避免多重包含。而.hrh檔案也只能包含emnu和預處理語句,其它的C++語法都會導致資源編輯器編輯失敗,這點需要特別注意。

      下面是和這個.hrh檔案相對應的.rss檔案的內容:

NAME GRAP

#include
#include
#include

#include "Graphics.hrh"


// ---------------------------------------------------------
//  
//    Define the resource file signature
//    This resource should be empty.
//
// ---------------------------------------------------------
//
RESOURCE RSS_SIGNATURE
 {
 }

// ---------------------------------------------------------
//  
//    Default Document Name
//
// ---------------------------------------------------------
//
RESOURCE TBUF
 {
 buf="";
 }

// ---------------------------------------------------------
//  
//    Define default menu and CBA key.
//
// ---------------------------------------------------------
//
RESOURCE EIK_APP_INFO
    {
    menubar = r_graphics_menubar;
 cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
    }


// ---------------------------------------------------------
//  
//   r_graphics_menubar
//   Menubar for Graphics example
//
// ---------------------------------------------------------
//
RESOURCE MENU_BAR r_graphics_menubar
    {
    titles =
        {
        MENU_TITLE
   {
   menu_pane = r_graphics_menu;
   }
        };
    }


// ---------------------------------------------------------
//  
//   r_graphics_menu
//   Menu for "Options"
//
// ---------------------------------------------------------
//
RESOURCE MENU_PANE r_graphics_menu
    {
    items =
        {
        MENU_ITEM
   {
   command = EGaphicsNoOffScreenDemo;
   txt = "No off screen bmp";
   },
        MENU_ITEM
   {
   command = EGaphicsOffScreenDemo;
   txt = "Off screen bmp";
   },
        MENU_ITEM
   {
   command = EGaphicsStopDemo;
   txt = "Stop Animation";
   },
        MENU_ITEM
   {
   command = EAknSoftkeyExit;  
   txt = "Exit";
   }
        };
    }
下面對這個檔案的內容做一些說明:

RESOURCE RSS_SIGNATURE
 {
 }

RESOURCE TBUF
 {
 buf="";
 }

這兩個一般情況下是不允許做改動的,前者是資源的簽名,後者是預設文件名。

===================================================================================

RESOURCE EIK_APP_INFO
    {
    menubar = r_graphics_menubar;
    cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
    }

用來標識選單和快捷鍵的ID,就是給選單和相應的快捷鍵起個名字而已,以便於程式後面的使用。

===================================================================================

RESOURCE MENU_PANE r_graphics_menu
    {
    items =
        {
        MENU_ITEM
   {
   command = EGaphicsNoOffScreenDemo;
   txt = "No off screen bmp";
   },
        MENU_ITEM
   {
   command = EGaphicsOffScreenDemo;
   txt = "Off screen bmp";
   },
        MENU_ITEM
   {
   command = EGaphicsStopDemo;
   txt = "Stop Animation";
   },
        MENU_ITEM
   {
   command = EAknSoftkeyExit;  
   txt = "Exit";
   }
        };
    }
這個才是實際定義的選單的真正內容,也就是我們能在介面上看得到的Menu_Item的標識和內容。

===================================================================================

       OK了,資源定義已經完成,下面只需要在Ui類的HandleCommandL()方法中針對相應的Command做相應的處理即可。

void CGraphicsAppUi::HandleCommandL(TInt aCommand)
    {
    switch(aCommand)
        {
        case EEikCmdExit:
        case EAknSoftkeyExit:
            Exit();
            break;

        case EGaphicsNoOffScreenDemo:
             iAppView->StartNoOffScreenDemo();
            break;

        case EGaphicsOffScreenDemo:
            iAppView->StartOffScreenDemo();
            break;

        case EGaphicsStopDemo:
            iAppView->StopDemo();
           break;

        default:
            User::Panic (_L("Graphics"), EGraphicsBasicUi);
            break;
        }
    }

       現在你也學了和J2ME裡的高階UI響應相對應的Symbian裡的處理方法,現在和使用者互動應該沒問題了。無論是按鍵事件的OfferKeyEventL()方法、還是選單命令的HandleCommandL()方法。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=818930


相關文章