2016-08-16 2 views
0

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

Прямоугольник и кисти находятся на отдельном Movieclip, который позволяет мне накладывать на него линии 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(); 
    } 
} 

Каждая щетка имеет логическую переменную, связанную с ней: малые, средние и 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); 

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

Как это исправить?

+0

Ну, текст ошибки говорит довольно ясно, что ваш ребенок клип является недействительным (cursor_mc я имею в виду). У вас нет назначенного ему значения по умолчанию, и ваше условие не имеет части «else», поэтому, если ни одно из этих условий не является истинным, coursor_mc останется неназначенным. Я предлагаю либо отредактировать блок условий if-else, либо присвоить значение по умолчанию. – Nbooo

+0

Кроме того, с запятой в вашем состоянии будет проверено только последнее выражение. – Nbooo

+0

Благодарим вас за ответ. Включил их, чтобы отделить if's и назначил 'new MovieClip()' to 'cursor_mc'. Но прямо сейчас это дает мне еще одну ошибку. 'Ошибка # 2025: поставляемый DisplayObject должен быть дочерним элементом вызывающего. \t в flash.display :: DisplayObjectContainer/setChildIndex() \t в visibilityToggle/moveCursor() [visibilityToggle :: frame1: 53] ' – TwistedRaven

ответ

0

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

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

Чтобы решить вторую проблему, вы можете проверить, действительно ли родительский клип существует. Также имейте в виду, что если вы переназначили значение cursor_mc, вам нужно снова добавить его на сцену и, возможно, вы хотите удалить предыдущий клип со сцены (при условии, что курсор1_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(); 
    } 
} 
+0

Я внес изменения. Добавлено && вместо || к выражению if. Даже после добавления cursor_mc на сцену, он все еще скрывается. Я не понимаю. Кроме того, комментируя инструкцию if и называя курсор курсором1 для тестирования, он добавляет его как мышь, но он не будет рисовать на Rectangle вообще ... – TwistedRaven

+0

возможно, это происходит потому, что cursor_mc захватывает событие. Попробуйте отключить его: 'cursor_mc.mouseChildren = cursor_mc.mouseEnabled = false;' – Nbooo

+0

С комментарием if, который фиксировал ситуацию без рисования. Спасибо вам за всю вашу огромную помощь до сих пор, вы были спасателем жизни. Но вопрос о том, что он вообще не отображается, если не прокомментирован, все еще проблема. :/ – TwistedRaven