Пользовательский курсор AS3 по щелчку

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

Прямоугольник и кисти находятся в отдельном мувиклипе, что позволяет мне накладывать на него линии PNG, чтобы вы могли заполнять и рисовать.

В слое действий в Сцене 1 это мой код для смены мыши:

var cursor_mc:MovieClip;

if (CanvPark_mc.HugeSelected1 == true){
    cursor_mc = cursor1_mc;
}else if(CanvPark_mc.MediumSelected1 == true) {
    cursor_mc = cursor2_mc;
}else if(CanvPark_mc.SmallSelected1 == true) {
    cursor_mc = cursor3_mc;
}


stage.addEventListener(MouseEvent.MOUSE_MOVE,moveCursor);    
function moveCursor(myEvent:MouseEvent) { 
    if(CanvPark_mc.SmallSelected1 == false, CanvPark_mc.MediumSelected1 == false, CanvPark_mc.HugeSelected1 == false)
    { Mouse.cursor="auto";
    }else{
    setChildIndex(cursor_mc, this.numChildren-1);
    cursor_mc.x = (mouseX); 
    cursor_mc.y = (mouseY); 
    Mouse.hide();  
    }
}

Каждая кисть имеет связанную с ней логическую переменную: Small, Medium и HugeSelected1, поэтому я всегда могу сказать в коде, какая из них выбрана, а какая нет.

Прямо сейчас, запуская этот код, в начале ничего не происходит, но если я щелкну любую из кистей, это появится в выводе.

TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/setChildIndex()
    at visibilityToggle/moveCursor()[visibilityToggle::frame1:42]

Кажется, указывает конкретно на

 setChildIndex(cursor_mc, this.numChildren-1);

Я честно не знаю, что вызывает эту ошибку. Я думал, что будет так просто изменить курсор мыши.

Как я могу это исправить?


person TwistedRaven    schedule 16.08.2016    source источник
comment
Что ж, в тексте ошибки ясно сказано, что ваш дочерний муви-клип имеет значение null (я имею в виду cursor_mc). У вас нет назначенного ему значения по умолчанию, и ваше условие не имеет части else, поэтому, если ни одно из этих условий не выполняется, coursor_mc останется неназначенным. Я предлагаю либо отредактировать блок условий if-else, либо присвоить какое-то значение по умолчанию.   -  person Nbooo    schedule 16.08.2016
comment
Кроме того, с запятой в вашем условии будет проверено только последнее выражение.   -  person Nbooo    schedule 16.08.2016
comment
Спасибо за ваш ответ. Вместо этого повернул их для разделения if и назначил new MovieClip() на cursor_mc. Но прямо сейчас это дает мне другую ошибку. Error #2025: The supplied DisplayObject must be a child of the caller. at flash.display::DisplayObjectContainer/setChildIndex() at visibilityToggle/moveCursor()[visibilityToggle::frame1:53]   -  person TwistedRaven    schedule 16.08.2016
comment
Эта ошибка означает, что объект, который вы вызываете setChildIndex, не является родителем для cursor_mc. В общем, вы можете сделать что-то вроде этого, чтобы избежать этой ошибки: const theParent:DisplayObjectConatiner = cursor_mc ? cursor_mc.parent : null; if (theParent) { theParent.setChildIndex(cursor_mc, theParent.numChildren - 1) }   -  person Nbooo    schedule 16.08.2016
comment
Редактировать. Отформатировал код. Вставка возникла с проблемами. Она работает и позволяет мне рисовать на прямоугольнике, НО мышь скрыта. На самом деле не заменяется мувиклипами курсора, которые я создал и которые находятся за пределами сцены. Есть идеи, почему?   -  person TwistedRaven    schedule 16.08.2016
comment
Я предполагаю, что вы не добавили cursor_mc на сцену. По крайней мере, я не вижу никакого связанного кода в вопросе.   -  person Nbooo    schedule 16.08.2016


Ответы (1)


Что касается ошибки, которую вы разместили в своем первом сообщении - такая ошибка возникает, когда какой-то объект, с которым вы работаете, является нулевым, то есть не инициализирован или уже уничтожен. Ошибка обычно обобщается на NPE (исключение нулевого указателя). Когда возникает такая ошибка, вы должны проверить, существуют ли все ваши объекты.

Вторая ошибка возникает из-за того, что у вашего cursor_mc нет родительского клипа (т. е. он не был добавлен на сцену) или родительский объект не является тем же объектом, который вы называете setChildIndex. Я предлагаю прочитать этот документ

Чтобы решить вторую проблему, вы можете проверить, действительно ли существует родительский клип. Кроме того, имейте в виду, что если вы переназначили значение cursor_mc, вам нужно снова добавить его на сцену и, возможно, вы захотите удалить предыдущий клип со сцены (при условии, что cursor1_mc, cursor2_mc, cursor3_mc не находятся на сцене).

Вот грубый пример:

var cursor_mc:MovieClip;

if (CanvPark_mc.HugeSelected1 == true){
    cursor_mc = cursor1_mc;
}else if(CanvPark_mc.MediumSelected1 == true) {
    cursor_mc = cursor2_mc;
}else if(CanvPark_mc.SmallSelected1 == true) {
    cursor_mc = cursor3_mc;
}


stage.addEventListener(MouseEvent.MOUSE_MOVE,moveCursor); 

function moveCursor(myEvent:MouseEvent) { 
    if(CanvPark_mc.SmallSelected1 == false && CanvPark_mc.MediumSelected1 == false && CanvPark_mc.HugeSelected1 == false)
    {
        Mouse.cursor="auto";
    }
    else if (cursor_mc)
    {
        addChild(cursor_mc);
        setChildIndex(cursor_mc, this.numChildren-1);
        cursor_mc.x = (mouseX); 
        cursor_mc.y = (mouseY); 
        Mouse.hide();  
    }
}
person Nbooo    schedule 16.08.2016
comment
Я сделал изменение. Добавлено && вместо || к оператору if. Даже после добавления cursor_mc на сцену он все равно скрывается. Я не понимаю. Кроме того, закомментировав оператор if и присвоив курсору имя cursor1 для целей тестирования, он добавляет его как мышь, но он вообще не будет рисовать на прямоугольнике... - person TwistedRaven; 16.08.2016
comment
возможно, это происходит из-за того, что cursor_mc фиксирует событие. Попробуйте отключить его: cursor_mc.mouseChildren = cursor_mc.mouseEnabled = false; - person Nbooo; 16.08.2016
comment
С комментарием if, да, это исправило ситуацию с отсутствием рисования. Спасибо за всю вашу огромную помощь до сих пор, вы спасли жизни. Но вопрос о том, что он вообще не отображается с if not comment, по-прежнему остается проблемой. :/ - person TwistedRaven; 16.08.2016
comment
Думаете, он не получает переменные прямо в начальных операторах if? Я имею в виду, что cursor_mc не присутствует на сцене, он полностью создан кодом. Редактировать: изменил начальный оператор перед if с var cursor_mc: MovieClip = new MovieClip(); на var cursor_mc: MovieClip = cursor1_mc; и сразу же читает его. Я думаю проблема именно в этом. Я понятия не имею, как определить это по-другому. - person TwistedRaven; 16.08.2016