/// <summary> /// This function is to unpack all the data received from a client. /// </summary> /// <param name="ar">Status of the asynchronous operation</param> private void OnReceive(IAsyncResult ar) { try { //Required variables IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0); EndPoint epSender = (EndPoint)ipeSender; serverSocket.EndReceiveFrom(ar, ref epSender); byte[] message; //Transform the array of bytes received from the user into an //intelligent form of object Data Data msgReceived = new Data(byteData); //We will send this object in response the users request Data msgToSend = new Data(); //If the message is to login, logout, or simple text message //then when send to others the type of the message remains the same msgToSend.cmdCommand = msgReceived.cmdCommand; msgToSend.strName = msgReceived.strName; //Check which kind of message we received switch (msgReceived.cmdCommand) { case Command.Login: //When a user logs in to the server then we add her to our //list of clients if (playercount == 0) { //Setup player 1 Player player1 = new Player(); ClientInfo clientInfo = new ClientInfo(); clientInfo.endpoint = epSender; clientInfo.strName = msgReceived.strName; msgToSend.cmdCommand = Command.Login; msgToSend.id = playercount; clientList.Add(clientInfo); player1.x = 100; player1.y = 100; player1.radius = 16; player1.playername = msgReceived.strName; player1.id = playercount; playerList.Add(player1); playercount = playercount + 1; //Setup planets (1 for now) Planets planet = new Planets(); planet.x = 400; planet.y = 300; planet.radius = 32; planet.mass = 150; planetList.Add(planet); planetcount = 1; //Set the text of the message that we will broadcast to all users (doesn't currently do much) msgToSend.strMessage = "<<<" + msgReceived.strName + " has joined the room>>>"; msgToSend.cmdCommand = Command.Login; } else { //Setup player 2 Player player2 = new Player(); ClientInfo clientInfo = new ClientInfo(); clientInfo.endpoint = epSender; clientInfo.strName = msgReceived.strName; msgToSend.id = playercount; player2.id = playercount; clientList.Add(clientInfo); player2.x = 700; player2.y = 500; player2.radius = 16; player2.playername = msgReceived.strName; player2.id = playercount; playerList.Add(player2); playercount = playercount + 1; //Set the text of the message that we will broadcast to all users msgToSend.strMessage = "<<<" + msgReceived.strName + " has joined the room>>>"; msgToSend.cmdCommand = Command.Login; } break; //End case login case Command.Create: //Create objects (not currently in use) break; //End case create case Command.Logout: //When a user wants to log out of the server then we search for her //in the list of clients and close the corresponding connection //TODO: Fix logout errors. int nIndex = 0; foreach (ClientInfo client in clientList) { if (client.endpoint == epSender) { clientList.RemoveAt(nIndex); break; } ++nIndex; } //Set the text of the message that we will broadcast to all users msgToSend.strMessage = "<<<" + msgReceived.strName + " has left the room>>>"; break; //End case logout case Command.Message: //Set the text of the message that we will broadcast to all users msgToSend.strMessage = msgReceived.strName + ": " + msgReceived.strMessage; break;//End case message case Command.Move: //Setup the move command msgToSend = PlayerAction(msgReceived); msgToSend.cmdCommand = msgReceived.cmdCommand; break;//End case move case Command.List: //Send the names of all users in the chat room to the new user msgToSend.cmdCommand = Command.List; msgToSend.strName = null; msgToSend.strMessage = null; //Collect the names of the user in the chat room foreach (ClientInfo client in clientList) { //To keep things simple we use asterisk as the marker to separate the user names msgToSend.strMessage += client.strName + "*"; } //Setup our message to send message = msgToSend.ToByte(playerList, bulletList, removeids, playercount, planetList); //Send the name of the users in the chat room serverSocket.BeginSendTo(message, 0, message.Length, SocketFlags.None, epSender, new AsyncCallback(OnSend), epSender); break; }//End command list //TODO: Add check to see if it is a login, if it is send the players ID to the client //When the client receives the login response it will set the users ID to the correct value if (msgToSend.cmdCommand == Command.Login) { //Send the login message message = msgToSend.ToByte(playerList, bulletList, removeids, playercount, planetList); serverSocket.BeginSendTo(message, 0, message.Length, SocketFlags.None, epSender, new AsyncCallback(OnSend), epSender); msgToSend.cmdCommand = Command.Create; message = msgToSend.ToByte(playerList, bulletList, removeids, playercount, planetList); serverSocket.BeginSendTo(message, 0, message.Length, SocketFlags.None, epSender, new AsyncCallback(OnSend), epSender); msgToSend.cmdCommand = Command.Login; } if (msgToSend.cmdCommand != Command.List) { //Setup the list message message = msgToSend.ToByte(playerList, bulletList, removeids, playercount, planetList); foreach (ClientInfo clientInfo in clientList) { //Send the message to all users serverSocket.BeginSendTo(message, 0, message.Length, SocketFlags.None, clientInfo.endpoint, new AsyncCallback(OnSend), clientInfo.endpoint); } } //If the user is logging out then we need not listen from her //Start listening to the message send by the user serverSocket.BeginReceiveFrom(byteData, 0, byteData.Length, SocketFlags.None, ref epSender, new AsyncCallback(OnReceive), epSender); } //Exception handling catch (Exception ex) { MessageBox.Show(ex.Message, "GameUDPServer", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
/// <summary> /// In case a collison is detected, this function should be called to treat how a player instance will respond in collison with another object /// </summary> /// <param name="object2">An instance to a Planets</param> public void treatCollision(Planets object2) { if (object2 is Planets) { this.speedX = this.speedX * (float)(-0.25); this.speedY = this.speedY * (float)(-0.25); } }
public void TreatCollision(Planets object2) { //The powerup spawned on a planet - move it to a new location this.randomizePosition(); }