2015-05-26 1 views
3

Я разрабатываю многопользовательскую игру в режиме реального времени HTML5, и у меня есть файл game_core.js, который запускает физику игры с использованием библиотеки p2. Я хотел бы запустить этот файл как на клиенте, так и на предсказании, и на авторитетном сервере. Вот конструктор и module.exports:Доступ к глобальной переменной за пределами анонимной функции в JavaScript с использованием require

function gameCore() { 
    this.world = new p2.World({gravity:[0, 0]}); 
    this.players = {}; 
    this.step = 1/60; 
} 

... 

module.exports = gameCore; 

Поскольку я загружая p2.js файл внутри index.html

<script type="text/javascript" src="lib/p2.js"></script> 
<script type="text/javascript" src="game_client.js"></script> 
<script type="text/javascript" src="game_core.js"></script> 

конструктор находит объект p2 и все работает отлично. Но моя проблема в том, когда я пытаюсь запустить этот файл на сервере, потому что я не могу найти правильный путь для доступа к объекту p2, то есть глобальная переменная на game_server.js:

var 
    io    = require('socket.io'), 
    express   = require('express'), 
    UUID   = require('node-uuid'), 
    p2    = require('p2'), 
    verbose   = false, 
    http   = require('http'), 
    app    = express(), 
    config   = require('./config.json'), 
    gameCore  = require('./game_core.js'), 
    server   = http.createServer(app); 

var world = new gameCore(); 

Я получаю это ошибка:

this.world = new p2.World({gravity:[0, 0]}); 
         ^
ReferenceError: p2 is not defined 

Если создать свойство p2 на gameCore, оставить мир как нуль на конструктор, присвоить глобальный р2 р2 gameCore, а затем назначить правильное значение для мира, используя функцию инициализации

function gameCore() { 
    this.p2 = null; 
    this.world = null; 
    this.players = {}; 
    this.step = 1/60; 
} 

gameCore.prototype.init = function() { 
    this.world = new this.p2.World({gravity:[0, 0]}); 
} 

это работает, но поскольку мне нужно сделать это на других классах gameCore, я получаю переполнение стека. И если я использую

var p2 = require('p2'); 

на gameCore это работает, но клиент жалуется на использование require.

Я новичок в JavaScript, но я рассмотрел закрытие, анонимные функции и многие подобные сомнения. К сожалению, я еще не мог решить эту проблему.

+0

@tom, что решить мою проблему, спасибо! Но если кто-то знает другое решение, не связывая мои сценарии в одном файле, я хотел бы знать. –

+0

Есть ли причина, по которой вы не хотите связывать свои скрипты? В разработке вы должны держать их все в стороне. Вы только свяжете их, когда будете готовы к тестированию или отправке. Среда выполнения точно такая же, как если бы они находились в разных файлах, за исключением того, что они немного быстрее, потому что они должны получить только один файл. – t3dodson

+0

, если это время, которое требуется для вызова команды bundle, я предлагаю изучить grunt.js его инструмент, который может автоматизировать задачу. Вы можете настроить свой проект на сборку каждый раз при сохранении файла. – t3dodson

ответ

1

browserify позволяет использовать запрос в файлах js вашего клиента.

Также вам нужно, чтобы game_core.js требовал p2, если вы хотите использовать p2 в конструкторе.

Ваш файл клиента, используя browserify должен выглядеть следующим образом

<script src="bundle.js"></script> <!-- browserify p2 game_core.js config.json ---> 
<script> 
    var p2 = require('p2 '); 
    var game_core= require('game_core.js'); 
    var config= require('config.json'); 
/* ... */ 
</script> 
+1

Спасибо за ваш ответ! –

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

  • Нет связанных вопросов^_^