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

时间:2017-06-04 08:28:26

标签: javascript socket.io multiplayer lance

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:7)

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

例如,如果服务器想要将包含数据var list = db.Student.Join(db.School, s => s.SchoolId, sc => sc.Id, (s, sc) => new { s, sc }) .Where(ss => ss.sc.Name=="jack") .Select(ss => ss.s).ToList(); 的事件shakeItUp发送给所有客户,则游戏的 serverEngine 会调用:

shakeData = { ... }

要向特定玩家发送事件和数据, serverEngine 类可以执行

this.io.sockets.emit('shakeItUp', shakeData);

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

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);
}