AIR游戏扫雷(一):窗口菜单的制作
发表于7年前(Dec 23, 2014 4:32:46 PM)  阅读 2526  评论 0
今天开始进行扫雷游戏的制作。扫雷的算法,游戏的实现思路以前都想过,应该还算成熟,今天第一课先不讲,先讲下窗口菜单的制作。上个C-DRAWS课题中的菜单栏使用的不是标准的air里面的菜单栏,是我从flex web项目中直接移植过来的,整体效果基本一致,而今天的菜单通用性就不那么好了,只能在air应用中使用,至于他的优点,老实说我现在也不知道,留待以后慢慢发现吧。
先看官方说明:
Adobe AIR 支持以下类型的菜单:
应用程序菜单: 仅 Mac OS X 支持, 应用程序菜单出现在操作系统提供的全局菜单栏中。Mac OS X 为每个应用程序都提供一个默认菜单。AIR 应用程序可以通过向相关的菜单命令添加事件侦听器来使用默认菜单, 通过添加和删除命令和子菜单来修改默认菜单, 还可以将默认菜单替换为新菜单。 (本 AIR Menus 范例采用的方式为替换默认菜单。) 通过air.NativeApplication.nativeApplication.menu 属性访问应用程序菜单。使用 air.NativeApplication.supportsMenu 属性测试应用程序所运行的环境中是否支持应用程序菜单。
窗口菜单: 仅 Microsoft Windows 操作系统支持, 窗口菜单出现在窗口的标题栏下方。由于并不创建默认的菜单对象, 因此必须初始化新的 NativeMenu 对象才能使用窗口菜单。通过原有窗口对象的菜单属性访问窗口菜单。使用NativeWindow.supportsMenu 属性测试应用程序所运行的环境中是否支持窗口菜单。窗口菜单只能用于具有系统镶边的窗口。
上下文菜单: 对页面上大多数元素都提供默认的上下文菜单。通过将 oncontextmenu 事件侦听器附加至元素、取消默认行为并显示菜单, 可以使用不同的上下文菜单。此类菜单可以是用 NativeMenu.display() 方法弹出的原有菜单, 还可以创建 DHTML 菜单。停靠栏图标菜单: 在 Mac OS X 中, 可以向应用程序停靠栏图标添加菜单。新菜单中的菜单项出现在操作系统默认菜单项的上方。
系统任务栏图标菜单: 在 Windows 中, 可以向系统任务栏图标添加菜单。并不创建默认菜单。
弹出菜单: 通过调用任何 NativeMenu 对象的 display() 方法可以在应用程序中任何位置显示的菜单。
我们现在要做的属于窗口菜单,下面我已经将菜单制作封装成了MenuUtil.as类,只要提供菜单的xml文件,就能方便的生成窗口菜单,源码如下:
package com.cangzhitao.menu
{
import flash.display.NativeMenu;
import flash.display.NativeMenuItem;
import flash.events.Event;
import flash.utils.Dictionary;
/**
* 窗口菜单工具类,支持子菜单,支持定义快捷键,支持回调函数设置。
* 菜单xml内容格式如下。data属性暂未使用,keyEquivalent为快捷键,selectFunction为函数名,函数名为完全限定名,函数必须是public的
* private var menuXML:XML =
* cangzhitao 2011-1-15
* www15119258@qq.com
* http://cangzhitao.com
*/
public class MenuUtil
{
public function MenuUtil()
{
}
//创建顶级菜单
public static function createRootMenu(menuXML:XML):NativeMenu {
var rootMenu:NativeMenu = new NativeMenu();
for each(var xml:XML in menuXML["menu"]) {
rootMenu.addSubmenu(createMenu(xml),xml.@lable);
}
return rootMenu;
}
public static var classes:Dictionary = new Dictionary();;
//创建子菜单
private static function createMenu(menuXML:XML):NativeMenu {
var subMenu:NativeMenu = new NativeMenu();
for each(var xml:XML in menuXML["item"]) {
var temp:NativeMenuItem;
if(xml.@lable=="separator") {
temp = subMenu.addItem(new NativeMenuItem("", true));
} else {
temp = subMenu.addItem(new NativeMenuItem(xml.@lable));
}
//添加快捷键
if(xml.hasOwnProperty("@keyEquivalent")) {
temp.keyEquivalent = xml.@keyEquivalent;
}
if(xml.hasOwnProperty("@data")) {
temp.data = xml.@data;
}
//添加回调函数
if(xml.hasOwnProperty("@selectFunction")) {
var functionArray:Array = String(xml.@selectFunction).split(".");
// var objectClass:Class = getDefinitionByName(functionArray[0]) as Class;
// var object:Object = new objectClass();
//必须把所调函数所在的类添加进classes字典里
var object:Object = classes[functionArray[0]];
temp.addEventListener(Event.SELECT, object[functionArray[1]]);
}
//迭代添加子菜单
if(XMLList(xml["item"]).length()>0) {
temp.submenu = createMenu(xml);
}
}
return subMenu;
}
}
}
把该类加入你的工程,然后先把回调函数所在的类加入工具栏MenuUtil.classes["main"] = this;再在application里面调用nativeWindow.menu = MenuUtil.createRootMenu(menuXML),就可以创建如下图所示的菜单栏: