我想用SignalR创建一个“连接四人”多人游戏。我可以在两个不同的设备上与另一个玩家对战,但是如果有第三个人连接,则没有任何效果可以想象。我的主要问题是创建一个 2个连接限制的SignalR组。如果有第三个人连接,则应创建一个新的组,而不要输入第一个组。另外我也不明白如何在我的JavaScript代码中使用组。
我试图将每个connectionID存储在哈希集中,但是每次连接数为奇数时,我都不知道如何创建 new 组。
public static class UserHandler
{
public static HashSet<string> ConnectedIds = new HashSet<string>();
}
public class OnlinegameHub : Hub
{
public void SendUserInformation(string username, int colorCode)
{
Clients.Others.getUserInformation(username, colorCode);
}
public void SendTurn(int col, int colorCode, string yourColor)
{
Clients.Others.updateBoard(col, colorCode, yourColor);
}
public Task JoinLobby(string groupName)
{
return Groups.Add(Context.ConnectionId, groupName);
}
public override Task OnConnected()
{
UserHandler.ConnectedIds.Add(Context.ConnectionId);
return base.OnConnected();
}
}
//Javascript part
$.connection.hub.start().done(function () {
game.server.sendUserInformation(playerOneUsername, yourCode);
$(".column").click(function () {
if (yourTurn) {
game.server.sendTurn($(this).index(), yourCode, yourColor);
insertColorCode(yourCode, $(this).index());
yourTurn = false;
$(".turn-text").html("It's " + playerTwoUsername + "'s turn");
}
});
});
答案 0 :(得分:1)
您必须在代码中处理不同的组,每个玩家都将位于同一SignalR集线器上,然后您的应用程序必须处理这些组。建议您阅读有关网上论坛的文档:https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/working-with-groups
示例非常明确:
public class ContosoChatHub : Hub
{
public Task JoinRoom(string roomName)
{
return Groups.Add(Context.ConnectionId, roomName);
}
public Task LeaveRoom(string roomName)
{
return Groups.Remove(Context.ConnectionId, roomName);
}
}
当然,您必须维护一个房间列表,然后当新玩家到达时,请查看此列表以找到可用房间或创建一个新房间。