2013-08-04 2 views
0

Récemment, j'ai travaillé sur un jeu en Flash, en utilisant le programme Flash Builder et le moteur Flixel. Je rencontre un étrange problème, l'une des premières choses à exécuter est un analyseur que j'ai créé pour créer l'écran pour chaque niveau basé sur un tableau 2D dans un fichier .txt, et pour une raison quelconque, la lettre finale de chaque ligne est ignoré dans l'instruction switch qui décide de ce que signifie cet index.Conditions du commutateur AS3 ignorées

C'est la partie que je vais avoir des problèmes avec (ce qui se passe dans chaque état est hors de propos, je viens de quitter dans pour le contexte, mais ils se comportent tous correctement):

var row:int; 
var column:int; 
var currentColor:int = 0; 
for (row = 0; row < m_levelData.length; row++) { 
    for (column = 0; column < m_levelData[0].length; column++) { 
     var offset:FlxPoint = new FlxPoint(0, 0); 
     var thisIndex:String = m_levelData[row][column]; 
     //trace("This Line is " + m_levelData[row]); 
     trace("Current index is " + thisIndex); 

     //trace(row + " " + column); 
     switch(thisIndex) { 

      case Statics.GRID_BIN: 
       offset.y = (spaceSize.y/Statics.SPRITE_SCALE - BinFront.SIZE.y/Statics.SPRITE_SCALE)/2; 
       offset.x = (spaceSize.x/Statics.SPRITE_SCALE - BinFront.SIZE.x/Statics.SPRITE_SCALE)/2; 
       var color:uint; 
       if (m_colors.length < currentColor) { 
        color = Statics.COLOR_BLACK; 
        trace("No color found"); 
       } else { 
        color = m_colors[currentColor]; 
        currentColor++; 
        trace("Color is " + color); 
       } 
       makeBin(spaceSize.x * column + offset.x + levelOffset.x, spaceSize.y * row + offset.y + levelOffset.y, color); 
       break; 

      case Statics.GRID_BUILDER: 
       offset.y = (spaceSize.y/Statics.SPRITE_SCALE - BuilderMain.SIZE.y/Statics.SPRITE_SCALE)/2 
       offset.x = (spaceSize.x/Statics.SPRITE_SCALE - BuilderMain.SIZE.x/Statics.SPRITE_SCALE)/2; 
       makeBuilder(spaceSize.x * column + offset.x + levelOffset.x, spaceSize.y * row + offset.y + levelOffset.y); 
       break; 

      case Statics.GRID_CONVEYOR: 
       var length:int = 0; 
       if (column == 0 || m_levelData[row][column - 1] != Statics.GRID_CONVEYOR) { 
        for (i = column; i < m_levelData[row].length; i++) { 
         if (m_levelData[row][i] == Statics.GRID_CONVEYOR) { 
          length++; 
         } else { 
          break; 
         } 
        } 

        offset.y = (spaceSize.y/Statics.SPRITE_SCALE - Statics.GRID_SIZE.y/Statics.SPRITE_SCALE)/2 
        offset.x = (spaceSize.x/Statics.SPRITE_SCALE - Statics.GRID_SIZE.x/Statics.SPRITE_SCALE)/2; 
        makeConveyor(spaceSize.x * column + offset.x + levelOffset.x, spaceSize.y * row + offset.y + levelOffset.y, length); 
       } 
       break; 

      default: 
       trace("Nothing at this index, it was " + thisIndex); 
     } 

Statics.GRID_BIN, Statics .GRID_CONVEYOR, et Statics.GRID_BUILDER sont toutes des chaînes constantes ("a", "b", et "c" respectivement), et je sais que tout cela devrait fonctionner parce que ça fonctionnait avant de passer à l'analyseur. Maintenant, votre réponse immédiate à cela est que le problème est mon analyseur, mais j'ai des soupçons que quelque chose est un peu vilain autre que cela. Avant le switch, j'imprime la valeur thisIndex .. (trace("Current index is " + thisIndex);), et chaque fois qu'il s'agit de la dernière lettre d'une ligne qui a été analysée (en utilisant split(","), même si elle correspond à l'une des conditions switch, la condition par défaut est exécutée et rien ne se passe .

quelqu'un at-il vu quelque chose comme ça, ou suis-je simplement faire une erreur vraiment stupide?

Répondre

0

Lorsque vous analysez et comparez des chaînes chargées à partir d'un fichier .txt que vous avez à traiter avec différents personnages « cachés ». a fin de ligne, vous risquez de rencontrer CR (\ r) LF (\ n) ou les deux ou l'inverse Il peut être un peu fastidieux de savoir ce qui s'applique à votre système ou à votre fichier .txt

En fin de compte, vous pouvez probablement le faire fonctionner en utilisant String.replace().

Cela a été discuté par exemple ici: How do I detect and remove "\n" from given string in action script?

En dehors de cela, il est difficile de juger s'il y a quelque chose de mal avec votre analyseur. Votre utilisation de l'instruction switch {} - semble correcte et devrait fonctionner.

Si vous avez besoin de déboguer le code, essayez de l'alimenter avec un const :String codé en dur au lieu du fichier .txt. Puis définissez un point d'arrêt (dans Flash Builder en double-cliquant sur le numéro de ligne à côté du commutateur-statemen) et parcourez-le ligne par ligne.

+0

Vous aviez raison, le problème était le CR et/ou LF. Je n'ai jamais traité de fichiers d'analyse syntaxique .txt auparavant, et un de mes amis m'a conseillé d'examiner ces problèmes. Quand j'ai analysé le fichier .txt, j'utilisais 'data.split (/ \ n /)' pour le transformer en un tableau de lignes, parce que je ne connaissais pas mieux. Maintenant j'utilise '/ \ r? \ N /' comme paramètre et ça marche bien. Merci pour l'aide! –