2011-01-24 4 views
0

私は、Flash AS3でステージマウスの座標を取得し、カーソルの下の16進グリッドでタイルを返す関数を作成しています。私は関数がNaNを返すか、カーソルがタイル上になければundefinedを返し、そうであればオブジェクト配列内のそのタイルの整数インデックスを返します。Flash AS3:整数データ型の使用中に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; 
    } 

私はおそらく、このデータ型がNaNまたは未定義をサポートしていない、ほとんどの整数変数のためのuintを使用してきましたか?このコードは、tileIndexが定義された後に0をトレースします。 hexgridが正方形でなく、ランダムに生成されるため、私はhitTestを使用しています。タイル0が最初のタイルであり、カーソルがオフのときに0を返すと、16進マップが問題を引き起こします。

答えて

6

NaNはNumber型です。意味のある形でuintにキャストすることはできません。

実際にNaNを返さなければならない場合は、関数シグネチャを:Numberに戻しますが、その関数がクリティカルパス上にある場合は、パフォーマンスがわずかに低下する可能性があることを理解してください。

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

+0

+1すべての可能な答えをカバーするためには、この質問にあります:) – epologee

1

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

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

関連する問題