处理1000个按钮的事件监听器/处理程序的最佳方法?

时间:2011-08-18 14:11:56

标签: flash actionscript-3 event-handling

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

我希望允许用户将重复/不需要的徽章出售给银行并从银行购买新徽章。

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

我的问题是:处理SO MANY购买和购买的最佳方式是什么?卖按钮?有没有办法编写1000个eventListeners和1000个eventHandlers?

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

目前,我的数据库中有一个“award_mc”字段,它在我的.fla中存储了movieclip的名称。从那里,我可以访问相关的资产,比如count字段,例如:this [db.award_mc +“_ count”] .txt。

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

也许我可以创建一个与买/卖按钮同步的动画片段名称数组。例如:

myArray = {aMissionAward,anotherAward,ubernessAward};

我的按钮是: buy_0,buy_1,buy_2等。

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

虽然如何从按钮获取号码?即使我可以循环设置eventListeners,我是否必须设置个别事件的eventHandlers来处理正确的索引号?

我愿意接受其他方式的建议。

-------------------------- EDIT -------------------- --------

这是我的解决方案。 Jens Struwe的道具指向我正确的方向。

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

在舞台上添加了3个MovieClip。 将它们命名为“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名称数组。然后,我可以使用MovieClip名称来读取我的数据库。

这就是我遇到问题时首先来到Stack Overflow的原因。 :)

2 个答案:

答案 0 :(得分:6)

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

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

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

  3. 将单个事件监听器注册到所有按钮的容器中。

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

答案 1 :(得分:0)

有几种方法可以解决这个问题。

您尚未说明您是使用自定义事件还是本机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; 艾米