Я играю в Tank Game, которую я сделал с программным обеспечением GDevelop5, и теперь, когда мне нужно подключиться к локальной сети, я решил использовать Socket.IO. Все идет хорошо, пока мне не нужно фактически обновить позицию объекта в браузерах других клиентов. Я могу видеть координаты движущихся объектов как на консоли браузера компьютера, так и на терминале сервера. Моя проблема даже в том, что я вижу координаты, если я перевожу игрока 1 на компьютер 1, компьютер 2 не видит никаких изменений. У меня было много проблем, с которыми я застрял в этом проекте, но это, безусловно, худшая из них. Я искал во всем Inte rnet ответы, но ничего не получалось, поэтому я спрашиваю здесь!
Вот мой сценарий, что-то вроде js для обработки движений игрока (это было создано GDevelop, когда я скачал свою игру (после того, как сделал это с помощью программного обеспечения basi c GDevelop)). Я буду показывать только основные детали, так как это огромный файл:
var socket = io.connect('http://MY_IP:8001');
var player1;
var player2;
gdjs.LANCode = {}; // Game Scene
gdjs.LANCode.GDenemyObjects1= []; //Player Object
//PLAYER MOVEMENTS --------------------------------------------------------------------------
{
gdjs.LANCode.condition0IsTrue_0.val = gdjs.evtTools.input.isKeyPressed(runtimeScene, "Up");
}if (gdjs.LANCode.condition0IsTrue_0.val) {
gdjs.LANCode.GDenemyObjects1.createFrom(runtimeScene.getObjects("enemy"));
{for(var i = 0, len = gdjs.LANCode.GDenemyObjects1.length ;i < len;++i) {
gdjs.LANCode.GDenemyObjects1[i].addForce(0, -(150), 0);
player1 = gdjs.LANCode.GDenemyObjects1[i];
Player1();
}
}}
}
{
gdjs.LANCode.condition0IsTrue_0.val = false;
{
gdjs.LANCode.condition0IsTrue_0.val = gdjs.evtTools.input.isKeyPressed(runtimeScene, "Down");
}if (gdjs.LANCode.condition0IsTrue_0.val) {
gdjs.LANCode.GDenemyObjects1.createFrom(runtimeScene.getObjects("enemy"));
{for(var i = 0, len = gdjs.LANCode.GDenemyObjects1.length ;i < len;++i) {
gdjs.LANCode.GDenemyObjects1[i].addForce(0, 150, 0);
player1 = gdjs.LANCode.GDenemyObjects1[i];
Player1();
}
}}
}
{
gdjs.LANCode.condition0IsTrue_0.val = false;
{
gdjs.LANCode.condition0IsTrue_0.val = gdjs.evtTools.input.isKeyPressed(runtimeScene, "Left");
}if (gdjs.LANCode.condition0IsTrue_0.val) {
gdjs.LANCode.GDenemyObjects1.createFrom(runtimeScene.getObjects("enemy"));
{for(var i = 0, len = gdjs.LANCode.GDenemyObjects1.length ;i < len;++i) {
gdjs.LANCode.GDenemyObjects1[i].addForce(-(150), 0, 0);
player1 = gdjs.LANCode.GDenemyObjects1[i];
Player1();
}
}}
}
{
gdjs.LANCode.condition0IsTrue_0.val = false;
{
gdjs.LANCode.condition0IsTrue_0.val = gdjs.evtTools.input.isKeyPressed(runtimeScene, "Right");
}if (gdjs.LANCode.condition0IsTrue_0.val) {
gdjs.LANCode.GDenemyObjects1.createFrom(runtimeScene.getObjects("enemy"));
{for(var i = 0, len = gdjs.LANCode.GDenemyObjects1.length ;i < len;++i) {
gdjs.LANCode.GDenemyObjects1[i].addForce(150, 0, 0);
player1 = gdjs.LANCode.GDenemyObjects1[i];
Player1();
}
}}
}
//PLAYER MOVEMENTS --------------------------------------------------------------------------
function Player1() {
// console.log(gdjs.LANCode.GDenemyObjects1[0])
data = {
id: player1.id,
x: player1.x,
y: player1.y
}
// console.log(data);
socket.emit('move', data)
socket.on('heartbeat', function(data) {
console.log(data)
})
};
Вот мой код на стороне сервера:
var express = require('express');
var app = express();
var http = require('http').Server(app);
var cors = require('cors')
app.use(cors())
app.use(express.json());
app.use('/js', express.static(__dirname + '/js'));
app.use('/plugins', express.static(__dirname + '/plugins'));
app.use('/Extensions', express.static(__dirname + '/Extensions'));
app.use(express.static(__dirname + '/'));
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
http.listen(8001)
console.log('Listening on localhost:8001');
var io = require('socket.io')(http);
io.on('connection', function(socket){
console.log('a user connected: ' + socket.id);
socket.on('move', function(data) {
console.log("Received: 'move' ", " | ", "id: ",data.id, " | ", "x: ",data.x, " | ", "y: ",data.y, "| ", "socket.id: ",socket.id)
socket.broadcast.emit('move', data);
io.sockets.emit('heartbeat', data);
})
socket.on('disconnect', function(){
console.log('user ' + socket.id + ' disconnected');
});
});
Так что здесь происходит каждый раз, когда нажимается клавиша движения (так : вверх, вниз, влево, вправо) он вызывает функцию Player1, поэтому он принимает x, y, id игрока. Затем я отправляю эти данные на сервер. Затем я беру эти данные и отправляю их всем клиентам с вещанием. Ранее я пытался обновить исходную позицию игрока с помощью новых x, y, возвращенных с сервера, но это заставляет игрока буйствовать на карте.
Я действительно застрял на этом, ошибок нет на любой консоли он просто не хочет переходить на экраны других клиентов. Любая помощь будет принята с благодарностью! Скажите мне, если вам нужно больше, чтобы понять, или если вы думаете, что что-то, что вам нужно увидеть, отсутствует.
Спасибо!