2

3つのムービークリップがすべてステージにリンクされていて、ボタンのように動作させたい/しかし、各部分(上、上、下、ヒット)をアニメーション化する方法が見つからないため、ボタンを使用していません。マウスを使用しているときに変更するだけではありません。これまでのところ、3つすべてをステージに表示して、マウスを置いたときとクリックしたときに表示することができましたが、removeChildで何か問題が発生していると思います。各MCは一度に1つずつ表示され、カーソルを合わせて「点滅」しているように見えると、3つすべてが表示されます。これが私のコードです:

var mainMoon:swayingMoon = new swayingMoon();
mainMoon.x = 50;
mainMoon.y = 10;
addChild(mainMoon);

var hoverMoon:glowMoon = new glowMoon();
hoverMoon.x = 50;
hoverMoon.y = 10;

var movieMoon:clickedMoon = new clickedMoon();
movieMoon.x = 50;
movieMoon.y = 10;

mainMoon.addEventListener(MouseEvent.ROLL_OVER, showHoverMoon);
mainMoon.addEventListener(MouseEvent.ROLL_OUT, hideHoverMoon);
hoverMoon.addEventListener(MouseEvent.CLICK, startMovieMoon)
function showHoverMoon(event:MouseEvent):void
{
 addChild(hoverMoon);

}
function hideHoverMoon(event:MouseEvent):void
{
removeChild(hoverMoon)
}
function startMovieMoon(event:MouseEvent):void
{
addChild(movieMoon);
}
4

3 に答える 3

0

3つの月の状態を個別のMovieClipにカプセル化して、すべての月の満ち欠けを自動的に制御する必要があると思います。すでにそうなら、大丈夫です。このようなMovieClip-Buttonタイプのオブジェクトの一般的な原則は、リスナーがそのボタンの一部ではなく、親インスタンスに割り当てられることです。

public class Moon extends Sprite {
    private var upState:swayingMoon=new swayingMoon();
    private var overState:glowMoon=new glowMoon();
    private var downState:clickedMoon=new clickedMoon();
    private var areWeClicked:Boolean;
    private var areWeOver:Boolean;
    public function Moon() {
        areWeClicked=false;
        areWeOver=false;
        addChild(upState);
        addEventListener(MouseEvent.ROLL_OVER, showHoverMoon);
        addEventListener(MouseEvent.ROLL_OUT, hideHoverMoon);
        addEventListener(MouseEvent.CLICK, showClickedMoon);
        addEventListener(Event.COMPLETE, hideClickedMoon);
    }
    private function showHoverMoon(e:MouseEvent):void {
        areWeOver=true;
        if (areWeClicked) return;
        removeChild(upState);
        addChild(overState);
    }
    private function hideHoverMoon(e:MouseEvent):void {
        areWeOver=false;
        if (areWeClicked) return;
        removeChild(overState);
        addChild(upState);
    }
    private function showClickedMoon(e:MouseEvent):void {
        if (areWeClicked) {
            downState.gotoAndPlay(1);
            return;
        }
        if (overState.parent) removeChild(overState); else removeChild(upState);
        addChild(downState);
        downState.gotoAndPlay(1); // your clicked moon seems to be a playing MC, so starting it over
        areWeClicked=true;
    }
    private function hideClickedMoon(e:Event):void {
        if (e.target!=downState) return; // not our event
        if (!areWeClicked) return;
        areWeClicked=false;
        removeChild(downState);
        if (areWeOver) addChild(overState); else addChild(upState);
    }
}

これで、親クラスが何がいつ発生するかを制御します。clickedMoon私は、あなたのMCが完全に1回だけプレイしEvent.COMPLETEてから、それ自体にイベントをディスパッチして、その親が通知を受けて行動することを想定していました。

元々、イベントリスナー構造により、mainMoonMCを非表示にできませんでした。そうしないと、他のリスナーが動作しなくなり、親オブジェクトを使用してイベントをリッスンし、月の一部を安全に削除できます。

于 2012-12-10T09:24:08.807 に答える
0

物事が不必要に複雑になる可能性があるため、この方法はお勧めしません。1 つのボタンの場合、ムービー クリップ/スプライトの数が 3 倍になり、子イベント ハンドラーの追加/削除、およびチェック/デバッグするその他の変数があります。これに、あなたが持っているボタンの数を掛けます。

代わりに、SimpleButton{} クラスを使用または拡張するか、独自のクラスを作成して動作をカプセル化することをお勧めします。

SimpleButton クラス: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/SimpleButton.html

于 2012-12-10T09:16:22.333 に答える
0
Just for a custom button you are going too much complex way. one movieClip is enough for create the button. First create a movieClip and inside that movieClip's timeline create two more frame for 'hover' and click effect. here is little bit of code to start.


var myButton_btn:CustomButton = new CustomButton();
addChild(myButton_btn);
myButton_btn.x = 100;
myButton_btn.y = 100;

myButton_btn.addEventListener(MouseEvent.ROLL_OVER, onOver);
myButton_btn.addEventListener(MouseEvent.ROLL_OUT, onOut);
myButton_btn.addEventListener(MouseEvent.CLICK, onClick);

function onOver(event:MouseEvent):void {
    //trace('over');
    event.target.gotoAndStop('hover');
}

function onOut(event:MouseEvent):void {
    //trace('normal');
    event.target.gotoAndStop('normal');
}

function onClick(event:MouseEvent):void {
    //trace('click');
    event.target.gotoAndStop('click');

}
于 2012-12-10T10:10:40.417 に答える