#javascript #node.js #socket.io
#javascript #node.js #socket.io
Вопрос:
В настоящее время я нахожусь в процессе создания своей собственной простой многопользовательской игры с использованием сокета.ввод-вывод и node.js . В настоящее время два пользователя могут подключиться и получить ту часть экрана, которую они будут занимать.
Я пытаюсь заставить клиентов отправлять пакет данных при каждом нажатии клавиши со стрелкой. Либо данные никогда не отправляются, либо никогда не принимаются сервером, потому что ничего об этом не выводится на консоль сервера.
Вот мой код в его нынешнем виде: (init вызывается в intex.html файл)
клиент:
var canvas
var ctx
var side = ""
var theinterval
var keys = []
var RHSpaddley = 200
var LHSpaddley = 200
var side = "null"
var socket
function init() {
canvas = document.getElementById("gameCanvas");
ctx = canvas.getContext("2d");
socket = io.connect("http://localhost:8000", { transports: ["websocket"]});
setEventHandlers();
}
function setEventHandlers() {
// Keyboard
window.addEventListener("keydown", function (e) {
keys[e.keyCode] = true;
});
window.addEventListener("keyup", function (e) {
keys[e.keyCode] = false;
});
// Window resize
//window.addEventListener("resize", onResize, false);
socket.on("connect", onSocketConnected);
socket.on("disconnect", onSocketDisconnect);
socket.on("new player", newPlayer)
socket.on('message', function (message) {
console.log(message);
});
socket.on('start game', startGame)
};
function onSocketConnected() {
console.log("Connected to socket server");
};
function onSocketDisconnect() {
console.log("Disconnected from socket server");
};
function newPlayer(data) {
console.log("here")
document.getElementById("title").innerHTML = data.clientsIn
console.log("clientsin is " data.clientsIn)
if(side == "null") {
if(data.clientsIn == 1) {
side = "left"
console.log("side is left")
} else if(data.clientsIn == 2) {
side = "right"
console.log("side is right")
} else {
console.log("more than two players dectected")
}
}
}
function startGame() {
theinterval = setInterval(main, 1);
}
function main() {
doKeys()
}
function doKeys() {
//s
if(side == "left") {
console.log("left")
if(keys[40]) {
if ((LHSpaddley 70) <= 400) {
console.log("sendingmovement")
socket.emit("LHS")
}
}
//w
if(keys[38]) {
if (LHSpaddley >= 0) {
console.log("sendingmovement")
socket.emit("LHS")
}
}
}
if(side == "right") {
console.log("right")
if(keys[38]) {
if (RHSpaddley >= 0) {
console.log("sendingmovement")
socket.emit("RHS")
}
}
//down
if(keys[40]) {
if ((RHSpaddley 70) <=400 ) {
console.log("sendingmovement")
socket.emit("RHS")
}
}
}
}
И вот мой код на стороне сервера:
var util = require("util");
var express = require('express');
var app = express()
var http = require('http').Server(app);
var socket = require('socket.io')(http);
var clientsIn = 0
//game vars
var LHSpaddley = 200
var RHSpaddley = 200
var WIDTH = 600;
var HEIGHT = 400;
var ballx = 200;
var bally = 200;
var LHSpaddley = 200;
var RHSpaddley = 200;
var changex = 1;
var changey = 1;
var RHSscore = 0;
var LHSscore = 0;
var keys = [];
var hasHit = false;
var theinterval
app.get('/', function(req, res){
res.sendFile(__dirname '/public/index.html');
});
http.listen(8000, function(){
console.log('listening on port 8000');
});
app.use(express.static('public'));
function init() {
players = [];
theinterval = setInterval(getReady, 1)
util.log("setting event handlers")
setEventHandlers()
}
init()
function setEventHandlers() {
socket.sockets.on("connection", onSocketConnection);
//socket.sockets.on("RHS", RHSmove)
//socket.sockets.on("LHS", LHSmove)
socket.sockets.on('message', function (message) {
console.log(message);
});
}
function onSocketConnection(client) {
util.log("New player has connected: " client.id);
clientsIn
socket.emit("new player", {clientsIn: clientsIn});
console.log("emitted");
client.on("disconnect", onClientDisconnect);
}
function onClientDisconnect() {
util.log("Player has disconnected: " this.id);
clientsIn = clientsIn - 1
socket.sockets.emit("player left");
};
function getReady() {
if(clientsIn == 2) {
clearInterval(theinterval)
socket.sockets.emit("start game")
console.log("game started")
}
}
function LHSmove() {
console.log("LHS")
}
function RHSmove() {
console.log("RHS")
}
Спасибо!
—Boi
Комментарии:
1.
onSocketConnected
Правильно ли вызывается метод? Можете ли вы подтвердить, что вы правильно подключены к серверу сокетов с клиента? Другими словами, убедитесь, чтоinit
функция выполнена правильно иsocket
переменная инициализирована правильно.2. Да, когда клиент подключается, я получаю сообщение в терминале о том, что подключился новый игрок. Затем клиент может получать информацию с сервера, а не наоборот.
3. Круто! Итак, в
main
методе, в котором вы определяете все движения, видите ли вы журналы дляsendingmovement
etc в своей консоли? Попробуйте зарегистрировать весьsocket
объект в вашей консоли вdoKeys
функции. Если вы можете подтвердить правильность объекта сокета, попробуйте проверить сетевую панель в chrome dev tools, она позволяет отслеживать запросы.4. Хорошо, итак, я заранее отправил sendingmovement в консоль. Я заменил эту часть кода на console.log (сокет) для каждой из четырех возможностей. Я выхожу из «Socket {io: Manager, nsp: «/», json: Socket, ids: 0, acks: Object …}». Кстати, спасибо за всю помощь!
5. Я перепробовал все, что мог придумать, но, похоже, ничего из того, что я пробовал, не работает.