AS3 自定义光标点击

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();  
    }
}

每个画笔都有一个关联的布尔变量: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);

老实说,我不知道是什么导致了这个错误。我以为更改我的鼠标光标会这么简单。

我该如何解决这个问题?

关于您在第一个 post 中输入的错误 post - 当您使用的某些对象为 null,即未初始化或已经销毁时,会发生此类错误。该错误通常归纳为 NPE(空指针异常)。发生此类错误时,您应该检查所有对象是否存在。

第二个错误是因为您的 cursor_mc 没有父剪辑(即它没有添加到舞台)或父对象与您调用 setChildIndex 的对象不同。我建议阅读 this doc

要解决第二个问题,您可以检查父剪辑是否确实存在。另外,请记住,如果您重新分配了 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();  
    }
}