Nodejs 打造 多人对战游戏服务器(幼儿园级)

Nodejs 打造 多人对战游戏服务器(幼儿园级)

enter image description here 使用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;

}

最后感言: 本人是新手,发篇文章互动一下实属不易。不周之处,还望高手轻点儿拍砖。


5 回复

Node.js 打造 多人对战游戏服务器(幼儿园级)

在这个教程中,我们将使用 Node.js 和 Socket.IO 来创建一个简单的多人对战游戏服务器。我们将实现基本的功能,包括玩家登录、游戏启动和同步玩家状态。

使用 socket.set 和 socket.get 存取玩家信息

首先,我们需要定义一个玩家对象,并使用 socket.setsocket.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实现玩家注册、同步数据以及断开连接的处理。可以根据具体需求扩展更多的功能,例如游戏房间管理、游戏状态同步等。

回到顶部