【问题标题】:Use MouseEvent for getting Object`s public variables使用 MouseEvent 获取 Object 的公共变量
【发布时间】:2011-09-05 12:44:16
【问题描述】:

我有一个简单的问题,目前并不容易。这是一个文本字段类,它向影片剪辑添加一个文本字段(从根类传递),并在它的公共变量中保存(缓冲)一些数据(如 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”变量,但是,trace (evt.target.xml00); 不工作.. trace (evt.target.name00); 也不工作。我可以从txt00 中获取.alpha.text 之类的所有内容,但不能获取对象中的其他变量。任何的想法 ?

【问题讨论】:

    标签: actionscript-3 class mouseevent mouse target


    【解决方案1】:

    不要将点击监听器添加到 STAGE 中,而是添加到您的对象中。

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

    并将以下行添加到您的 menuitem00 类中:

    this.mouseChildren = false;
    

    因此您可以确定 evt.target 是此类的对象,而不是子对象(如文本字段或其他内容)。

    编辑

    如果你想保留舞台监听器,试试这个:

    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 类设为精灵(并请重命名):

    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
      }
    }
    

    请重新阅读您的动作脚本(或编程)书籍,您在代码中做了一些您不应该做的非常糟糕的事情。

    【讨论】:

    • 他也可以像他一样将事件监听器添加到舞台,并使用currentTarget而不是target
    • .. 它工作正常.. :) ,, .. 但是,我在舞台上有 400 - 600 个实例,并且 400 - 600 个鼠标事件不好.. 还有其他方法吗?
    • 我试试trace (evt.target.parent.parent.menuData[0].activateFlag);,它告诉我menuData[i].activateFlagtrue .. 但我还不能得到答案.. : \ ,,
    • 我刚刚看到它为什么不起作用......因为你既不是精灵也不是电影剪辑,也不包含文本字段,而是创建 is 并将其添加到您从主班。不好的做法!使该类扩展精灵并且不传递 MC,而是从该类创建一个对象并将新文本字段直接添加到实例中,并使用this.addChild(txt); 编辑答案以包括我刚刚写的内容。
    • 谢谢! ...我从班级中删除了影片剪辑并使用this.addChild(txt); 方法,这确实更好..我最终得到for (var i:int = 0; i&lt;Bunker[0]["trans0size"]; i++) { menuData[i] = new menuitem00(i, Bunker[0]["transfile0" + i]); menuData[i].name00 = Bunker[0]["transtitle0" + i]; menuData[i].activateFlag = false; menuData[i].init(); menu_mc.addChild(menuData[i]); } and use item.getXml()`,一切正常...我有一个getXml( ),它已经是一个“函数”,我想以更直接的形式从evt.target 访问xml00。这可能吗?
    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多