Flash AS3: Comment puis-je retourner NaN ou non définie en utilisant des types de données entières?

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

Question

Je travaille sur une fonction qui prend les coordonnées de la souris sur scène en carreaux de Flash AS3 et retourne dans une grille hexagonale en dessous du curseur. Je veux que la fonction renvoie NaN ou indéfini si le curseur se trouve pas sur une tuile et si elle est, l'indice de nombre entier de la tuile dans une rangée d'objets.

    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;
    }

Je l'ai utilisé uint pour la plupart des variables entières, peut-être ce type de données ne supporte pas NaN ou indéfini? Ce code trace 0 après TILEINDEX est défini. J'utilise hitTest parce que le hexgrid n'est pas carré et est généré de façon aléatoire. Carrelage 0 est la première tuile et retourner 0 lorsque le curseur est hors-carte hexagonale va causer des problèmes.

Était-ce utile?

La solution

NaN est de type Number. Vous ne pouvez pas jeter de manière significative dans un uint.

Si vous devez vraiment retourner NaN, modifier votre signature à la fonction :Number de retour, mais comprenez que vous pourriez prendre une légère perte de performances pour elle si cette fonction est sur votre chemin critique.

ruser style C pourrait être utilisé ici: Si les index de tuiles significatifs sont toujours positifs, et vous vous sentez confiant que vous ne serez pas finir jamais avec plus de 2 milliards de tuiles, vous pourriez revenir -1 à dire « pas une tuile ». Vous auriez besoin de changer :uint en :int, et soyez prudent sur les conversions implicites entre les deux types tout au long de votre code.

Autres conseils

Une autre methos est d'utiliser le MAX_VALUE de l'état uint. En pratique, vous ne serez jamais atteindre la valeur, mais vous pouvez vérifier contre.

Evite beaucoup de code refactoring return uint.MAX_VALUE et pour vérifier contre if(value == uint.MAX_VALUE). Si elle est dans une boucle de enterFrame vous pouvez essayer de sauver uint.MAX_VALUE dans un const afin de ne pas les frais généraux de la recherche variable dans la classe uint.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top