0

所以最近我一直在使用 Flash Builder 程序和 Flixel 引擎在 Flash 中开发游戏。不过,我遇到了一个奇怪的问题,首先运行的其中一个是我制作的解析器,它根据 .txt 文件中的二维数组为每个级别创建屏幕,并且由于某种原因,每行中的最后一个字母是在决定该索引代表什么的 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条件,也会运行默认条件并且没有任何反应。

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

4

1 回答 1

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 旁边的行号)并逐行遍历它。

于 2013-08-05T01:02:45.920 回答