0

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またはundefinedをサポートしていませんか?このコードは、tileIndexが定義された後に0をトレースします。hexgridは正方形ではなく、ランダムに生成されるため、hitTestを使用しています。タイル0は最初のタイルであり、カーソルが16進マップから外れているときに0を返すと、問題が発生します。

4

2 に答える 2

6

NaNのタイプはNumberです。それを意味のある形でuintにキャストすることはできません。

本当にNaNを返す必要がある場合は、関数のシグネチャをreturnに変更します:Numberが、その関数がクリティカルパス上にある場合は、パフォーマンスがわずかに低下する可能性があることを理解してください。

ここでは、Cスタイルのトリックを使用できます。意味のあるタイルインデックスが常に正であり、20億タイルを超えることはないと確信している場合は、-1を返して「タイルではない」ことを意味します。に変更する必要があり、コード全体で2つのタイプ間の暗黙的な変換に注意する必要があり:uintます:int

于 2011-01-25T00:05:53.293 に答える
1

もう1つの方法は、uint状態のMAX_VALUEを使用することです。実際には、値に達することはありませんが、それに対してチェックすることはできます。

多くのコードリファクタリングを防ぎ、return uint.MAX_VALUEそれをチェックしますif(value == uint.MAX_VALUE)。それがenterframeループ内にある場合は、uint.MAX_VALUEをconstに保存して、uintクラス内の変数ルックアップのオーバーヘッドを取得しないようにすることができます。

于 2011-01-25T21:37:42.567 に答える