如何将Box2dWeb和RequireJs结合在一起

时间:2011-12-18 15:07:26

标签: backbone.js box2d requirejs

我使用RequireJs和Backbone构建了javascript游戏的文件结构。现在我有问题将它与Box2DWeb结合起来。

// Filename: game/controller/arena.js
define([
    'jquery',
    'underscore',
    'backbone',
    '_69_',
    'game/controller/object',
    'game/model/arena',
    'game/view/arena',
    'box2d'
    ], function($, _, Backbone, _69_, Object, Model, View, Box2D){
        var ArenaController = Object.extend ({
            init : function (){
                this._super(Model, View);
                this.world = new b2World(
                    new b2Vec2(0, 10)    //gravity
                    ,  true                 //allow sleep
                    );
                this.appView;
                this.loops=0;
            },
            start : function (){
                _69_.l('start')
            },
            update :function (){
                _69_.l('update')
            },
            stop : function (){
                _69_.l('stop')
            }
        });

        return new ArenaController;
    });

但是在控制台中我得到的是b2World没有定义。我该怎么办才能让它发挥作用?

2 个答案:

答案 0 :(得分:1)

我不知道box2d但是box2world确实不存在于该上下文中,除非它是一个全局对象。

我在这里假设您需要它的名称空间,如果它包含在您可能使用的required.js依赖项中定义的box2d引用中

new Box2D.b2World(...);

答案 1 :(得分:0)

你应该尝试在main.js文件的require中包含“box2D”。 Box2D将作为全局对象加载,以后可以使用。

require([
  'app',
  'box2d'
], function(app){
     app.init();
});

你不应该在函数中提及它,或者你可以将它列为“忽略”:

require([
  'app',
  'box2d'
], function(app, ignore){
     app.init();

});

在Chrome控制台中,您可以键入Box2D,您应该会看到它弹出为全局对象。一旦了解了它的全局,就可以开始使用它了。

然后在您的ArenaController中,您可以在define数组中列出“box2d”,但不能在函数中列出:

define([
    'jquery',
    'underscore',
    'backbone',
    '_69_',
    'game/controller/object',
    'game/model/arena',
    'game/view/arena',
    'box2d'
    ], function($, _, Backbone, _69_, Object, Model, View) {
         var ArenaController = Object.extend ({
            init : function (){
                this._super(Model, View);
                var b2World = Box2D.Dynamics.b2World; //Box2D should be available as a global
                this.world = new b2World(
                    new b2Vec2(0, 10)    //gravity
                    ,  true                 //allow sleep
                    );
                this.appView;
            }
        });

        return new ArenaController;
    });