Nodejs 打造 多人对战游戏服务器(幼儿园级)
Nodejs 打造 多人对战游戏服务器(幼儿园级)
使用socket.set 和 socket.get 在存取玩家信息
socket.get('playerinfo', function (err, player) {
if(player == null) {
console.log("[new player]",data.name);
var player = new Player(socket, data);
}
else
{
console.log("[wait player visit again]",data.name);
socket.emit('error', "you have registered");
return ;
}
socket.set('playerinfo', player, function () {
usersWS.push(player);
console.log("[wait player numer]",usersWS.length);
//这在里如果玩家状态和数量满足要求就可以开始游戏了
Physic.CreatePhysicWorld(p1, p2);
//通知client 启动 游戏
…………..
}); //set
}); //get
}) //socket.on
转发 和处理 玩家的输入
socket.on('sync', function (data) {
socket.get('playerinfo', function (err, player) {
if(player != null) {
//var target = usersWS[i].socket;
var room = player.room;
for(var i=0;i<room.players.length;i++)
{
if(room.players[i].id ==player.id)
{
//console.log("this is msg from id:",room.players[i].id)
}
else
{
room.players[i].socket.emit('sync', data);
//console.log("send to id:",room.players[i].id)
}
//room.players[i].socket.emit('sync', data);
}
}//if
else
{
socket.emit('error',"no session");
}
}); //get
}); //socket.on
}); //Network.on
定义一个简单的玩家对象
function Player(socket, data)
{
var newplayer = {
socket: socket,
id: player_next_id++,
tankType: 0,
name: data.name,
isMain: data.isMain,
ip: socket.remoteAddress,
status: '未准备',
// isAI: false, room: null }; newplayer.proto = Player.prototype; return newplayer; }
定义一个游戏房间对象
function Room(title)
{
var newroom = {
id: room_next_id++,
is_in_game: false, // 判断改房间的游戏是否已经开始
players: [],
map: 0,
title: title,
game: null
};
room_list.push(newroom);
newroom.__proto__ = Room.prototype;
return newroom;
}
最后感言: 本人是新手,发篇文章互动一下实属不易。不周之处,还望高手轻点儿拍砖。
Node.js 打造 多人对战游戏服务器(幼儿园级)
在这个教程中,我们将使用 Node.js 和 Socket.IO 来创建一个简单的多人对战游戏服务器。我们将实现基本的功能,包括玩家登录、游戏启动和同步玩家状态。
使用 socket.set 和 socket.get 存取玩家信息
首先,我们需要定义一个玩家对象,并使用 socket.set
和 socket.get
方法来存储和获取玩家信息。
const io = require('socket.io')(server);
let usersWS = [];
let player_next_id = 1;
function Player(socket, data) {
return {
socket: socket,
id: player_next_id++,
tankType: 0,
name: data.name,
isMain: data.isMain,
ip: socket.remoteAddress,
status: '未准备',
room: null
};
}
io.on('connection', socket => {
socket.on('login', data => {
socket.get('playerinfo', (err, player) => {
if (player == null) {
console.log("[new player]", data.name);
const player = Player(socket, data);
socket.set('playerinfo', player, () => {
usersWS.push(player);
console.log("[wait player number]", usersWS.length);
// 如果玩家数量满足要求,可以开始游戏
if (usersWS.length >= 2) {
const [p1, p2] = usersWS.slice(0, 2);
Physic.CreatePhysicWorld(p1, p2);
socket.emit('startGame');
}
});
} else {
console.log("[wait player visit again]", data.name);
socket.emit('error', "you have registered");
}
});
});
});
转发和处理玩家的输入
接下来,我们需要处理玩家的输入并将其同步给其他玩家。
io.on('connection', socket => {
socket.on('sync', data => {
socket.get('playerinfo', (err, player) => {
if (player != null) {
const room = player.room;
for (let i = 0; i < room.players.length; i++) {
if (room.players[i].id !== player.id) {
room.players[i].socket.emit('sync', data);
}
}
} else {
socket.emit('error', "no session");
}
});
});
});
定义一个简单的玩家对象
我们定义了一个简单的玩家对象,包含一些基本信息。
function Player(socket, data) {
return {
socket: socket,
id: player_next_id++,
tankType: 0,
name: data.name,
isMain: data.isMain,
ip: socket.remoteAddress,
status: '未准备',
room: null
};
}
定义一个游戏房间对象
我们还需要定义一个游戏房间对象来管理玩家和游戏状态。
let room_list = [];
function Room(title) {
return {
id: room_next_id++,
is_in_game: false,
players: [],
map: 0,
title: title,
game: null
};
}
io.on('connection', socket => {
socket.on('joinRoom', data => {
const room = getRoomById(data.roomId);
if (room) {
room.players.push(Player(socket, data));
Player(socket, data).room = room;
socket.join(room.id);
}
});
});
function getRoomById(id) {
return room_list.find(room => room.id === id);
}
最后感言
以上就是使用 Node.js 和 Socket.IO 构建简单多人对战游戏服务器的基本步骤。希望这个简单的示例能帮助你理解如何构建一个基础的游戏服务器。如果你有任何问题或建议,请随时留言交流!
加点定时调度,场景管理,登入验证等等就可以升级为小学了吧,哈哈
啥时候升学呀
在打造一个简单的多人对战游戏服务器时,可以利用Node.js结合WebSocket来实现客户端与服务器之间的实时通信。下面是一个基于Socket.IO的简单实现,包含玩家管理、房间管理和游戏逻辑。
1. 初始化项目
首先确保安装了socket.io
:
npm install socket.io
2. 创建服务端代码
服务端主要逻辑
const io = require('socket.io')(server);
let usersWS = [];
let room_list = [];
let player_next_id = 0;
let room_next_id = 0;
io.on('connection', function(socket) {
socket.on('register', function(data) {
socket.get('playerinfo', function(err, player) {
if (!player) {
const player = new Player(socket, data);
socket.set('playerinfo', player, function() {
usersWS.push(player);
socket.emit('registered', { message: "Registration successful" });
});
} else {
socket.emit('error', "You have already registered.");
}
});
});
socket.on('sync', function(data) {
socket.get('playerinfo', function(err, player) {
if (player) {
const room = findRoomByPlayer(player);
if (room) {
for (const otherPlayer of room.players) {
if (otherPlayer.socket !== socket) {
otherPlayer.socket.emit('sync', data);
}
}
}
} else {
socket.emit('error', "No session found.");
}
});
});
socket.on('disconnect', function() {
socket.get('playerinfo', function(err, player) {
if (player) {
usersWS = usersWS.filter(u => u !== player);
const room = findRoomByPlayer(player);
if (room) {
room.players = room.players.filter(p => p.socket !== socket);
}
}
});
});
});
function Player(socket, data) {
return {
socket: socket,
id: player_next_id++,
tankType: 0,
name: data.name,
isMain: data.isMain,
ip: socket.handshake.address,
status: '未准备',
room: null
};
}
function findRoomByPlayer(player) {
return room_list.find(r => r.players.some(p => p.socket === player.socket));
}
3. 客户端代码
客户端代码需要连接到服务器并发送事件以注册玩家和同步数据。
HTML + JavaScript
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
document.getElementById('register-btn').onclick = function() {
socket.emit('register', { name: document.getElementById('name').value, isMain: true });
};
document.getElementById('sync-btn').onclick = function() {
socket.emit('sync', { data: 'some data' });
};
</script>
总结
这段代码展示了如何创建一个基本的多人对战游戏服务器。通过Socket.IO实现玩家注册、同步数据以及断开连接的处理。可以根据具体需求扩展更多的功能,例如游戏房间管理、游戏状态同步等。