Flash AS3:整数データ型の使用中にNANまたは未定義を返すにはどうすればよいですか?
-
24-10-2019 - |
質問
Flash AS3のステージマウス座標を取得し、カーソルの下の16進グリッドでタイルを返す関数に取り組んでいます。カーソルがタイル上にない場合、およびそれがそのタイルの整数インデックスがオブジェクト配列にある場合、機能をNANまたは未定義にしてください。
public function getCursorTile(mX:Number,mY:Number):uint
{
var tileIndex:uint = new uint(NaN);
trace(tileIndex);
for (i=0; i<tileArray.length; i++)
{
if (tileArray[i].hitTestPoint(mX,mY,true))
{
tileArray[i].tileBorder.gotoAndStop(1);
tileIndex = i;
}
}
return tileIndex;
}
私はほとんどの整数変数にUINTを使用していますが、おそらくこのデータ型はNANをサポートしていないか、未定義ですか?このコードは、TileIndexが定義された後に0を追跡します。 Hexgridが正方形ではなく、ランダムに生成されているため、私は最もhittestを使用しています。タイル0は最初のタイルであり、カーソルがヘックスマップから外れているときに0を返します。
解決
ナンはタイプ数です。有意義にuintにキャストすることはできません。
本当にnanを返さなければならない場合は、関数の署名を変更して戻ります :Number
, 、しかし、その機能があなたの重要なパスにある場合、あなたはそれに対してわずかなパフォーマンスのペナルティを取るかもしれないことを理解してください。
ここでは、いくつかのCスタイルのトリックを使用できます。意味のあるタイルインデックスが常に正であり、20億個以上のタイルに終わることはないと確信している場合、-1を「タイルではない」という意味に戻すことができます。変更する必要があります :uint
の中へ :int
, 、そして、コード全体の2つのタイプ間の暗黙の変換に注意してください。
他のヒント
もう1つのメソスは、UINT状態のMAX_Valueを使用することです。実際には、値に達することはありませんが、それに反して確認できます。
多くのコードリファクタリングを防ぎます return uint.MAX_VALUE
そしてそれに反対する if(value == uint.MAX_VALUE)
. 。 Enterframeループにある場合は、constでuint.max_valueを保存して、uintクラス内の変数ルックアップのオーバーヘッドを取得できないようにすることができます。