您的位置:首页 > 其它

从J2ME学Symbian游戏开发(二)

2007-12-17 10:30 555 查看
上一节我们讲到了“按键事件”在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 <eikon.rh>
#include <avkon.rh>
#include <avkon.rsg>

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: