在 Lance 游戏中向个别玩家发送“秘密”数据

5
我想知道在lance-gg中是否有一种简单的方法只向每个玩家发送特定的数据,而不是向所有玩家发射所有数据。我希望创建一个扑克游戏,并且不希望广播每个玩家手中的牌,并且只希望每个玩家接收关于自己的牌的信息。在当前的GameEngine和ServerEngine之间是否容易实现这一点?
在游戏过程中,需要执行以下步骤:
- 向每个玩家“发牌”(将每张牌单独发给每个玩家,并广播事件以指示其他客户端应该动画地处理玩家被发牌的情况) - 存储和保留已发牌的牌,不包括其他要更新的数据 - 如果玩家在手中断开连接然后重新连接,则检索玩家的牌 - “揭示”牌(将任何揭示的牌如翻牌和亮牌广播给所有玩家)
玩家的牌也需要存储在服务器上,但不需要在每个步骤中重新广播。
1个回答

8
在Lance中,有一个低层级的网络层可以用于客户端和服务器之间的通信。
举个例子,如果服务器想要向所有客户端发送带有数据shakeData = { ... }的事件shakeItUp,游戏的serverEngine会调用以下代码:
this.io.sockets.emit('shakeItUp', shakeData);

为了向特定的玩家发送事件和数据,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);
}

客户端在连接建立后,从ClientEngine子类中监听消息:
// extend ClientEngine connect to add own events
connect() {
    return super.connect().then(() => {
        this.socket.on('secret', (e) => {
            console.log(`my secret: ${e}`);
        });
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接