Я разрабатываю многопользовательскую игру в режиме реального времени 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, но я рассмотрел закрытие, анонимные функции и многие подобные сомнения. К сожалению, я еще не мог решить эту проблему.
@tom, что решить мою проблему, спасибо! Но если кто-то знает другое решение, не связывая мои сценарии в одном файле, я хотел бы знать. –
Есть ли причина, по которой вы не хотите связывать свои скрипты? В разработке вы должны держать их все в стороне. Вы только свяжете их, когда будете готовы к тестированию или отправке. Среда выполнения точно такая же, как если бы они находились в разных файлах, за исключением того, что они немного быстрее, потому что они должны получить только один файл. – t3dodson
, если это время, которое требуется для вызова команды bundle, я предлагаю изучить grunt.js его инструмент, который может автоматизировать задачу. Вы можете настроить свой проект на сборку каждый раз при сохранении файла. – t3dodson