最近,我在Flash中开发了一个游戏,使用了Flash和Flixel引擎。不过,我遇到了一个奇怪的问题,首先运行的是一个解析器,用于根据.txt文件中的2D数组为每个级别创建屏幕。出于某种原因,每一行中的最后一个字母在开关语句中被忽略,后者决定了该索引代表什么。
这是我遇到问题的地方(在每种情况下发生的事情都是无关紧要的,我只是把它放在上下文中,但它们的行为都是正确的):
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和Statics.GRID_BUILDER都是常量字符串(分别为“a”、"b“和"c”),我知道这一切都应该工作,因为它在我切换到解析器之前就已经工作了。现在,您对此的直接反应是,问题在于我的解析器,但我怀疑有什么东西比这更离奇。在switch之前,我会打印thisIndex.(trace("Current index is " + thisIndex);))的值,每当它是被解析的行中的最后一个字母时(使用split(","),即使它匹配switch条件之一,默认条件也会运行,什么都不会发生。
有没有其他人看到过这样的事情,或者我只是犯了一个很愚蠢的错误?
发布于 2013-08-05 01:02:45
当解析和比较从.txt加载的字符串时,必须处理各种“隐藏”字符。在行尾,您可能会遇到CR (\r)、LF(\n)或两者或相反的情况。要找出哪些应用于您的系统或.txt,可能会有些费心。
最后,您可能可以使用String.replace()使其工作。
这里已经讨论过这一点,例如:How do I detect and remove "\n" from given string in action script?
除此之外,很难判断解析器是否有问题。您对开关{}-statement本身的使用看起来很好,应该正在工作。
如果需要调试代码,请尝试用硬编码的const :String (而不是..txt文件)来填充代码。然后设置一个断点(在Flash中,双击开关状态器旁边的行号),然后逐行遍历它。
https://stackoverflow.com/questions/18048677
复制相似问题