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?
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! –