创建重复的动画片段会覆盖它们的引用 AS3
creating duplicate movieclips overwrites their references AS3
我正在尝试创建 5 个动画片段并添加到舞台上。每个影片剪辑都有一个附加的文本字段,显示影片剪辑的引用(即剪辑 1、剪辑 2 等)
我知道如何使用数组来存储对影片剪辑的引用,但我想做的是当我单击剪辑 2 时,例如,我想要一个特定于剪辑 2 的事件。这是行不通的,因为最后一个影片剪辑会覆盖对先前重复剪辑的引用。
这是非常简单的代码
//code below resides on frame 1, Flash IDE
import com.Jim.util.drawLabel;
import flash.text.TextFormat;
import flash.display.MovieClip;
import flash.events.MouseEvent;
var d:drawLabel;//this is a class that creates the shapes, texts of the mcs
var f:TextFormat = new TextFormat("Arial");
for (var i:int=0; i<4; i++) {
d = new drawLabel ;
d.idOf=i
d.init("i "+i,i,f,50,50*i);//the drawlabel class has a public method that creates the shapes and the text; see below in the class
d.addEventListener(MouseEvent.CLICK,checked);
addChild(d);
}
function checked(e:MouseEvent):void {
trace(d.idOf);
//result of the trace is 3, regardless of which movieclip I clicked on;
}
这是 drawLabel class
package com.Jim.util{
import flash.display.MovieClip;
import flash.display.Shape;
import flash.display.GradientType;
import flash.geom.Matrix;
import flash.text.TextField;
import flash.events.MouseEvent;
import flash.text.TextFormat;
import flash.display.Sprite
public class drawLabel extends MovieClip {
public var bc:Sprite;
public var idOf:Number
public var label_txt:TextField;
public var theSentence:String;
public function drawLabel() {
}
public function init(theSentence,mc_id,whatFmt,sentenceL:Number=100,sx:Number=0,sy:Number=0,blockSize:Number=50,colorOf:uint=0xcccccc, alphaOf:int=1) {
bc = new Sprite();
idOf=mc_id
label_txt = new TextField();
bc.graphics.beginFill(colorOf,alphaOf);
bc.graphics.drawRect(sx, sy, sentenceL, blockSize);
bc.graphics.endFill();
bc.mouseChildren=true
bc.buttonMode=true
label_txt.x = sx;
label_txt.y = sy;
label_txt.width = sentenceL;
label_txt.height = blockSize;
label_txt.multiline = true;
label_txt.wordWrap = true;
label_txt.border = false;
label_txt.type = "dynamic";
label_txt.selectable = false;
label_txt.text = theSentence;
label_txt.setTextFormat(whatFmt);
addChild(bc);
bc.addChild(label_txt);
bc.addEventListener(MouseEvent.CLICK,clicked);
}
}
}
另外请注意,我可以将创建影片剪辑的函数复制到主 fla 中,并且它可以工作。但我想为什么在可以使用 class 时添加更多代码。我希望这是有道理的。
谢谢
您可以简单地使用 Event.currentTarget
来访问您当前的对象,所以您可以这样做:
function checked(e:MouseEvent):void {
trace(drawLabel(e.currentTarget).idOf);
}
希望能帮到你。
我正在尝试创建 5 个动画片段并添加到舞台上。每个影片剪辑都有一个附加的文本字段,显示影片剪辑的引用(即剪辑 1、剪辑 2 等)
我知道如何使用数组来存储对影片剪辑的引用,但我想做的是当我单击剪辑 2 时,例如,我想要一个特定于剪辑 2 的事件。这是行不通的,因为最后一个影片剪辑会覆盖对先前重复剪辑的引用。
这是非常简单的代码
//code below resides on frame 1, Flash IDE
import com.Jim.util.drawLabel;
import flash.text.TextFormat;
import flash.display.MovieClip;
import flash.events.MouseEvent;
var d:drawLabel;//this is a class that creates the shapes, texts of the mcs
var f:TextFormat = new TextFormat("Arial");
for (var i:int=0; i<4; i++) {
d = new drawLabel ;
d.idOf=i
d.init("i "+i,i,f,50,50*i);//the drawlabel class has a public method that creates the shapes and the text; see below in the class
d.addEventListener(MouseEvent.CLICK,checked);
addChild(d);
}
function checked(e:MouseEvent):void {
trace(d.idOf);
//result of the trace is 3, regardless of which movieclip I clicked on;
}
这是 drawLabel class
package com.Jim.util{
import flash.display.MovieClip;
import flash.display.Shape;
import flash.display.GradientType;
import flash.geom.Matrix;
import flash.text.TextField;
import flash.events.MouseEvent;
import flash.text.TextFormat;
import flash.display.Sprite
public class drawLabel extends MovieClip {
public var bc:Sprite;
public var idOf:Number
public var label_txt:TextField;
public var theSentence:String;
public function drawLabel() {
}
public function init(theSentence,mc_id,whatFmt,sentenceL:Number=100,sx:Number=0,sy:Number=0,blockSize:Number=50,colorOf:uint=0xcccccc, alphaOf:int=1) {
bc = new Sprite();
idOf=mc_id
label_txt = new TextField();
bc.graphics.beginFill(colorOf,alphaOf);
bc.graphics.drawRect(sx, sy, sentenceL, blockSize);
bc.graphics.endFill();
bc.mouseChildren=true
bc.buttonMode=true
label_txt.x = sx;
label_txt.y = sy;
label_txt.width = sentenceL;
label_txt.height = blockSize;
label_txt.multiline = true;
label_txt.wordWrap = true;
label_txt.border = false;
label_txt.type = "dynamic";
label_txt.selectable = false;
label_txt.text = theSentence;
label_txt.setTextFormat(whatFmt);
addChild(bc);
bc.addChild(label_txt);
bc.addEventListener(MouseEvent.CLICK,clicked);
}
}
}
另外请注意,我可以将创建影片剪辑的函数复制到主 fla 中,并且它可以工作。但我想为什么在可以使用 class 时添加更多代码。我希望这是有道理的。
谢谢
您可以简单地使用 Event.currentTarget
来访问您当前的对象,所以您可以这样做:
function checked(e:MouseEvent):void {
trace(drawLabel(e.currentTarget).idOf);
}
希望能帮到你。