Используйте MouseEvent для получения открытых переменных объекта - PullRequest
0 голосов
/ 05 сентября 2011

У меня есть простая проблема, которая сейчас непроста.это класс текстового поля, который добавляет текстовое поле в мувиклип (передаваемый из корневого класса), а также сохраняет (буферизирует) некоторые данные (например, имя файла XML) в его общедоступных переменных:

package src {
import flash.display.Shape;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
public class menuitem00 extends Shape {
    public var activateFlag:Boolean = false;
    public var name00:String = "";
    public var xml00:String = "";
    public var txt00:TextField = new TextField();

    private var OM:MovieClip;
    private var id00:Number = 0;

    public function menuitem00(n:int ,OE:MovieClip ,xmlf:String):void {
        trace (" Text Field Object with buffer ");
        OM = OE;    id00 = n;   xml00 = xmlf;
    }
    public function init():void{
        // textfield

        txt00.selectable = false;
        txt00.autoSize = TextFieldAutoSize.LEFT;
        txt00.defaultTextFormat = new TextFormat("Impact", 36,0x66AAFF);
        txt00.text = name00;
        txt00.border = true;
        txt00.borderColor = 0x00FF00;
        txt00.sharpness = 100;
        txt00.x = 0;
        txt00.y = (id00 * txt00.height) + 1;
        txt00.z = 0;
        OM.addChild(txt00);
    }
}

} .. теперь я использую цикл for для добавления экземпляра этого класса в мувиклип на сцене:

for (var i:int = 0; i<Bunker[0]["trans0size"]; i++) {
    menuData[i] = new menuitem00(i, menu_mc, Bunker[0]["transfile0" + i]);// pass i , a movieclip named menu_mc and an xml file name 
    menuData[i].name00 = Bunker[0]["transtitle0" + i]; // pass text 
    menuData[i].activateFlag = true; // set actveFlag to true
    menuData[i].init(); // run init() inside the instance. it adds textfield to the menu_mc and also set name00 as Text for the textField
}

, а также добавляю событие мыши для нажатия на сцену,

stage.addEventListener(MouseEvent.CLICK, clk, false, 0, true);
public function clk(evt:MouseEvent):void{   //// mouse 
    trace (" Name: " + evt.target.text);
    //trace (evt.target.xml00);
    }

ЗДЕСЬ МОЯ ПРОБЛЕМА -> Я хочу получить "xml00" var из этого экземпляра на сцене щелчком мыши, но trace (evt.target.xml00); не работает .. также trace (evt.target.name00); не работает.Я могу получить все, как .alpha или .text из txt00, но не другие переменные в моем объекте.Любая идея ?

1 Ответ

2 голосов
/ 05 сентября 2011

не добавляйте прослушиватель кликов на ЭТАП, а к своему объекту.

menuData[i].addEventListener(MouseEvent.CLICK, clk, ...);

и добавьте следующую строку в ваш класс menuitem00:

this.mouseChildren = false;

, чтобы вы моглиубедитесь, что evt.target является объектом этого класса, а не дочерним (как текстовое поле или что-то еще).

edit

, если вы хотите сохранитьслушатель сцены, попробуйте это:

stage.addEventListener(MouseEvent.CLICK, clk, ...);

private function clk (evt:MouseEvent):void
{
  if (evt.currentTarget is menuitem00)
  {
    var item:menuitem00 = evt.currentTarget as menuitem00;
    trace(item.xml00);  // or any other public variable 
  }
}

, но все равно добавьте mouseChildren = false; в ваш класс.

edit2

сделайте menuitem00класс sprite (и переименуйте его в pls):

public class MenuItem extends Sprite {
  private var _activateFlag:Boolean;
  private var _xml:String;
  private var _txt:TextField;
  private var _id:Number;

  public function MenuItem (n:int, xmlf:String) {
    trace (" Text Field Object with buffer ");
    _id = n;
    _xml = xmlf;
    _activeFlag = true;

    this.mouseChildren = false;

    // create txt
    _txt = new TextField();
    // do the formating here ...
    this.addChild(_txt);
  }

  public function getXml():String {
    return _xml;
  }
}

в цикле for вы сделаете что-то вроде этого:

for (var i:int = 0; i<Bunker[0]["trans0size"]; i++) {
  var item:MenuItem = new MenuItem(i, Bunker[0]["transfile0" + i]);
  item.addEventListener(MouseEvent.CLICK, clk, false, 0, true);
  menu_mc.addChild(item);
  menuData[i] = item;
}

private function clk (evt:MouseEvent):void {
  var item:MenuItem = evt.target as MenuItem;
  if (item != null) {
    trace(item.getXml());  // use a getter and don't access the variable directly
  }
}

и pls перечитайте ваш ActionScript (или программирование)книги, вы делаете действительно плохие вещи в своем коде, которые не следует делать.

...