ActionScript 3 Array Return Грешка по време на изпълнение

Добре, така че имам следния код и всичко, което прави, е да постави 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");
    }

сега можете да видите тук, че се търси tile[aa+1], но aa = 1 в началото, така че aa+1 = 2 и tile[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