2013-06-14 4 views
1

Я не уверен, что кто-то там сможет помочь с этим, но здесь идет. В настоящее время я реорганизую игру, которую пишу с помощью CraftyJS (отличный игровой движок на основе компонентов) для использования RequireJS. Все прошло неплохо, но внезапно я попал в ловушку. Я создал модуль, в котором я определяю небольшой компонент Crafty, который в основном является узким местом для прослушивания событий. В одном из обратных вызовов я вызываю несколько функций, которые определены в локальном модуле. Я использовал этот шаблон в RequireJS во многих контекстах, и он всегда работал для меня. По некоторым причинам в этом случае функции не определены. Не все из них. Лишь некоторые. Вот код:RequireJS некоторые (не все) функции не определены

Компонент:

Crafty.c("TurnStateMachineObserver", { 
    startListening: function() { 
... 
     this.bind(POST+PHASE_CHANGE, function(e) { 
      // this is called after the phase change has already been 
      // applied. now, switch to the next phase, if appropriate. 

      var curPhase = currentPhase(); 
      var nextPhase = nextPhase(); 

      if (nextPhase === PHASE_TURN_START) 
       _triggerPlayerChange(nextPlayer()); 
      else if (curPhase !== PHASE_MAIN) 
       _triggerPhaseChange(nextPhase()); 
     }) 
     .bind(POST+RESET, function(e) { 
      reset(); 
     }); 
    }, 
... 
}); 

Для тех из вас знакомы с лукаво, Crafty.c создает компонент, который впоследствии может быть инстанцированный. Литеральный объект передается, поскольку второй аргумент будет добавлен (расширен?) К любому объекту, который включает TurnStateMachineObserver в качестве одного из его компонентов (то есть с использованием Crafty.e("TurnStateMachineObserver")).

Функции, используемые внутри компонента определены позже в том же файле (весь файл упаковывается в define() вызова):

// Function: currentPhase 
//  The current <Turn Phase>. 
function currentPhase() { 
    if (_currentPhaseIndex < 0) _currentPhaseIndex = 0; 
    return PHASES[_currentPhaseIndex]; 
} 

// Function: nextPhase 
//  The phase following the <currentPhase>. Order follows the 
//  <PHASES> list. 
function nextPhase() { 
    var phaseIndex = _currentPhaseIndex + 1; 
    phaseIndex %= PHASES.length; 

    return PHASES[phaseIndex]; 
} 

Теперь, когда POST+PHASE_CHANGE событие вызывается, исключение брошено звонок по телефону nextPhase(), но НЕ по телефону currentPhase()! После некоторой отладки я определил, что, фактически, в то время как все функции, определенные в модуле, правильно определены при первом вводе тела define(), из них не определены внутри обратных вызовов компонента. На самом деле, когда компонент инстанциируется

константы выглядит
if (!_observer) 
    _observer = Crafty.e("TurnStateMachineObserver"); 
_observer.startListening(); 

в init функции (которой модуль возвращается), nextPhase() определяется, но если я шаг в _observer.startListening(), это не так, хотя currentPhase() есть. Argh! Я вытягиваю то, что осталось от моих волос. Дело в том, что я действительно смущен в том, что эти функции являются братьями и сестрами. Как определить некоторые функции из более высокого уровня, а другие нет?

ответ

1

Ничего себе, глупо. Очевидно, проблема заключалась в том, что я переписывал функцию с переменной. Когда я меняю его на

... 
var curPhaseVal = currentPhase(); 
var nextPhaseVal = nextPhase(); 
... 

внезапно все работает. Это должно было быть без проблем, но мне все же понадобилось неделю. Ну что ж, вернемся к работе!

Смежные вопросы