2013-07-17 68 views
1

我想用box2dweb用coffeescript来创建一个简单的游戏。设置物理工作正常,更新正常,但当试图在更新循环中调用我自己的函数时,我得到这个错误'undefined不是函数(评估this.batman())'(batman是函数名)。在运行之前,我正在编译为JavaScript。 这是我第一次使用coffeescript,所以我可能会做一些愚蠢的事情。未定义是不是一个函数,当评估'this.batman()'

这里是我的代码:

root = exports ? this 
root.world = null 

class Game 
    class Game 
    canvasHeight: 450 
    canvasWidth: 800 
    canvas: null 
    drawingContext: null 

    constructor: -> 
     @createCanvas() 
     @resizeCanvas() 
     @createDrawingContext() 
     @initPhysics() 

    createCanvas: -> 
     @canvas = document.createElement 'canvas' 
     document.body.appendChild @canvas 

    resizeCanvas: -> 
     @canvas.height = @canvasHeight 
     @canvas.width = @canvasWidth 

    createDrawingContext: -> 
     @drawingContext = @canvas.getContext '2d' 

    initPhysics: -> 
     #physics setup removed for brevity 

     window.setInterval(@update, 1000/60) 


    batman: -> 
     alert "whatever" 

    update: -> 
     root.world.Step(1/60, 10, 10) 
     root.world.DrawDebugData() 
     root.world.ClearForces() 
     @batman() 


    window.Game = Game 
+0

看起来你的缩进是错误的。课堂内的所有内容都应该缩进。 – elclanrs

+0

你不能只调用'蝙蝠侠',你需要首先实例化'BatSignal',然后使用'BatSignal.Call(蝙蝠侠)'。 – 2013-07-17 01:59:09

回答

1

initPhysics,你需要bind@updatethis

window.setInterval(@update.bind(this), 1000/60)

,否则当update被称为this内容不会丢失。

+0

你需要将'this'保存在setInterval之外;否则你的代码会编译为'this.update.bind(this)',这是多余的。 – Mathletics

+1

@Mathletics:'this.update'和'this.update.bind(this)'之间的区别在于前者引用一个函数(不绑定任何东西),而后者引用绑定到'this'的函数。在'bind(this)'中的'this'是在调用'window.setInterval'时被评估的,它在哪一点上具有正确的值(Game实例),这正是我们想要的。 Heres [小提琴](http://jsfiddle.net/BEAnv/)演示了类似的东西,但在JavaScript中。 –

+0

'this.update'以'window'作为上下文,但我明白你想说什么。你的小提琴无疑证明了这一点,尽管我不得不说WTF to JavaScript将'this.update.bind(this)'解析为'window.update.bind(Game)'。这对我来说无疑是一个新的。 – Mathletics

相关问题