AS3在选择新对象时取消选择其他对象

时间:2014-06-10 13:19:46

标签: actionscript-3 onclick selection

我正在开发AS3程序,我正在使用Flash CS6;

在我的游戏中,屏幕上有一堆对象,但只有3个“Pack”对象。到目前为止,我已经做到了这一点,你可以点击其中一个包来选择它,它将以蓝色突出显示。当再次点击相同的包时,它将被取消选择,蓝色突出显示将消失。

我正在使用的技巧是将包装放在一个图层上,并在包装​​前放置一个看不见的透明蓝色矩形。选择包装后,透明蓝色将变为可见。

到目前为止,这是我的代码;

    selecterLegendBlueEyes.bpName="Legend of Blue Eyes White Dragon"
    selecterLegendBlueEyes.bpCost=1
    selecterLegendBlueEyes.bpCards=5
    selecterLegendBlueEyes.buttonMode=true
    selecterLegendBlueEyes.useHandCursor=true

    selecterSpellRuler.bpName="Spell Ruler"
    selecterSpellRuler.bpCost=1
    selecterSpellRuler.bpCards=5
    selecterSpellRuler.buttonMode=true
    selecterSpellRuler.useHandCursor=true

    selecterMetalRaiders.bpName="Metal Raiders"
    selecterMetalRaiders.bpCost=1
    selecterMetalRaiders.bpCards=5
    selecterMetalRaiders.buttonMode=true
    selecterMetalRaiders.useHandCursor=true

//Just some property assigning to make the objects Movieclip buttons.

    function bpIdentify(selecter:Object, selecterName:String, selecterCost:int, selecterCards:int)
    {

        if (selecter.alpha==0)
        {
            selecter.alpha=1;
            selectCost.text="Cost: "+selecterCost+" DP / "+selecterCards+" Cards";
            selectName.text="Selected: "+selecterName;
        }
        else if (selecter.alpha==1)
        {
            selecter.alpha=0;
            selectCost.text="";
            selectName.text="";
        }
    }

//The general selection function

    function bpSelectLegendBlueEyes(e:MouseEvent):void
    {
        bpIdentify(selecterLegendBlueEyes, selecterLegendBlueEyes.bpName, selecterLegendBlueEyes.bpCost, selecterLegendBlueEyes.bpCards);
    }

    function bpSelectSpellRuler(e:MouseEvent):void
    {
        bpIdentify(selecterSpellRuler,selecterSpellRuler.bpName, selecterSpellRuler.bpCost, selecterSpellRuler.bpCards);
    }

    function bpSelectMetalRaiders(e:MouseEvent):void
    {
        bpIdentify(selecterMetalRaiders,selecterMetalRaiders.bpName, selecterMetalRaiders.bpCost, selecterMetalRaiders.bpCards);
    }

//The functions that link to the main selection function that selects each pack

    selecterLegendBlueEyes.addEventListener(MouseEvent.CLICK, bpSelectLegendBlueEyes);
    selecterSpellRuler.addEventListener(MouseEvent.CLICK, bpSelectSpellRuler);
    selecterMetalRaiders.addEventListener(MouseEvent.CLICK, bpSelectMetalRaiders);

//To activate the selection function when the pack is clicked

我想要做的是,当我点击一个包并且我已经选择了另一个包时,它将取消选择所选包并选择新包。

我知道有一种方法可以做到这一点,但它包括为每个特定的选择函数添加每个其他包的取消选择行。仅使用3包就不会出现太大的问题,但我计划在未来添加更多包装,最多20包......这将导致必须共添加约400行。我不是懒惰,我可以添加这些行,但每次添加一个新包时,我都需要为每个选择函数添加一堆更多的行,而且我很可能犯了一个错误并把它弄得一团糟某点。

我最初想到的是这样做,以便每当我点击任何地方时,包都会取消选择,但这是一个问题,因为在选择包装后需要点击一些东西“购买”包。

我想到了一个想法,即每当我点击另一个包时,所有其他包都将被取消选择,通过某种方式告诉程序这些对象是“包”对象,每当包对象是单击,取消选中所有其他包对象。

关于我如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

我会写一个答案而不是评论,因为我觉得你可以让你的代码更紧凑。首先,您应该使用Event类的属性。这将为您节省许多编码。

selecterLegendBlueEyes.addEventListener(MouseEvent.CLICK, bpSelect);
selecterSpellRuler.addEventListener(MouseEvent.CLICK, bpSelect);
selecterMetalRaiders.addEventListener(MouseEvent.CLICK, bpSelect);

function bpSelect(e:MouseEvent):void
{
    var selectedMC:MovieClip = e.target as MovieClip;
    bpIdentify(selectedMC, selectedMC.bpName, 
               selectedMC.bpCost, selectedMC.bpCards);
}

现在,对于取消选择部分,您可以在变量中存储指向所选MovieClip的指针,比如currentlySelected,然后为您的选择函数添加一些逻辑,如下所示:

function bpSelect(e:MouseEvent):void
{
    deselectAll();
    var selectedMC:MovieClip = e.target as MovieClip;
    if (currentlySelected == selectedMC)
    {
        currentlySelected = null;
    }
    else
    {
        currentlySelected = selectedMC;
        bpIdentify(selectedMC, selectedMC.bpName, 
                   selectedMC.bpCost, selectedMC.bpCards);
    }
}