2016-08-16 9 views
0

私はペイントゲームに取り組んでいます。ブラシをクリックすると、ブラシのグラフィカルな部分にマウスが切り替わり、画面にペイントすることができます。ブラシが選択されていない場合、マウスは同じままです。クリック時の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(); 
    } 
} 

各ブラシは、それに関連付けられたブール変数有する:小、中、HugeSelected1を、そのようので、I 1つが選択されていて、1つが選択されていないコードでいつでも伝えることができます。

このコードを実行すると、最初は何も起こりませんが、いずれかのブラシをクリックすると、出力にポップアップが表示されます。

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)nullであることをかなり明確言います。デフォルト値が割り当てられておらず、条件に "else"部分がないため、これらの条件が真でない場合、coursor_mcは未割り当てのままになります。 if-else条件ブロックを編集するか、デフォルト値を割り当てることをお勧めします。 – Nbooo

+0

また、条件にカンマを付けると、最後の式だけがチェックされます。 – Nbooo

+0

ご返信ありがとうございます。 代わりにifを区切り、 'new MovieClip()'を 'cursor_mc'に割り当てました。 しかし、今は別のエラーが出ています。 'エラー#2025:提供されたDisplayObjectは、呼び出し元の子でなければなりません。 visibilityToggle/moveCursor(では、flash.display ::のDisplayObjectContainer/setChildIndex() \t)で \t [visibilityToggle ::フレーム1:53] ' – TwistedRaven

答えて

0

あなたの最初の投稿に投稿したエラーについて - このようなエラーは、あなたが扱うオブジェクトがヌルである、つまり初期化されていないか、すでに破棄されている場合に発生します。通常、このエラーはNPE(nullポインタ例外)に一般化されます。このようなエラーが発生した場合は、すべてのオブジェクトが存在するかどうかを確認する必要があります。

2番目のエラーは、cursor_mcに親クリップがない(ステージに追加されていない)か、親オブジェクトがsetChildIndexと同じオブジェクトではないために発生します。私は読むことをお勧めしますthis doc

2番目の問題を解決するには、親クリップが実際に存在するかどうかを確認します。また、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(); 
    } 
} 
+0

私は変更を加えました。 ||の代わりに&&を追加if文に追加します。 cursor_mcをステージに追加しても、まだ隠れています。わかりません。 また、if文をコメントアウトし、テスト目的でカーソルをcursor1に命名すると、それをマウスとして追加しますが、Rectangleにペイントしません。 – TwistedRaven

+0

おそらく、cursor_mcイベントをキャプチャします。これを無効にしてみてください。 'cursor_mc.mouseChildren = cursor_mc.mouseEnabled = false;' – Nbooo

+0

ifとコメントしたyupは、描画なしの状況を修正しました。これまでのあなたの偉大な助けをありがとう、あなたは命の恩人でした。 しかし、コメントしていない場合でもそれが表示されないという問題は依然として問題です。 :/ – TwistedRaven

関連する問題