получить доступ к мувиклипу на определенном кадре в массиве as3 - PullRequest
0 голосов
/ 03 апреля 2011

У меня есть мувиклип в массиве (newStep), который динамически добавляется на сцену. Это случайный выбор кадра для перехода при каждом добавлении экземпляра. Есть вложенный мувиклип (stepLine), который мне нужен, чтобы изменить альфа. Этот код на самом деле работает для добавления строки в динамическое текстовое поле (pointsDText), но когда я пытаюсь получить доступ к вложенному фрагменту ролика (stepLine), он дает мне 1009 ошибку ссылки на нулевой объект. Самое смешное, что код на самом деле работает и меняет альфа-фрагмент клипа, но я все еще получаю эту ошибку, и я думаю, что это делает мою игру более сложной. Я пытался использовать if (содержит (steps [r] .stepLine)) тоже, но это не работает. Есть ли лучший способ получить доступ к этому мувиклипу без ошибки?

if(newStep != null){
    for(var r:int = 0; r<steps.length;r++){
        if(steps[r].currentLabel == "points"){
            steps[r].pointsDText.text = String(hPoints);
        }
        if(steps[r].currentLabel == "special"){
            steps[r].stepLine.alpha = sStepAlpha;   
        }
        if(steps[r].currentLabel == "life"){
            steps[r].stepLine.alpha = hStepAlpha;
        }
    }
}

Это так сложно объяснить, но я надеюсь, что вы понимаете.

Большое спасибо.

1 Ответ

0 голосов
/ 03 апреля 2011

Ошибка нулевой ссылки возникает при попытке доступа к свойствам переменной, которая не указывает ни на один объект - нулевая ссылка. Вы эффективно пытаетесь получить доступ к объекту, который не существует. Например, возможно, stepLine не существует ни в одном из этих случаев, поэтому stepLine.alpha вызывает ошибку. (Как установить альфа несуществующего клипа?) Возможно, клип steps[r] находится на кадре, в котором еще нет stepLine MovieClip.

Вы должны запустить фильм в режиме отладки, нажав Ctrl + Shift + Enter в Flash IDE. Это должно показать вам точную линию, которая вызывает ошибку, и это позволит вам проверить значения любых переменных в этой точке. Это должно помочь вам отследить проблему. Точно так же вы можете использовать операторы трассировки для помощи в отладке. Например, вы можете trace(steps[r].stepLine); проверить наличие нулевых значений или даже просто if(!steps[r].stepLine) trace("ERROR");. Кроме того, если вы заключите свои обращения в операторы if, вы сможете избежать ошибок нулевой ссылки, даже если это не решает основную проблему:

if(newStep != null){
    for(var r:int = 0; r<steps.length;r++){
        // only touch things if the movieclip actually exists
        if(steps[r] && steps[r].stepLine){
            if(steps[r].currentLabel == "points"){
                steps[r].pointsDText.text = String(hPoints);
            }
            if(steps[r].currentLabel == "special"){
                steps[r].stepLine.alpha = sStepAlpha;   
            }
            if(steps[r].currentLabel == "life"){
                steps[r].stepLine.alpha = hStepAlpha;
            }
        }
    }
}
...