Устранение ошибки 1069 между дочерним объектом и родительской функцией - PullRequest
0 голосов
/ 01 июля 2011

Я сократил примеры кода ниже, чтобы они были более читабельными. Вот в чем проблема: я создаю целую кучу мувиклипов, содержащих буквы a-z. Эти мувиклипы являются дочерними для родительского мувиклипа, называемого «levelTwo», где levelTwo является своего рода логическим менеджером уровня.

Когда их нажимают, они отправляют некоторые данные на levelTwo для оценки (это Hangman). Проблема в том, что при нажатии я получаю ошибку 1069. Это было 1061 ошибка, пока я не добавил бит event.target.parent в LetterButton.

Вот соответствующий код:

package  {
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;

public class LetterButton extends MovieClip {

    var buttonText:String;

    public function LetterButton(lText:String,objX:int,objY:int) 
    {
        trace ("Creating new button");
        x = objX;
        y = objY;
        buttonText = lText;
        letterText.text = buttonText;
        this.stop();
        addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
        addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
        this.addEventListener(MouseEvent.CLICK,onMouseClick);
    }

    private function onMouseOver(event:Event):void
    {
        gotoAndStop(2);
        letterText.text = buttonText;
        //trace ("You're over me and my text is " + buttonText);
    }

    private function onMouseOut(event:Event):void
    {
        gotoAndStop(1);
        letterText.text = buttonText;
        //trace ("You're out of me and my text is " + buttonText);
    }

    private function onMouseClick(event:Event):void
    {
        trace ("I am clicked and I am " + buttonText);
        event.target.parent.checkGuess(buttonText);

    }

}

} И соответствующий бит от levelTwo:

public function checkGuess(guess:String):void
    { //Check to see if the guess matches the string


        trace ("Guess: "+guess);
        for(var i:int=0;i<answer.length;i++)
            {
                if(guess == answer.charAt(i))
                {
                    censoredAnswer[i] = guess;
                    trace ("Got one right");
                    answerField.text = answerRedisplay(); //Do it now or it won't update for the check
                }
            }   
        if (answerField.text == answer)
            {
                setWin(); 
            }
    }

1 Ответ

0 голосов
/ 01 июля 2011

Я не вижу здесь магии.Вы подписываетесь на экземпляр LetterButton, поэтому вы получаете ссылку на event.target, указывающую на него.

Я думаю, что лучшим подходом было бы подписаться на родительский клип, который содержит все экземпляры LetterButton.MouseEvent.CLICK - это всплывающее событие, поэтому каждый раз, когда в нем что-то щелкает, родительский элемент запускается обработчиком.

См. Пример кода.

// inside level two class
addEventListener(MouseEvent.CLICK,onMouseClick);

private function onMouseClick(event:MouseEvent):void
{
    var target:LetterButton = event.target as LetterButton;
    if (target == null) {
        return;
    }
    // here we know, that some LetterButton instance was clicked
    // and target var holds it's reference

    // either make buttonText public, or create a getter/accessor
    // var text:String = target.buttonText;
    var text:String = target.getButtonTextSomehow();

    checkGuess(text);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...