AS3切换条件被忽略

时间:2013-08-04 23:31:07

标签: actionscript-3 switch-statement

所以最近我一直在Flash中使用Flash Builder和Flixel引擎开发游戏。我遇到了一个奇怪的障碍,首先运行的是我为基于.txt文件中的2D数组创建每个级别的屏幕的解析器,并且由于某种原因,每行中的最后一个字母是在switch语句中被忽略,决定了该索引代表什么。

这是我遇到问题的部分(在每种情况下发生的事情都是无关紧要的,我只是把它留给上下文,但它们都表现正确):

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条件之一匹配,默认条件运行且没有任何反应。

有没有人见过这样的事情,或者我只是犯了一个非常愚蠢的错误?

1 个答案:

答案 0 :(得分:0)

当您解析并比较从.txt加载的字符串时,您必须处理各种“隐藏”字符。在行结尾处,您可能遇到CR(\ r)LF(\ n)或两者或反过来。 它可能会有点繁琐,以找出适用于您的系统或.txt。

最后,您可以使用String.replace()使其正常工作。

此处已在此处讨论过:How do I detect and remove "\n" from given string in action script?

除此之外,很难判断解析器是否有问题。 你使用switch {} - 语句看起来很好,应该可以工作。

如果您需要调试代码,请尝试使用硬编码const :String代替.txt文件。然后设置一个断点(在Flash Builder中双击switch-statemen旁边的行号)并逐行逐步执行。