我最近在actionscript 3中发现了自定义类。我在最近的项目中开始使用它们,但我发现很难让我的大脑围绕它如何工作。
我创建了两个不同的类来测试。
一个是名为“Persoon”的扩展动画片段,另一个是名为“SpeakerBtn”的扩展简单按钮。
package {
import flash.display.Sprite;
public class Persoon extends Sprite {
public function Persoon(xPos:Number, yPos:Number, naam:String) {
var persoon:Sprite = new Sprite;
persoon.graphics.beginFill(0x000000,1);
persoon.graphics.drawCircle(xPos, yPos, 2);
persoon.graphics.endFill();
this.addChild(persoon);
trace ("hij heet " + naam);
}
}
}
package {
import flash.display.SimpleButton;
import flash.events.MouseEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
public class SpeakerBtn extends SimpleButton {
public var snd:Sound;
public var cnl:SoundChannel = new SoundChannel();
public function SpeakerBtn(xp:Number,yp:Number,naam:String) {
var speaker:SimpleButton = new SimpleButton();
speaker.name = naam;
speaker.x = xp;
speaker.y = yp;
speaker.addEventListener(MouseEvent.CLICK, playSnd);
//this.addChild(speaker);
}
public function playSnd (event:MouseEvent) : void {
trace ("ping");
}
}
}
然后我有我的主要:
package {
import flash.display.MovieClip;
import SpeakerBtn;
import flash.display.SimpleButton;
import Persoon;
public class Main extends MovieClip {
var sp:SpeakerBtn;
var ps:Persoon;
public function Main() {
sp = new SpeakerBtn(50,50,"donna");
addChild(sp);
ps = new Persoon(300,300,"wilf");
addChild(ps);
}
}
}
Persoon wilf 像我预期的那样工作,显示正常并且跟踪正确。
SpeakerBtn donna 无法显示且无法正确追踪。我在 SpeakerBtn包中注释掉了 addChild ,因为如果我打开它,我会收到错误 1061:通过引用调用可能未定义的方法addChild静态类型SpeakerBtn
我注意到当我在main中定义x和y以及addChild为speakerBtn它确实有效。但我不想在Main中定义所有内容,我希望我的SpeakerBtn能够完成所有这些。
我查了this question,但它没有给我答案。有人可以向我解释发生了什么,或者将我链接到一个可理解的教程(一个不太重的技术说法,更像是一个解释 - 它对我来说 - 我5岁)?谢谢!
更新
我忘了在我的库中添加一个带有SpeakerBtn类的按钮,所以没有什么可以显示的。修复了现在,使用此代码按钮确实出现在舞台上,只有x和y值没有注册,它出现在0,0上。此外,事件 playSnd 不会触发跟踪,我认为不起作用。
解决方案 在Cherniv的信息帮助下,我为SpeakerBtn找到了以下解决方案。
Main执行此操作:
package {
import flash.display.MovieClip;
import SpeakerBtn;
import flash.display.SimpleButton;
public class Main extends MovieClip {
var sp:SpeakerBtn;
public function Main() {
sp = new SpeakerBtn("donna", 300, 50);
addChild(sp);
}
}
}
和SpeakerBtn这样做:
package {
import flash.display.SimpleButton;
import flash.events.MouseEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
public class SpeakerBtn extends SimpleButton {
private var snd:Sound;
private var cnl:SoundChannel = new SoundChannel();
private var _naam:String;
private var _x:Number;
private var _y:Number;
public function SpeakerBtn(naam:String, xp:Number, yp:Number) {
_naam = naam;
_x = xp;
_y = yp;
addEventListener(Event.ADDED_TO_STAGE, addBtn);
}
private function addBtn (event:Event) : void {
this.x = _x;
this.y = _y;
this.name = _naam;
snd = new Sound(new URLRequest("mp3/" + _naam + ".mp3"));
addEventListener(MouseEvent.CLICK, playSnd);
}
private function playSnd (event:MouseEvent) : void {
cnl = snd.play();
}
}
}
所以我做的是为按钮添加到舞台时添加一个EventListener,然后设置所有变量,如x-position,y-position和name。
答案 0 :(得分:0)
那是因为继承。您的SpeakerBtn
不会继承祖先的addChild
方法,因为正如我们在SimpleButton
的{{3}}中看到的那样,它是DisplayObject
的继承者,而不是DisplayObjectContainer
的{{1}},其中包含documentation并将其传递给所有的继承人,包括MovieClip
和Persoon
。