解決済み(私は思う、編集を参照)
displayObject の親が local3DToGlobal を呼び出した後、hitTestPoint は false のみを返します。座標が正しいことがわかったので、親にそれを呼び出してもらいました(理由がわからない、http://actionscript.org/forums/showthread.php3?t=190115からのアイデア)何かアイデアはありますか?
import flash.display.Shape;
import flash.geom.Point;
var circle:Shape = new Shape();
circle.graphics.beginFill(0x0000FF);
circle.graphics.drawCircle(40, 40, 40);
circle.z= 30;
addChild(circle);
stage.addEventListener(KeyboardEvent.KEY_UP, checkIt);
function checkIt(e:Event){
trace(circle.hitTestPoint(40,40,true));
var pos3D= new Vector3D(circle.x,circle.y,circle.z);
var globalLoc;
//This line doesn't break hitTestPoint, but it doesn't give the correct
//global x,y projected coordinates of the circle
globalLoc=circle.local3DToGlobal(pos3D);
trace (globalLoc);
//This line breaks the hitTest but is the only way I can get the correct
//global x,y projected coordinates of the circle.
globalLoc=circle.parent.local3DToGlobal(pos3D)
trace (globalLoc);
trace(circle.hitTestPoint(40,40,true));
}
stop();
編集: 何か奇妙なものを見たいですか? サークル用のコンテナを追加しました。次に、チェックを 2 回行います (任意のキーを 2 回押します):
真実
false (前回同様)
本当(OK、より良い)
本当(変)
真実 (...)
真実 (...?)
import flash.display.Shape;
import flash.geom.Point;
import flash.display.MovieClip;
var circle:Shape = new Shape();
circle.graphics.beginFill(0x0000FF);
circle.graphics.drawCircle(40, 40, 40);
circle.z= 30;
var cont = new MovieClip();
addChild(cont);
cont.addChild(circle);
stage.addEventListener(KeyboardEvent.KEY_UP, checkIt);
function checkIt(e:Event){
trace(circle.hitTestPoint(40,40,true));
var pos3D= new Vector3D(circle.x,circle.y,circle.z);
var globalLoc;
//This line doesn't break hitTestPoint, but it doesn't give the correct
//global x,y projected coordinates of the circle
globalLoc=circle.local3DToGlobal(pos3D);
trace (globalLoc);
//This line breaks the hitTest but is the only way I can get the correct
//global x,y projected coordinates of the circle.
globalLoc=circle.parent.local3DToGlobal(pos3D)
trace (globalLoc);
trace(circle.hitTestPoint(40,40,true));
}
stop();
編集:私が思う解決策:
関数の外で pos3D と globalLoc を宣言する
と
丸を容器に入れます。
申し訳ありませんが、例の固定コードはありません。完全なプロジェクトに実装しただけです。
奇妙なもの、AS3。