我如何知道我点击了哪个对象?

时间:2010-04-14 02:03:16

标签: flash actionscript-3 oop unique mouseevent

这是交易:我正在研究AS3中的个人投资组合,我遇到了一个我似乎无法找到合理答案的问题。我想要用XML文件(包括我的菜单)编辑所有内容(好吧,大部分内容)。我的菜单只是一个带有一些文本的Sprite和一个Tweener-tween,没什么大不了的。但是,我忘了考虑如何确定我点击了哪个菜单项。

这是我的Main.as

private function xmlLoaded(e:Event):void {
    xml = e.target.xml;
    menu = new Menu(xml);
    menu.x = 0;
    menu.y = stage.stageHeight / 2 - menu.height / 2;
    addChild(menu);
}

在Menu.as

public function Menu(xml:XML) {
    for each (var eachMenuItem:XML in xml.menu.item) {
        menuItem = new MenuItem(eachMenuItem);
        menuItem.y += yPos;
        addChild(menuItem);
        yPos += menuItem.height + 3;
    }
}

并且在我的MenuItem.as中,一切正常 - 当我将鼠标悬停在它上面时,我有一个奇特的补间,但当我点击一个菜单项时,我想要出现一些东西。我怎么知道我点击了哪一个?我已经尝试过推送数组中的所有内容,但这样做效果不好(或者我做错了)。还尝试了一个全局计数器,但这不起作用,因为值总是我的XML文件中的项目数量。还在我的click-function中尝试了e.currentTarget,但是当我追踪它时,它们都是“Object Sprite”..我需要一些东西,所以我可以给每个人一个独特的“名字”?

提前致谢!

3 个答案:

答案 0 :(得分:2)

你可以在MenuItem类中设置一个名称变量并使用它。然后,在事件处理程序中,您可以使用(e.currentTarget as MenuItem).name(或只是普通e.currentTarget.name

顺便说一句,你知道对于每个.. in并不保证按顺序遍历xml吗?

答案 1 :(得分:0)

我有一个类似的答案,但我会使用硬件演员MenuItem(e.currentTarget)而不是使用作为关键字的软转换。原因是如果你不小心强制转换为错误的类型,软转换将只返回null,因为硬转换会给你一个正确的运行时错误和代码中的问题所在的行号。

我还建议在MenuItem中添加一个公共函数来获取唯一的引用或索引,这样你就可以在MenuItem的CLICK事件处理程序中做这样的事情

private function onMenuItemClick( event : MouseEvent ) : void{

    // this could be a int, ie. the node index in the XML
    var uniqueSectionReference : String = MenuItem( event.currentTarget ).uniqueReference;

    dispatchEvent( new MenuEvent( MenuEvent.CHANGE, false, false, uniqueSectionReference ) );

    // or if you have a reference in Menu for whatever it is thats controlling your content you could do this

    contentHolder.showSection( uniqueSectionReference );

}

答案 2 :(得分:0)

您可能也会考虑使用Dictionary类 - 我发现自己越来越多地使用它来做这样的事情。基本上它有点像Array,但它不是将您的值与索引键相关联,而是允许您将对象引用映射到其他对象引用。例如,您可以设置如下内容:

// create your buttons
var button1:MyButton = new MyButton();
var button2:MyButton = new MyButton();
var button3:MyButton = new MyButton();

// declare and instantiate a dictionary object
var links:Dictionary = new Dictionary();

// populate your dictionary object, mapping values to your buttons.
links[button1] = "http://www.button1URL.com";
links[button2] = "http://www.button2URL.com";
links[button3] = "http://www.button3URL.com";

// group buttons into an array for convenience
var buttons:Array = [button1, button2, button3];

// add event listener to your button
for each (var b:MyButton in buttons) {
     b.addEventListener(MouseEvent.CLICK, clickHandler);
}

// handle the button click by getting the relevant information for the clicked button from
// your dictionary object
function clickHandler(e:MouseEvent):void {
     navigateToUrl(new URLRequest(links[e.currentTarget]));
}

您的示例显然有点复杂 - 您需要将您的URL值或其他内容包含在XML中,然后以这种方式处理它。根据你正在做的事情,你可能根本不需要字典 - 如果数据包含在按钮本身中,e.currentTarget.MyValue可能对你很好。

希望有所帮助!