現在のプロジェクトを行っているときに、オブジェクトを移動するとすぐに、hitTestPoint の精度が 1 フレーム遅れることがわかりました。したがって、オブジェクト A がまったく新しい遠く離れた位置に移動した場合、そのオブジェクトに対して実行された hitTestPoint は false を返します。これを説明するために、最も基本的なロジックを使用して簡単な実験を行いました。
import flash.display.Sprite;
import flash.display.Graphics;
import flash.events.Event;
var me:Sprite = new Sprite();
var g:Graphics = me.graphics;
g.beginFill( 0xFF0000 );
g.drawRect( -10, -10, 20, 20 );
g.endFill();
addChild( me );
trace( "Hit test at (0,0) while object is at (" + me.x + "," + me.y + ") = " + me.hitTestPoint( 0, 0, true ) );
me.x = 300;
me.y = 300;
trace( "\n>>>>>>>>>> WHERE DID THE OBJECT GO? >>>>>>>>>>" );
trace( "Hit test at (0,0) while object is at (" + me.x + "," + me.y + ") = " + me.hitTestPoint( 0, 0, true ) );
trace( "Hit test at (150,150) while object is at (" + me.x + "," + me.y + ") = " + me.hitTestPoint( 150, 150, true ) );
trace( "Hit test at (300,300) while object is at (" + me.x + "," + me.y + ") = " + me.hitTestPoint( 300, 300, true ) );
trace( ">>>>>>>>>> WHERE DID THE OBJECT GO? >>>>>>>>>>\n" );
removeChild( me );
addChild( me );
trace( "After remove/addChild, hit test at (300,300) while object is at (" + me.x + "," + me.y + ") = " + me.hitTestPoint( 300, 300, true ) );
結果は次のとおりです。
Hit test at (0,0) while object is at (0,0) = true
>>>>>>>>>> WHERE DID THE OBJECT GO? >>>>>>>>>>
Hit test at (0,0) while object is at (300,300) = false
Hit test at (150,150) while object is at (300,300) = false
Hit test at (300,300) while object is at (300,300) = false
>>>>>>>>>> WHERE DID THE OBJECT GO? >>>>>>>>>>
After remove/addChild, hit test at (300,300) while object is at (300,300) = true
子を削除してステージに戻すと、 hitTestPoint が再び機能することがわかりました。しかし、hitTestPoint も次のフレームで機能します。
これまでに誰かがこれと同じことに遭遇しましたか?