0

最近、私は Flash Builder プログラムと Flixel エンジンを使用して、Flash でゲームを作成しています。最初に実行されるのは、.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の値を出力し、それが解析された行の最後の文字である場合は常に ( を使用して、条件の 1 つに一致する場合でも、デフォルトの条件が実行され、何も起こりません。thisIndextrace("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 に答える