2013-04-09 3 views
1

Я просмотрел несколько разных потоков и не могу найти ничего, что сработает для меня. Я довольно новичок в ActionScript, так что это может быть очевидно. Для практики я пытаюсь сделать простую игру. В игре вы можете рубить деревья, чтобы добавить свой ресурс. Вот класс дерево:Добавление eventListener к объекту, созданному функцией

package 
{ 
    import flash.display.DisplayObject; 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 

    public class Tree extends Sprite 
    { 

    //Embed the gameObject image 
    [Embed(source="../images/tree.png")] 
    public var GameObjectImage:Class; 
    public var gameObjectImage:DisplayObject = new GameObjectImage(); 
    public var gameObject:Sprite = new Sprite(); 

    public function Tree() 
    { 
     gameObject.addChild(gameObjectImage); 
     this.addChild(gameObject); 
    } 
} 
} 

Затем я создаю функцию в Main.as называют «createTree»

public function createTree (xPos:int, yPos:int):void 
    { 
     var treeName:Tree = new Tree(); 
     treeName.x = xPos; 
     treeName.y = yPos; 
     treeName.addEventListener(MouseEvent.CLICK, chopWood); 
     stage.addChild(treeName); 
    } 

И у меня есть функция под названием «chopWood», чтобы удалить дерево.

public function chopWood(e:MouseEvent):void 
    { 
     wood++; 
     stage.removeChild(e.relatedObject); 
     updateResources(); 
    } 

В конструкторе я добавляю дерево.

 createTree(100,100); 

И это добавляет дерево в x: 100 y: 100. Но событие Click не работает. Если я вручную добавлю дерево (т. Е. Не через функцию) и вручную добавлю четный слушатель, он будет работать. Я полагаю, что это какая-то проблема инкапсуляции, но я не уверен, как ее решить. Создание деревьев должно выполняться через функцию, потому что в игре необходимо добавить деревья в какой-то момент.

Как я могу получить событие click для работы со всеми деревьями, которые я добавляю на сцену?

ответ

2

Кажется, что он должен работать. Вызывается метод chopWood нажатием кнопки? Поместите трассировку в начале chopWood, чтобы проверить это.

Если вызывается chopWood, то я вижу одну странную вещь. Я не уверен, что такое e.relatedObject. Я думаю, вы бы хотели e.currentTarget as Tree. Также вы можете опустить «сцену» в своей линии stage.removeChild(e.relatedObject);. Он должен просто добавить его в качестве ребенка вашего основного класса.

+0

Спасибо! Я продолжал предполагать, что ChopWood не вызвали, но это было так. Я изменил его на «e.currentTarget как дерево», и он отлично работает! К сожалению, я не видел «currentTarget» в помощи Adobe и пошел с «relatedObject». – sbatson5

+1

Не беспокойтесь. 'MouseEvent' фактически расширяет' Event', а 'currentTarget' является свойством' Event'. В документах AS3 убедитесь, что вы нажмете «Показать унаследованные общедоступные свойства» в начале списка свойств, чтобы получить полный список доступных свойств. –

Смежные вопросы