Как совместить Box2dWeb и RequireJs - PullRequest
0 голосов
/ 18 декабря 2011

Я построил файловую структуру для игры на JavaScript, используя RequireJs и Backbone. Теперь у меня есть проблема, чтобы совместить его с 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 ]

1 голос
/ 19 декабря 2011

Я не знаю box2d, но box2world действительно не существует в этом контексте, если это не глобальный объект.

Здесь я предполагаю, что вам понадобится его пространство имен, если оно включено в ссылку box2d, которую вы определили втребуемые зависимости .js, которые вы можете использовать

new Box2D.b2World(...);
0 голосов
/ 02 июля 2013

Вы должны попытаться включить "box2D" в требование вашего файла main.js.Box2D загрузится как глобальный объект, который вы сможете использовать позже.

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

Вы не должны упоминать об этом в функции, или вы можете указать это как «игнорировать»:

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

});

В консоли Chrome вы можете ввести Box2D и вы должны увидетьэто всплывает как глобальный объект.Как только вы знаете, что это глобально, вы можете начать использовать его.

Затем в вашем ArenaController вы можете перечислить «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;
    });
...