私は最近、actionscript 3 のカスタム クラスを発見しました。最新のプロジェクトでそれらを使い始めましたが、すべてがどのように機能するかについて頭を悩ませるのは難しいと感じています。
テスト用に 2 つの異なるクラスを作成しました。
1 つは「Person」という拡張ムービークリップで、もう 1 つは「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: Call to a possible undefined method addChild through a reference with static type SpeakerBtn が発生するためです。
x と y を定義し、main で SpeakerBtn の addChild を定義すると、機能することに気付きました。しかし、Main ですべてを定義する必要はありません。SpeakerBtn ですべてを定義したいと考えています。
この質問を確認しましたが、回答がありません。誰かが私に何が起こっているのかを説明してくれますか、それとも分かりやすいチュートリアル (私が 5 歳のときのように私に説明するようなもので、技術的な話に重すぎないもの) に私をリンクしてもらえますか? ありがとう!
更新
SpeakerBtn クラスのボタンをライブラリに追加するのを忘れていたため、表示するものは何もありませんでした。現在、このコードではボタンがステージに表示されますが、x と y の値のみが登録されておらず、0,0 に表示されることが修正されました。また、イベントplaySndはトレースをトリガーせず、機能していないと思います。
ソリューション Cherniv の情報を利用して、SpeakerBtn の次のソリューションにたどり着きました。
メインはこれを行います:
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 位置、y 位置、名前などのすべての変数を設定しました。