Ошибка выполнения возврата массива ActionScript 3

Итак, у меня есть следующий код, и все, что он делает, это размещает 3 квадрата сплошного цвета на экране и один квадрат радужного цвета в правом нижнем углу. Когда пользователь нажимает на любой из однотонных квадратов, это место заполняется радужным квадратом, и в исходном месте радуги появляется тот квадрат, на который нажали. Код работает почти идеально, за исключением одного. Когда пользователь пытается щелкнуть квадрат, который находится ПОД радужным квадратом, он возвращает ошибку времени выполнения.

Мой код:

i

mport flash.display.DisplayObject;
import flash.ui.Mouse;

var t1:DisplayObject = new mc_1;
var t2:DisplayObject = new mc_2;
var t3:DisplayObject = new mc_3;
var t4:DisplayObject = new mc_4;

var tile:Array = [[t1,t2],[t3,t4]];

var r:int;
var c:int;
var a:int = 50;
var b:int = 50;
var aa:int = 1;
var bb:int = 1;
function reDraw() {
    a = 50;
    b = 50;
    for (r=0;r<2;r++) {
        for (c=0;c<2;c++) {
            tile[r][c].x = a;
            tile[r][c].y = b;
            trace(tile[r][c]);
            stage.addChild(tile[r][c]);
            tile[r][c].addEventListener(MouseEvent.CLICK, go);
            a += 100;
        }
        a = 50;
        b += 100;
    }
}
reDraw();

function go(e:MouseEvent):void {
    trace(e.target);
    //Right:
        if (e.target == tile[aa][bb+1]) {
            tile[aa][bb] = e.target;
            bb += 1;
            tile[aa][bb] = t4;
            reDraw();
            trace("Right");
        }
    //Left:
        else if (e.target == tile[aa][bb-1]) {
            tile[aa][bb] = e.target;
            bb -= 1;
            tile[aa][bb] = t4;
            reDraw();
            trace("Left");
        }
    //Up:
        else if (e.target == tile[aa-1][bb]) {
            tile[aa][bb] = e.target;
            aa -= 1;
            tile[aa][bb] = t4;
            reDraw();
            trace("Up");
        }
    //Down:
        else if (e.target == tile[aa+1][bb]) {
            tile[aa][bb] = e.target;
            aa += 1;
            tile[aa][bb] = t4;
            reDraw();
            trace("Down");
        }
        else trace("FAILED!");
    trace(aa +" " +  bb);
}

Ошибка:

TypeError: Ошибка № 1010: термин не определен и не имеет свойств. в win_fla::MainTimeline/go()


person Nigh7Sh4de    schedule 19.10.2012    source источник
comment
go() не определен... скрипт временной шкалы??   -  person philipp    schedule 19.10.2012
comment
весь этот код находится на временной шкале под кадром 1   -  person Nigh7Sh4de    schedule 19.10.2012
comment
Вы должны предоставить этот метод - он отсутствует.   -  person Florian Salihovic    schedule 19.10.2012
comment
у тебя ошибка в линии? Бьюсь об заклад, что tile[aa][bb+1] может быть проблемой, когда bb+1 больше или равно 2.   -  person Lukasz 'Severiaan' Grela    schedule 19.10.2012
comment
Как видите, у меня есть команда трассировки, которая сообщает мне, что такое bb и aa, и когда радуга находится в верхней строке, она возвращает 0 0, поэтому [aa][bb+1] равно [0][1] что является (по крайней мере, я так думаю) правильным утверждением?   -  person Nigh7Sh4de    schedule 19.10.2012
comment
также @FlorianSalihovic, у меня есть оператор else, почему он не перехватывает исключения?   -  person Nigh7Sh4de    schedule 19.10.2012
comment
Извиняюсь. Я только что понял, что отсутствующие полосы прокрутки (Mac OSX) привели меня к выводу, что код, который я вижу, - это все, что вы предоставили. Я не проверял, есть ли что-то еще...   -  person Florian Salihovic    schedule 19.10.2012
comment
Но просто интересно, почему НЕ работает мой оператор else?   -  person Nigh7Sh4de    schedule 19.10.2012


Ответы (1)


Если вы посмотрите на свой код, у вас есть это:

//Down:
    else if (e.target == tile[aa+1][bb]) {
        tile[aa][bb] = e.target;
        aa += 1;
        tile[aa][bb] = t4;
        reDraw();
        trace("Down");
    }

теперь вы можете видеть здесь, что он ищет плитку [aa+1], однако aa = 1 в начале, поэтому aa+1 = 2, а плитка [2] не существует или не определена. Вам нужно будет изменить свою логику на что-то вроде:

var tileFound:Boolean = false;
for(var i:int = 0; i < 2; i++){
    for(var j:int = 0; j < 2; j++){
        if(tile[i][j] == e.target){
            tileFound = true;
            tile[aa][bb] = e.target;
            tile[i][j] = t4;
            if(i > aa) trace ("Right");
            else if(i < aa) trace ("Left");
            if(j > bb) trace ("Bottom");
            else if(j < bb) trace ("Top");
            aa = i;
            bb = j;
            reDraw();
            tileFound = true;
            break;
        }
    }
    if(tileFound) break;
}
person Elijah Vankov    schedule 19.10.2012