5

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

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

这在当前的 GameEngine 和 ServerEngine 之间很容易实现吗?

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

  • 向每个玩家“发”牌(分别向每个玩家发出牌,并广播一个事件以指示其他客户端应该为收到牌的玩家设置动画)
  • 在要更新的其他数据之外存储和保存发牌
  • 如果玩家断开连接然后在手牌过程中重新连接,则检索玩家卡
  • “展示”牌(向所有玩家广播任何展示的牌,如翻牌和摊牌牌)

玩家的卡片也需要存储在服务器上,但不是每一步都重新广播。

4

1 回答 1

8

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

例如,如果服务器想向所有客户端发送shakeItUp带有数据的事件shakeData = { ... },游戏的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}`);
        });
    });
}
于 2017-06-04T08:51:48.403 回答