Отображение Js перемещений объектов на компьютерах других клиентов с помощью Socket.IO - PullRequest
0 голосов
/ 12 февраля 2020

Я играю в 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, возвращенных с сервера, но это заставляет игрока буйствовать на карте.

Я действительно застрял на этом, ошибок нет на любой консоли он просто не хочет переходить на экраны других клиентов. Любая помощь будет принята с благодарностью! Скажите мне, если вам нужно больше, чтобы понять, или если вы думаете, что что-то, что вам нужно увидеть, отсутствует.

Спасибо!

...