Как я могу использовать параметр функции для ссылки на переменную?

Извините, если этот вопрос немного расплывчат, но в последнее время это сводит меня с ума. В этом нет ничего сложного, но все, что я хочу сделать, - это повлиять на переменную targetVariable формулой. Фактическая проблема заключается в том факте, что указанная переменная, являющаяся в этом случае " masterVolume ", не зависит от формулы, а скорее вместо " targetVariable ". Я запускаю функцию " makeSlider " в нижней части скрипта. Вот код:


var masterVolume:Number = 0;
var panning:Number = 0;

function makeSlider(sliderType, X, Y, targetVariable) {

    var sliderHandle:MovieClip = new sliderType();

    addChild(sliderHandle);
    sliderHandle.x = X;
    sliderHandle.y = Y;

    var dragging:Boolean = false;

    stage.addEventListener(Event.ENTER_FRAME, updateSlider);

    function updateSlider(e:Event):void {
        panning = (mouseX/(stage.stageWidth/2))-1;

        targetVariable = ((sliderHandle.x-bar.x)/bar.width);

        output.text = masterVolume.toString();
        if (dragging == true && mouseX >= bar.x && mouseX <= (bar.x + bar.width)) {
            sliderHandle.x = mouseX;
        }
    }
    sliderHandle.addEventListener(MouseEvent.MOUSE_DOWN, beginDrag);

    function beginDrag(e:MouseEvent):void {
        dragging = true;
    }

    stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);

    function endDrag(e:MouseEvent):void {
        dragging = false;
    }
}

function playSound(target, intensity:Number, pan:Number) {
    var sound:Sound = new target();
    var transformer:SoundTransform = new SoundTransform(intensity, pan);
    var channel:SoundChannel = new SoundChannel();

    channel=sound.play();

    channel.soundTransform = transformer;
}

stage.addEventListener(MouseEvent.MOUSE_DOWN, make);

function make(e:MouseEvent):void {
    playSound(test, masterVolume, panning);
}

makeSlider(SliderHandle, bar.x, bar.y, masterVolume);

1 ответ

Итак, я изучил класс Object и обнаружил, что могу ссылаться на переменную, сделав ее объектом в функции. Вот обновленный рабочий скрипт:

var panning:Number = 0;
var masterVolume:Number = 0;

function makeSlider(sliderType, barType, soundType, hitBoxScale:Number, X, Y, targetVariable) {

    var reference:Object = { targetVariable: 0 };

    var slider:MovieClip = new sliderType;
    var newBar:MovieClip = new barType;

    addChild(newBar);
    newBar.x = X;
    newBar.y = Y;
    addChild(slider);
    slider.x = X;
    slider.y = Y;

    var dragging:Boolean = false;

    stage.addEventListener(Event.ENTER_FRAME, updateSlider);

    function updateSlider(e:Event):void {
        panning = (mouseX/(stage.stageWidth/2))-1;
        reference.targetVariable = (slider.x-newBar.x)/newBar.width;
        if (dragging == true && mouseX >= newBar.x && mouseX <= (newBar.x + newBar.width)) {
            slider.x = mouseX;
        }
        if (reference.targetVariable <= 0.01) {
            output.text = ("None");
        }
        if (reference.targetVariable >= 0.99) {
            output.text = ("Max");
        }
        if (reference.targetVariable > 0.01 && reference.targetVariable < 0.99) {
            output.text = (Math.round((reference.targetVariable*100))+"%").toString();
        }
    }
    stage.addEventListener(MouseEvent.MOUSE_DOWN, beginDrag);

    function beginDrag(e:MouseEvent):void {
        if (mouseY >= newBar.y-hitBoxScale && mouseY <= (newBar.y + newBar.height)+hitBoxScale) {
            dragging = true;
        }
    }
    slider.addEventListener(MouseEvent.MOUSE_DOWN, beginDragFromSlider);

    function beginDragFromSlider(e:MouseEvent):void {
        dragging = true;
    }

    stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);

    function endDrag(e:MouseEvent):void {
        if (dragging == true) {
            playSound(soundType, reference.targetVariable, 0);
        }
        dragging = false;
    }
    stage.addEventListener(MouseEvent.MOUSE_DOWN, make);

    function make(e:MouseEvent):void {
        if (dragging == false) {
            playSound(test, reference.targetVariable, panning);
        }
    }
}

function playSound(target, intensity:Number, pan:Number) {
    var sound:Sound = new target();
    var transformer:SoundTransform = new SoundTransform(intensity, pan);
    var channel:SoundChannel = new SoundChannel();

    channel=sound.play();

    channel.soundTransform = transformer;
}

makeSlider(defaultSlider, defaultBar, volumeIndicator, 10, 134, 211, masterVolume);
Другие вопросы по тегам