【问题标题】:Best way to handle EventListeners/Handlers for 1000 buttons?处理 1000 个按钮的 EventListeners/Handlers 的最佳方法?
【发布时间】:2011-08-18 14:11:56
【问题描述】:

我正在开发一款用户可以赢得按钮/徽章作为奖励的游戏。我估计总共会有大约 500 个奖项。

我想允许用户将他们复制的/不需要的徽章卖给银行并从银行购买新的。

我正在多个奖项框架中展示徽章。在徽章下方,我显示了计数以及“购买”和“出售”按钮。

我的问题是:处理这么多买卖按钮的最佳方式是什么?有没有办法编写 1000 个事件侦听器和 1000 个事件处理程序?

一种可能的解决方案是逐步命名我的按钮,例如“buy_mc1”、“buy_mc2”等。然后执行一个循环来为此 [“buy_mc”+i] 创建侦听器。但是,我必须非常确保我将这些正确地链接回奖项。

目前,我的数据库中有一个“award_mc”字段,它将影片剪辑的名称存储在我的 .fla 中。从中,我可以访问相关资产,例如计数字段,例如:this[db.award_mc + "_count"].txt。

不幸的是,这种方法不适合循环访问。

也许我可以创建一组与购买/出售按钮同步的影片剪辑名称。例如:

myArray = {aMissionAward, anotherAward, ubernessAward};

我的按钮是: 买_0、买_1、买_2等

当有人点击按钮时,我可以将 buy_2 链接到“ubernessAward”,然后在数据库中查找“ubernessAward”。

但是,我怎样才能从按钮中获取号码?即使我可以循环设置 eventListeners,我是否必须设置 individuatl eventHandlers 来处理正确的索引号?

我愿意接受有关另一种方法的建议。

-------------- 编辑 -------- --------

这是我的解决方案。感谢 Jens Struwe 为我指明了正确的方向。

我无法使用舞台上的按钮来实现此功能。显然,按钮是一个静态类。 MovieClips 是动态的,所以我可以通过使用 MovieClips 来实现它。这是我所做的:

在舞台上添加了 3 个影片剪辑。 将它们命名为“mc0”、“mc1”和“mc2”。

添加此 AS3 代码:

for (var i:Number=0; i<3; i++)
{
    this["mc" + i].addEventListener( MouseEvent.CLICK, onMcClick );
    this["mc" + i].awardKey = i;
}

function onMcClick( evt:MouseEvent ):void
{
    trace("MC ID = " +(evt.target).awardKey);

    switch ((evt.target).awardKey)
    {
        case 0:
            trace("     Do stuff for 0");
            break;
        case 1:
            trace("     Do stuff for 1");
            break;
        case 2:
            trace("     Do stuff for 2");
            break;      
    }
}

从这里,我可以将awardKey 绑定到一组电影剪辑名称。然后,我可以使用 MovieClip 名称来读取我的数据库。

这就是为什么我在遇到问题时首先来 Stack Overflow。 :)

【问题讨论】:

    标签: flash actionscript-3 event-handling


    【解决方案1】:

    您只需要一个可以处理所有按钮的侦听器:

    1. 让您的买入和卖出按钮点击事件冒泡。

    2. 给每个按钮一个唯一的标识符,例如myButton.awardKey = "uberness";

    3. 为所有按钮的容器注册一个事件监听器。

    4. 使用event.target 确定实际点击的按钮,使用MyButton(event.target).awardKey 确定奖励类型。

    【讨论】:

    • 这成功了!我发现我无法为舞台上的按钮添加新属性,因为它是一个静态类。 MovieClip 是动态的,所以我可以通过使用 MovieClips 来实现它。我将在原始帖子的末尾发布我的解决方案。谢谢。你为我节省了大量的工作!!! :)
    • 如果您不想为所有奖项命名的麻烦,您可以将它们设置在网格中并使用单击 x 和 y 来获得正确的行/列
    【解决方案2】:

    有几种方法可以处理这个问题。

    您尚未说明您使用的是自定义事件还是原生 Flash 事件。如果您正在侦听冒泡的本机 Flash 事件(检查事件的文档),或者您正在生成冒泡的自定义事件,您可以简单地侦听包含所有按钮的父 DisplayObjectContainer。然后,使用 event.target 来确定是哪个按钮实际产生了事件。

    您可以处理此问题的另一种方法是侦听 ADDED_TO_STAGE 事件,然后在处理程序中使用类似的内容:

    protected function checkNewObject(e:Event):void  {
        if (e.target is YourButtonSubclass) {
           var btn:YourButtonSubclass = e.target as YourButtonSubclass;
           btn.addEventListener('SomeEvent', theHandler);
        }
    }
    

    HTH; 艾米

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      相关资源
      最近更新 更多