向Lance Game中的个人玩家发送"秘密"数据

Mik*_*ter 4 javascript multiplayer socket.io lance

我想知道在lance-gg中是否有一种简单的方法可以仅向每个玩家发送玩家特定数据,而不是向所有玩家发送所有数据.

我希望创建一个扑克游戏,并且不希望每个玩家所持有的数据都向所有玩家广播,而只是让每个玩家都收到有关他们自己的牌的信息.

这在目前的GameEngine和ServerEngine之间是否可以轻松实现?

在游戏过程中,需要执行以下步骤:

  • 向每个玩家"交易"牌(单独向每个玩家发卡),并且还广播一个事件以指示其他客户应该为正在发牌的玩家动画接收它们的卡片.
  • 将待处理的卡存储在其他要更新的数据之外
  • 如果播放器断开连接,则检索播放器卡,然后在手中重新连接
  • "揭示"牌(向所有玩家广播任何显示的牌,如翻牌和摊牌)

玩家的牌也需要存储在服务器上,但不能在每一步重新广播.

Gar*_*iss 7

有一个低层网络层,可用于Lance中的客户端 - 服务器通信.

例如,如果服务器想要将shakeItUp包含数据的事件发送shakeData = { ... }到所有客户端,则游戏的serverEngine将调用:

this.io.sockets.emit('shakeItUp', shakeData);
Run Code Online (Sandbox Code Playgroud)

要将事件和数据发送给特定的播放器,serverEngine类可以做到

for (let socketId of Object.keys(this.connectedPlayers)) {
    let player = this.connectedPlayers[socketId];
    let playerId = player.socket.playerId;

    let message = `hello player ${playerId}`;
    this.connectedPlayers[socketId].socket.emit('secret', message);
}
Run Code Online (Sandbox Code Playgroud)

建立连接后,客户端将侦听来自ClientEngine子类的消息:

// extend ClientEngine connect to add own events
connect() {
    return super.connect().then(() => {
        this.socket.on('secret', (e) => {
            console.log(`my secret: ${e}`);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)