我不确定那里的任何人都能帮忙解决这个问题。我正在重构一个我用CraftyJS(一个优秀的基于组件的游戏引擎)编写的游戏来使用RequireJS。一切都进行得很顺利,但突然间我遇到了障碍。我已经构建了一个模块,在其中我定义了一个小的Crafty组件,它基本上只是事件监听的瓶颈。在其中一个回调中,我调用了几个在本地模块中定义的函数。我在很多情况下都在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的人,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()
主体时,模块中定义的所有函数都已正确定义,大多数在组件的回调中未定义其中的strong>。实际上,当组件被实例化时
if (!_observer)
_observer = Crafty.e("TurnStateMachineObserver");
_observer.startListening();
init
函数中的(模块返回),nextPhase()
已定义,但如果我进入_observer.startListening()
,则不是currentPhase()
。哎呀!我把头发留下的东西拉过这个。让我感到困惑的是这些功能都是兄弟姐妹。如何定义更高范围的某些功能而其他功能不是?!
答案 0 :(得分:1)
...
var curPhaseVal = currentPhase();
var nextPhaseVal = nextPhase();
...
突然一切正常。这应该是一个明智的选择,但它仍然需要一个星期才能找到。哦,回去工作!