Flash AS3: Как вернуть NAN или неопределенное при использовании целочисленных данных?

StackOverflow https://stackoverflow.com/questions/4788611

Вопрос

Я работаю над функцией, которая выводит на сцену координаты мыши во 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;
    }

Я использовал UINT для большинства целочисленных переменных, возможно, этот тип данных не поддерживает NAN или неопределенные? Этот код прослеживает 0 после определения TileIndex. Я использую Hittest, потому что Hexgrid не квадратный и случайным образом генерируется. Плитка 0-это первая плитка и возвращение 0, когда курсор не выйдет из шестнадцатеричной карты, вызовет проблемы.

Это было полезно?

Решение

Нэн имеет типовой номер. Вы не можете разбить это в UINT.

Если вы действительно должны вернуть NAN, измените подпись функции на возврат :Number, но поймите, что вы можете получить небольшой штраф за производительность, если эта функция находится на вашем критическом пути.

Здесь можно использовать какую -то хитрость в C -стиле: если значимые индексы плитки всегда являются положительными, и вы уверены, что никогда не получите более 2 миллиардов плиток, вы можете вернуть -1, чтобы означать «не плитка». Вам нужно изменить :uint в :int, и будьте осторожны с неявными преобразованием между двумя типами на протяжении всего вашего кода.

Другие советы

Другой метос - использовать MAX_VALUE состояния UINT. На практике вы никогда не достигнете значения, но вы можете проверить это.

Предотвращает много кодового рефакторинга return uint.MAX_VALUE и проверить это if(value == uint.MAX_VALUE). Анкет Если он находится в цикле Enterframe, вы можете попытаться сохранить uint.max_value в const, чтобы вы не получили накладные расходы переменной в классе Uint.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top