@Alecxandrys

Как правильно замкнуть функцию?

День добрый,
В приведённом ниже коде я пытаюсь вызвать функцию RenderField, указав в качестве параметра другую функцию, описанную на месте. В моём понимании AddPart должна передаться в рендер и там выполнится. Но при выполнении почему то исполняется сразу AddPart (с вызова RenderField уходит на него) в следствии чего падает с ошибкой, так как переменные (x,y,cell) ещё не определены, так как они определяются в RenderField.
Участок проблемного кода:
reconnaissanceState.prototype={
    preload:function()
    {
    },
    create:function()
    {
        game.curState='reconnaissance';
        game.squads=game.add.group();
        game.tiles=game.add.group();
        RenderField(this.AddPart,1);
    },
    AddPart:function()
    {
        game.map[x][y].xCoordinate=xCoordinate;
        game.map[x][y].yCoordinate=yCoordinate;

        cell.row=x;
        cell.collomn=y;

        cell.inputEnabled=true;
        cell.events.onInputDown.add(this.addSquad,this)
    },

Код самого RenderField:
function RenderField(addPart,point)
{
    for(var x=(battle.BS.xSize-1); x>=0; x--)
    {
        for(var y=((battle.BS.ySize+battle.BS.xSize/2)-1); y>=0; y--)
        {
            if(OffsetOut(battle.BS.xSize,x,battle.BS.ySize,y))
            {

                var cell;
                var tmp=battle.BS.map[x][y].ground;

                var xCoordinate;
                var yCoordinate;

                //for changeable field and different first shift
                //this part from lab, where A* pathfinder was realised
                //only removed horisontal offset (now idea why) and add vertical shift
                if(battle.BS.xSize%2 == 1)
                {
                    xCoordinate=game.yLineSize*(y-(battle.BS.xSize-1-x)/2);
                    yCoordinate=game.xLineSize*x*0.75;
                }
                else
                {
                    xCoordinate=game.yLineSize*(y-(battle.BS.xSize-1-x)/2);
                    yCoordinate=game.xLineSize*x*0.75;
                }
                switch(tmp)
                {
                    case 1:
                        cell=game.tiles.create(xCoordinate,yCoordinate,'Grass');
                        break;
                    case 2:
                        cell=game.tiles.create(xCoordinate,yCoordinate,'Cover');
                        break;
                    case 3:
                        cell=game.tiles.create(xCoordinate,yCoordinate,'Danger');
                        break;
                    case 4:
                        cell=game.tiles.create(xCoordinate,yCoordinate,'Diff');
                        break;
                    case 5:
                        cell=game.tiles.create(xCoordinate,yCoordinate,'Ruin');
                        break;
                    case 0:
                        cell=game.tiles.create(xCoordinate,yCoordinate,'Unreached');
                        break;
                    default:
                        cell=game.tiles.create(xCoordinate,yCoordinate,'Offset');
                        break;
                }
                if (point==1) {addPart();}

            }
        }
    }
}


Такая конструкция появилась так как несколько раз надо сделать одно и тоже, заменив несколько строк, которые и были бы описаны в передаваемой функции. В точке вызова все переменные уже определены.
Как правильно передать код, чтобы не проходил вызов AddPart на месте определения?
Если это имеет значение, то сам reconnaissanceState является описанием состояния для Phaser.io
  • Вопрос задан
  • 176 просмотров
Решения вопроса 1
@Alecxandrys Автор вопроса
Был сделан принудительный бинд контекста перед вызовом переданной функции, проблема была решена.
context.xCoordinate=xCoordinate;
context.yCoordinate=yCoordinate;
context.cell=cell;
context.x=x;
context.y=y;
if ((point==1) || (point==2))
{
 var f=addPart.bind(context);
 f();
}

В вызываемой функции обращения к переданным переменным через this
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@tuxx
this.AddPart() это вызов функции чтобы передать в RenderField результат её выполнения. Нужно так:

RenderField(this.AddPart, 1)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы