我正在开发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行。我不是懒惰,我可以添加这些行,但每次添加一个新包时,我都需要为每个选择函数添加一堆更多的行,而且我很可能犯了一个错误并把它弄得一团糟某点。
我最初想到的是这样做,以便每当我点击任何地方时,包都会取消选择,但这是一个问题,因为在选择包装后需要点击一些东西“购买”包。
我想到了一个想法,即每当我点击另一个包时,所有其他包都将被取消选择,通过某种方式告诉程序这些对象是“包”对象,每当包对象是单击,取消选中所有其他包对象。
关于我如何做到这一点的任何想法?
答案 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);
}
}