/// <summary> /// Joins new player to this game /// </summary> /// <param name="player"></param> public void JoinPlayer(PongPlayer player) { lock (_syncRoot) { if (_players[LeftPlayer] != null && _players[RightPlayer] != null) { throw new InvalidOperationException(); } player.SetGame(this); player.PlayerDisconnected += OnPlayerDisconnected; player.PlayerMoved += OnPlayerMoved; if (_players[LeftPlayer] == null) { _players[LeftPlayer] = player; State = GameState.WaitingForPlayer; } else { _players[RightPlayer] = player; // we have two players, so start the game State = GameState.InProgress; StartBall(); } } }
public void ProcessRequest(HttpContext context) { if (context.IsWebSocketRequest) { // create a player var player = new PongPlayer(); PongApp.JoinPlayer(player); // start receiving from socket context.AcceptWebSocketRequest(player.Receiver); } }
private void OnPlayerMoved(PongPlayer player, PlayerPositionMessage position) { var otherPlayer = OtherPlayer(player); if (otherPlayer != null) { // send new player position to the other player otherPlayer.SendMessage(new PlayerPositionMessage { YPos = player.YPos }); } }
/// <summary> /// Joins new player to existing game or creates new one /// </summary> /// <param name="player"></param> public static void JoinPlayer(PongPlayer player) { lock (_syncRoot) { var game = _games.Where(g => g.State == GameState.WaitingForPlayer).FirstOrDefault(); if (game == null) { game = new PongGame(); _games.Add(game); game.GameOver += OnGameOver; } game.JoinPlayer(player); } }
private void OnPlayerDisconnected(PongPlayer player) { lock (_syncRoot) { // stop the ball moving task _ballCancellationTokenSource.Cancel(); var otherPlayer = OtherPlayer(player); if (otherPlayer != null) { // close connection to other player, which means game is over otherPlayer.Close(); } if (GameOver != null) { GameOver(this); } } }
/// <summary> /// Joins new player to this game /// </summary> /// <param name="player"></param> public void JoinPlayer(PongPlayer player) { lock (_syncRoot) { if (_players[LeftPlayer] != null && _players[RightPlayer] != null) throw new InvalidOperationException(); player.SetGame(this); player.PlayerDisconnected += OnPlayerDisconnected; player.PlayerMoved += OnPlayerMoved; if (_players[LeftPlayer] == null) { _players[LeftPlayer] = player; State = GameState.WaitingForPlayer; } else { _players[RightPlayer] = player; // we have two players, so start the game State = GameState.InProgress; StartBall(); } } }
public int GetPlayerIndex(PongPlayer player) { return Array.IndexOf(_players, player); }
private void OnPlayerDisconnected(PongPlayer player) { lock (_syncRoot) { // stop the ball moving task _ballCancellationTokenSource.Cancel(); var otherPlayer = OtherPlayer(player); if (otherPlayer != null) { // close connection to other player, which means game is over otherPlayer.Close(); } if (GameOver != null) GameOver(this); } }
public PongPlayer OtherPlayer(PongPlayer thisPlayer) { var index = GetPlayerIndex(thisPlayer); return _players[index == LeftPlayer ? RightPlayer : LeftPlayer]; }
public PongPlayer OtherPlayer(PongPlayer thisPlayer) { var index = GetPlayerIndex(thisPlayer); return(_players[index == LeftPlayer ? RightPlayer : LeftPlayer]); }
public int GetPlayerIndex(PongPlayer player) { return(Array.IndexOf(_players, player)); }