AS3 Помещение функции blah () {вокруг кода генерирует ошибки в строках кода, которых у меня нет - PullRequest
1 голос
/ 27 февраля 2012

У меня есть блок кода, который делает то, что я хочу - он генерирует сетку из MC.

Как только я помещаю что-то вроде функции blah (), он начинает генерировать ошибки, указывающие строкикода, которого у меня нет, например

TypeError: Ошибка # 1010: термин не определен и не имеет свойств.
в flightCellMaker_fla :: MainTimeline / myXMLtrace () [flightCellMaker_fla.MainTimeline ::frame1: 87]
в flightCellMaker_fla :: MainTimeline / processFPBxml () [flightCellMaker_fla.MainTimeline :: frame1: 52]
в flash.events::EventDispatcher/dispatchEventFunction()
в flash.events::Event/ dispatchEvent ()
на flash.net::URLLoader/onComplete()

Когда я вынимаю функцию, она делает то, что я хочу.Что с этим?

var testXML:XML;
var myFPBxml:XML;

// Initialise a URLLoader to get XML data from XML file
var myFPBLoader:URLLoader = new URLLoader();
myFPBLoader.load(new URLRequest("flightPlannerBoard.xml"));


 // Check XML data fully loaded
 myFPBLoader.addEventListener(Event.COMPLETE, processFPBxml);


// Once the flight board planning data is loaded, save it to a variable
function processFPBxml(e:Event):void {
myFPBxml = XML(e.target.data);
myXMLtrace();
 }  


// Grab the XML data load completed and make it available elsewhere
function myXMLtrace(){
testXML = XML(myFPBxml);
}
trace("***********************" + testXML.*); This throws an error (not within myXMLtrace tho)

ОК, так что остальная часть кода будет работать правильно самостоятельно, но не в функции:

// Create and place all the flight cells for planning and drag and drop 

// Setup 2 loops: j for columns and i for Rows
for (var j:Number =0; j < rowNum; j++){

for (var i:Number =0; i<9; i++){

    // Create copies of flightCell for board grid
    var my_mc = new flightCell();
    my_mc.name = "mc"+i+j;

    addChild(my_mc);

    // Set event Listeners on all Child objects
    my_mc.myDragShape.addEventListener(MouseEvent.MOUSE_OVER, fl_MouseOverHandler);
    my_mc.myDragShape.addEventListener(MouseEvent.MOUSE_OUT, fl_MouseOutHandler);
    my_mc.myDragShape.addEventListener(MouseEvent.MOUSE_DOWN, fl_MouseDownHandler);
    my_mc.myDragShape.addEventListener(MouseEvent.MOUSE_UP, fl_MouseUpHandler);

    Object(this).my_mc.yellowHiLite.visible = false;


    //cellPos[j] = myXML.cellPosX[j];
    //trace(stage.myXML.*);

    //trace(my_mc.name);
        my_mc.x = (100 + colWidth);
        my_mc.y = myRowHeight;

    colWidth = colWidth + 155;

    //trace(myXML.*);

    cellArray[arrayCount] = [my_mc.x, my_mc.y];
    trace("CellArrayCount = " + cellArray[arrayCount]);
    arrayCount = arrayCount + 1;
}

myRowHeight = myRowHeight + 105;
colWidth = 50;
}

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

Ваша трассировка выдает ошибку, потому что она выполняется до загрузки XML.

ActionScript является асинхронным, что означает, что во время загрузки XML выполнение программы продолжается и выглядит примерно так:

  1. Объявить testXML:XML и myFPBxml:XML
  2. Создать загрузчик и начать загрузку
  3. Добавление прослушивателя для завершения загрузки
  4. Трассировка testXML
  5. Выполнить processFPBxml при загрузке XML

Если вы переместите свою трассировку в функцию myXMLTrace, она будет работать правильно.


С недавно добавленным кодом проблема в этой строке:

Object(this).my_mc.yellowHiLite.visible = false;

Здесь вообще нет необходимости использовать ключевое слово this. Это будет работать внутри или снаружи функции:

my_mc.yellowHiLite.visible = false;

Причиной сбоя вашего кода внутри функции является то, что внутри и снаружи функции this будет область действия объекта, в котором находится этот код. Однако когда вы помещаете код в функцию, созданная вами ссылка - my_mc - локально попадает в область функции, а не в родительский объект, поэтому this.my_mc не определено, поскольку this не является областью действия функции. .

0 голосов
/ 27 февраля 2012

Если вы объявляете переменные внутри функции, они попадают только в область действия функции.

Похоже, вы пытаетесь получить доступ к переменным из другого места в вашем коде.

Итак, вам нужно объявить переменные вне функции. например,

var one:VarType;
var two:VarType;

function blah():void {
 trace(one);
}
0 голосов
/ 27 февраля 2012

Вы берете код из функции, в которой он находится в данный момент, и вызываете новую функцию там, где раньше был код? Или вы пытаетесь определить переменную функции? Если вы помещаете функцию blah () {...} вокруг кода в том же месте, где он в данный момент выполняется, вы наверняка получите синтаксическую ошибку. В этом случае попробуйте:

var blah:Function= function() { ... };
blah();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...