@ -264,34 +264,36 @@ int main(int argc, char** argv) {
if ( game_started ) {
if ( game_started ) {
/* Serialize the data that we need to send, and then send it to the peer paddle */
/* Serialize the data that we need to send, and then send it to the peer paddle */
if ( type . mode = = M_SERVER ) {
if ( type . mode = = M_SERVER ) {
/* Serial_create_data creates a Serial_Data struct from our values, and Serial_serialize serializes it Paddle 2 is controled by the server, Paddle 1, by the client.*/
/* Serial_create_data creates a Serial_Data struct from our values.
to_send_data = Serial_create_data ( pad2 . getRect ( ) . x , pad2 . getRect ( ) . y , ball . pos . x , ball . pos . y ) ;
Paddle 2 is controlled by the server , Paddle 1 , by the client . */
to_send_data = Serial_create_data ( pad2 . getRect ( ) . x , pad2 . getRect ( ) . y , ball . pos . x , ball . pos . y , false ) ;
}
}
else if ( type . mode = = M_CLIENT ) {
else if ( type . mode = = M_CLIENT ) {
/* The _server_ is the authoritative peer for the ball position, so the client sends (0, 0) as the ball position instead of actually sending a position */
/* The _server_ is the authoritative peer for the ball position, so the client sends (0, 0) as the ball position instead of actually sending a position */
to_send_data = Serial_create_data ( pad1 . getRect ( ) . x , pad1 . getRect ( ) . y , 0 , 0 );
to_send_data = Serial_create_data ( pad1 . getRect ( ) . x , pad1 . getRect ( ) . y , 0 , 0 , false );
}
}
/* Only send and receive data if the game is not in single player mode */
/* Only send and receive data if the game is not in single player mode */
if ( type . mode ! = M_SINGLE ) {
if ( type . mode ! = M_SINGLE ) {
/* Serial_serialize serializes the struct into a byte_array. Since sendAll accepts a string, we have to convert this byte array into a string. */
type . netsock - > sendAll ( ( char * ) Serial_serialize ( to_send_data ) , 9 ) ;
type . netsock - > sendAll ( ( char * ) Serial_serialize ( to_send_data ) , sizeof ( Serial_Data ) + 1 ) ;
/* Create Serial_data struct from the response of the server. Since recvAll returns a char*, we need to convert it to a byte array */
/* Create Serial_data struct from the response of the server. Since recvAll returns a char*, we need to convert it to a byte array */
uint8_t * response_array = ( uint8_t * ) ( type . netsock - > recvAll ( ) ) ;
uint8_t * response_array = ( uint8_t * ) ( type . netsock - > recvAll ( ) ) ;
if ( response_array ! = NULL ) {
if ( response_array ! = NULL ) {
/* If the response is NULL, that means it timed-out. In this case, there's no value to print */
response_data = Serial_deserialize ( response_array ) ;
response_data = Serial_deserialize ( response_array ) ;
std : : cout < < response_data . pad_x < < " \t " < < response_data . pad_y < < " \t " < < response_data . ball_x < < " \t " < < response_data . ball_y < < std : : endl ;
std : : cout < < response_data . pad_x < < " \t " < < response_data . pad_y < < " \t " < < response_data . ball_x < < " \t " < < response_data . ball_y < < std : : endl ;
} else {
} else {
/* If the response is NULL, that means it timed-out. In this case, there's no value to print */
std : : cout < < " NOTHING RECEIVED " < < std : : endl ;
std : : cout < < " NOTHING RECEIVED " < < std : : endl ;
}
}
}
}
/* When updating the paddle positions, update the peer paddle's positions based on the vector set earlier */
/* Check to see if peer has quit the game */
if ( response_data . should_quit = = true ) {
std : : string to_send = " " ;
std : : cout < < " Peer unexpectedly quit game. " < < std : : endl ;
/* Update paddle velocity */
break ; // Break out of main game loop
}
/* Left paddle (controlled by client) - I use type.mode != M_SERVER, because I also want the single player
/* Left paddle (controlled by client) - I use type.mode != M_SERVER, because I also want the single player
mode to be able to control the paddle . Therefore , the only mode that _can ' t_ control the paddle is the server
mode to be able to control the paddle . Therefore , the only mode that _can ' t_ control the paddle is the server
mode . */
mode . */
@ -327,7 +329,8 @@ int main(int argc, char** argv) {
pad2 . velocity . y = 0 ;
pad2 . velocity . y = 0 ;
}
}
/* The client should set the ball position based on the data sent by the server. It doesn't have to do any calculations of its own. */
/* Why did I use 'type.mode != M_CLIENT'? - The client should set the ball position solely based
on the data sent by the server . It doesn ' t have to do any calculations of its own . */
if ( type . mode ! = M_CLIENT ) {
if ( type . mode ! = M_CLIENT ) {
/* Update ball velocity based on collision detection */
/* Update ball velocity based on collision detection */
if ( pad1 . getRect ( ) . CheckCollision ( ball . pos , ball . radius ) ) { /* Collision with paddle 1 */
if ( pad1 . getRect ( ) . CheckCollision ( ball . pos , ball . radius ) ) { /* Collision with paddle 1 */
@ -366,7 +369,8 @@ int main(int argc, char** argv) {
ball . vel . y = ball . vel . y * - 1 ;
ball . vel . y = ball . vel . y * - 1 ;
}
}
/* Update positions based on velocities - Client only updates pad1, server updates pad2 and ball */
/* Update positions based on velocities - Client only updates pad1 (and receives data for pad2),
server updates pad2 and ball ( and receives data for pad1 ) */
if ( type . mode ! = M_CLIENT ) {
if ( type . mode ! = M_CLIENT ) {
ball . updatePosition ( ) ;
ball . updatePosition ( ) ;
pad2 . updatePosition ( ) ;
pad2 . updatePosition ( ) ;
@ -390,7 +394,11 @@ int main(int argc, char** argv) {
ball . draw ( ) ;
ball . draw ( ) ;
window . EndDrawing ( ) ;
window . EndDrawing ( ) ;
}
}
/* If the game has been quit, ask the peer to quit as well */
to_send_data = Serial_create_data ( 0 , 0 , 0 , 0 , true ) ;
type . netsock - > sendAll ( ( char * ) Serial_serialize ( to_send_data ) , sizeof ( Serial_Data ) + 1 ) ;
window . Close ( ) ;
window . Close ( ) ;
sock_quit ( ) ;
sock_quit ( ) ;