孩子被另一个孩子取代

时间:2014-02-03 13:42:13

标签: actionscript-3

我在AS3制作游戏。

我有一个名为emptyspace的孩子,在我的引擎中加入了我的舞台。就像那样:

    emptyspace= new EmptySpace(stage, usableItems[0]);
    addChild(emptyspace);
    emptyspace2= new EmptySpace2(stage, usableItems[0]);
    addChildAt(emptyspace2, 0);

每个emptyspace都有自己的类(EmptySpace.as和EmptySpace2.as)。

当我点击一个emptyspace时,会出现一个useBox(UseBox.as)

是否可以保存“内存中”点击emptyspace但稍后再使用它?

因为,然后,如果玩家想要建造或不打造,玩家可以在useBox中选择。

如果他点击“构建”,则会打开一个窗口,其中包含不同的建筑物(Building.as)。

现在,我想知道是否有可能当他点击“图书馆”作为例子时,图书馆出现在之前被点击的emptyspace(“保存的点击”)?

目前,我已经有了这段代码:

当他点击建筑物窗口中的“图书馆”时,它“调用此功能:

private function poulaillerConstruction(e:MouseEvent):void{
            Engine.library.buildIt(e);
            Engine.building.visible = false;
}

在Library.as中:

public function buildIt(e:MouseEvent):void{
    stageRef.addChild(this);
    this.visible = true;    
    }

所以,目前,它出现在屏幕上的任何地方(当然总是在同一个地方)而不是emptyspace所在的地方。

(如果我点击第二个空白区域,那么图书馆会出现在与第一个空白区域相同的位置......也不想要那个)。

有什么想法吗?

非常感谢,


修改

所以,我已经加入了 Engine.as

emptyspace.addEventListener(MouseEvent.CLICK, onEmptySpaceClicked);

private function onEmptySpaceClicked(e:MouseEvent):void{
            trace("click on it neww");
   var myVar = e.currentTarget;
                    if (e.currentTarget.name == emptyspace){
                        //Don't know what to put
                    }
if (e.currentTarget.name == emptyspace2){

                    }           
}

现在,我该如何在Tower.as中输入我的buildIt函数“收听e.currentTarget.name?

这样的东西? :

public function buildIt(e:MouseEvent):void{
if (e.currentTarget.name == emptyspace){
//Build here
}
if (e.currentTarget.name == emptyspace2){
//Build here
}   
    } 

什么是代码告诉“在这里点击emptyspace”?

非常感谢,

1 个答案:

答案 0 :(得分:1)

您可以存储单击的'currentTarget'(调用侦听器的对象)。所以假设你已经在emptyspace上创建了一个eventlistener:

emptyspace.addEventListener(MouseEvent.CLICK, onEmptySpaceClicked);

对于每个emptyspace的按钮处理程序,您可以像这样在类变量'myVar:EmptySpace'中捕获该对象:

function onEmptySpaceClicked(e:MouseEvent):void{
   myVar = e.currentTarget;
   // do something more
}

编辑:

我不确定这是否是您需要澄清的内容......

你提到你想保存以后选择哪个emptyspace,所以在onEmptySpaceClicked处理程序中,我不确定你输入if语句的原因是什么。如果你想让其他对象知道已经选择了一个空白区域,你可以在单击emptySpace时在if语句中使用dispatchEvent,但我不确定这是最好的方法。

如果你有一个buildingManager,你可以让if语句调用一个方法并传递单击EmptySpace的引用。这取决于你的设计..

           if (e.currentTarget.name == emptyspace){
                    buildManager.buildCurrentBuilding(myVar);
                }

虽然上面你不需要if语句,但你只需让处理程序将myVar发送到buildingManager。只有当你想要在每个EmptySpace上发生不同的事情时才需要if语句。

要稍后将一个displayObject添加到emptyspace中,您可以使用

myVar.addChild(displayBuildingToAdd);

Engine.as可能会使用getter提供引用:

public function get currentEmptySpace():EmptySpace {

    return myVar;

}

你需要将myVar传递给任何'building'或者buildingManager想要将建筑添加到emptyspace。