0

私はオンライン スクリプト クラスのビデオ プレーヤーに取り組んでおり、ビデオの再生、再生、ミュート ボタンはすべて、正しいホバー状態とすべてで動作します。それらは正しく配置され、すぐに使用できます。次に、タイム スライダーとボリューム スライダーを作成する必要がありますが、ここで問題が発生します。VolumeBar という ActionScript 3 ファイルを作成しましたが、なぜ機能しないのかわかりません。私の頭ではうまくいくはずですが、何かが足りないと思います。

私のシンボルは、BTN_Slider、BTN_VolumeBar、および BTN_VolumeBarSlider です。私が行っていないフレーム内の「アクション」機能をすべて使用しているため、チュートリアルはどれも役に立ちません

主要

import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.media.SoundTransform;

public class Main extends Sprite
{
    static public var splash:SplashScreen;
    private var theXMLFile:String = "VideoList.xml";
    private var theVideoList:VideoList;
    private var videoChoice:int = 0;
    private var sndTransform:SoundTransform;
    private var lastVolume:int = 1;
    private var btn_Mute:BTN_Mute;
    private var btn_Play:BTN_Play;
    private var btn_Volume:VolumeBar;
    static public var screenState:int = 0;
    static public var nextState:int = 1;

    public function Main()
    {
        theVideoList = new VideoList(theXMLFile);
        btn_Mute = new BTN_Mute(581.3, 457.5);
        btn_Play = new BTN_Play(42, 457.5);
        btn_Volume = new VolumeBar(624.3, 457.5);
        btn_Mute.addEventListener(MouseEvent.CLICK, clickedMute);
        addEventListener(Event.ENTER_FRAME, update);
    }

    private function update(e:Event):void
    {
        switch(screenState)
        {
            case 0 :
                break;
            case 1 :
                videoChoice = 0;
                nextState = 2;
                displayScreen();
                trace("TEST");
                addChild(btn_Volume);
                addChild(btn_Mute);
                addChild(btn_Play);
                break;
            case 2 :
                videoChoice = 1;
                nextState = 3;
                changeScreen();
                break;
        }
        screenState = 0;
    }

    public function displayScreen():void
    {
        splash = new SplashScreen(theVideoList.videoXML.theVideo[videoChoice].fileLoc.text());
        addChild(splash);
    }

    public function changeScreen():void
    {
        var toShow:String = theVideoList.videoXML.theVideo[videoChoice].fileLoc.text();
        splash.connectVideo(toShow);
    }

    private function muteVolume(vol:Number):void
    {
        sndTransform = new SoundTransform(vol);
        splash.vidStream.soundTransform = sndTransform;
    }

    private function clickedMute(mb:MouseEvent):void
    {
        if(btn_Mute.isMuted == true)
        {
            muteVolume(lastVolume = 1);
            btn_Mute.isMuted = false;
        }
        else if(btn_Mute.isMuted == false)
        {
            muteVolume(lastVolume = 0);
            btn_Mute.isMuted = true;
        }
    }

    static public function togglePlay():void
    {
        splash.vidStream.togglePause();
    }
}

ボリュームバー

import flash.display.*;
import flash.events.*;
import flash.geom.Rectangle;

public class VolumeBar extends MovieClip
{
    var sliderControl = new BTN_Slider();
    var sliderVolume = new BTN_VolumeBar();
    var knobWidth:int = sliderControl.width;
    var trackWidth:int = sliderVolume.width;
    var trackX:int = sliderVolume.x;
    var boundWidth = trackWidth - knobWidth;
    var boundsRect:Rectangle = new Rectangle(trackX, 0, boundWidth, 0);

    public function VolumeBar(theX:int, theY:int)
    {
        this.x = theX;
        this.y = theY;

        sliderControl.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
        sliderControl.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
        sliderControl.addEventListener(MouseEvent.MOUSE_OUT, stopDragging);
    }

    private function startDragging(mb:MouseEvent):void
    {
        sliderControl.startDrag(false, boundsRect);
    }

    private function stopDragging(mb:MouseEvent):void
    {
        sliderControl.stopDrag();
    }
}

私が今知りたいのは、それを画面上に表示して基本的に動かす方法だけです。それができたら、残りは自分でできることがわかります。ありがとうスタックオーバーフロー!

4

1 に答える 1

0



sliderVolumesliderControlを表示リスト に追加するのを忘れていませんか?
次のようなことができると思います:

VolumeBar.as :

import flash.display.*;
import flash.events.*;
import flash.geom.Rectangle;

public class VolumeBar extends MovieClip
{
    var sliderControl = new BTN_Slider();
    var sliderVolume = new BTN_VolumeBar();
    var knobWidth:int = sliderControl.width;
    var trackWidth:int = sliderVolume.width;
    var trackX:int = sliderVolume.x;
    var boundWidth = trackWidth - knobWidth;
    var boundsRect:Rectangle = new Rectangle(trackX, 0, boundWidth, 0);

    /** a function to call when volume change **/ 
    private var _volumeChanged:Function;

    public function VolumeBar(theX:int, theY:int, volumeChanged:Function)
    {
        this.x = theX;
        this.y = theY;

                    // add the volume bar to the display list
        addChild( sliderVolume );
                    // add the slider to the display list
        addChild( sliderControl );
        // keep reference to the update function 
        _volumeChanged = volumeChanged;

        sliderControl.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
        sliderControl.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
        sliderControl.addEventListener(MouseEvent.MOUSE_OUT, stopDragging);
    }

    private function startDragging(mb:MouseEvent):void
    {
        sliderControl.startDrag(false, boundsRect);
        stage.addEventListener( MouseEvent.MOUSE_MOVE, _onMouseMove );
    }

    private function stopDragging(mb:MouseEvent):void
    {
        sliderControl.stopDrag();
        stage.removeEventListener( MouseEvent.MOUSE_MOVE );
    }

    private function onMouseMove(e:MouseEvent):void
    {
        // calculate the volume for the current cursor position
        var value:Number = (trackWidth - sliderControl.x) / boundWidth;
        _volumeChanged( value );
    }
}

Main クラスを次のように変更します。

public function Main()
{
    theVideoList = new VideoList(theXMLFile);
    btn_Mute = new BTN_Mute(581.3, 457.5);
    btn_Play = new BTN_Play(42, 457.5);

    // add the callback function to the VolumeBar constructor
    btn_Volume = new VolumeBar(624.3, 457.5, _onVolumeChanged);
    btn_Mute.addEventListener(MouseEvent.CLICK, clickedMute);
    addEventListener(Event.ENTER_FRAME, update);
}

/** handle volume changing **/
private function _onVolumeChanged( value:Number ):void
{
    // change your volume here
}

もちろん、イベントを使用してそれを行うこともできますが、私はコールバックを好みます。必要に応じて、mouseMove の代わりにドラッグの停止時に音量を変更できます。

これがお役に立てば幸いです:)

于 2013-11-11T09:41:10.623 に答える