diff --git a/src/client/cspt-client.c b/src/client/cspt-client.c index 128b1f2..dbf32c8 100644 --- a/src/client/cspt-client.c +++ b/src/client/cspt-client.c @@ -20,40 +20,40 @@ void DrawCircle(SDL_Renderer * renderer, int32_t centreX, int32_t centreY, int32_t radius) { - const int32_t diameter = (radius * 2); + const int32_t diameter = (radius * 2); - int32_t x = (radius - 1); - int32_t y = 0; - int32_t tx = 1; - int32_t ty = 1; - int32_t error = (tx - diameter); + int32_t x = (radius - 1); + int32_t y = 0; + int32_t tx = 1; + int32_t ty = 1; + int32_t error = (tx - diameter); - while (x >= y) - { - // Each of the following renders an octant of the circle - SDL_RenderDrawPoint(renderer, centreX + x, centreY - y); - SDL_RenderDrawPoint(renderer, centreX + x, centreY + y); - SDL_RenderDrawPoint(renderer, centreX - x, centreY - y); - SDL_RenderDrawPoint(renderer, centreX - x, centreY + y); - SDL_RenderDrawPoint(renderer, centreX + y, centreY - x); - SDL_RenderDrawPoint(renderer, centreX + y, centreY + x); - SDL_RenderDrawPoint(renderer, centreX - y, centreY - x); - SDL_RenderDrawPoint(renderer, centreX - y, centreY + x); + while (x >= y) + { + // Each of the following renders an octant of the circle + SDL_RenderDrawPoint(renderer, centreX + x, centreY - y); + SDL_RenderDrawPoint(renderer, centreX + x, centreY + y); + SDL_RenderDrawPoint(renderer, centreX - x, centreY - y); + SDL_RenderDrawPoint(renderer, centreX - x, centreY + y); + SDL_RenderDrawPoint(renderer, centreX + y, centreY - x); + SDL_RenderDrawPoint(renderer, centreX + y, centreY + x); + SDL_RenderDrawPoint(renderer, centreX - y, centreY - x); + SDL_RenderDrawPoint(renderer, centreX - y, centreY + x); - if (error <= 0) - { - ++y; - error += ty; - ty += 2; - } + if (error <= 0) + { + ++y; + error += ty; + ty += 2; + } - if (error > 0) - { - --x; - tx += 2; - error += (tx - diameter); - } - } + if (error > 0) + { + --x; + tx += 2; + error += (tx - diameter); + } + } } void * graphicsThreadHandler(void * parameters) @@ -63,7 +63,6 @@ void * graphicsThreadHandler(void * parameters) int udpSocket = 0; struct sockaddr_in recieveAddress, serverAddress; struct clientInput message; - message.right = true; message.clientNumber = 1; serverAddress.sin_family = AF_INET; @@ -74,7 +73,7 @@ void * graphicsThreadHandler(void * parameters) // Create an SDL window and rendering context in that window: SDL_Window * window = SDL_CreateWindow("CSPT-Client", SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, 640, 640, 0); + SDL_WINDOWPOS_CENTERED, 600, 600, 0); SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, rendererFlags); // Enable resizing the window: @@ -84,14 +83,75 @@ void * graphicsThreadHandler(void * parameters) struct timeval tv; tv.tv_sec = 0; - tv.tv_usec = 100000; + tv.tv_usec = 1000; setsockopt(udpSocket, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)); - + SDL_Event event; while (true) { - sendto(udpSocket, &message, sizeof(struct clientInput), MSG_CONFIRM, (struct sockaddr *)&serverAddress, sizeof(struct sockaddr_in)); - recvfrom(udpSocket, state, sizeof(struct gameState), MSG_WAITALL, NULL, NULL); + while( SDL_PollEvent( &event ) ){ + switch( event.type ) + { + case SDL_KEYDOWN: + switch( event.key.keysym.sym ) + { + case SDLK_LEFT: + { + message.left = true; + break; + } + case SDLK_RIGHT: + { + message.right = true; + break; + } + case SDLK_UP: + { + message.up = true; + break; + } + case SDLK_DOWN: + { + message.down = true; + break; + } + default: + break; + } + break; + case SDL_KEYUP: + switch( event.key.keysym.sym ) + { + case SDLK_LEFT: + { + message.left = false; + break; + } + case SDLK_RIGHT: + { + message.right = false; + break; + } + case SDLK_UP: + { + message.up = false; + break; + } + case SDLK_DOWN: + { + message.down = false; + break; + } + } + break; + + default: + break; + } + } + sendto(udpSocket, &message, sizeof(struct clientInput), 0, (struct sockaddr *)&serverAddress, sizeof(struct sockaddr_in)); + recvfrom(udpSocket, state, sizeof(struct gameState), 0, NULL, NULL); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Clear the screen, filling it with black: SDL_RenderClear(renderer); @@ -102,7 +162,7 @@ void * graphicsThreadHandler(void * parameters) { if (state->clients[index].registered == true) { - DrawCircle(renderer, (int)state->clients[index].yPosition, (int)state->clients[index].xPosition, + DrawCircle(renderer, (long)(state->clients[index].xPosition), (long)(state->clients[index].yPosition), 10); } } @@ -167,22 +227,22 @@ int main(int argc, char ** argv) printf("%-7s | %u\n", messageStrings[currentMessage.type], currentMessage.content); switch (currentMessage.type) { - case 1: - { - // We've been told to disconnect: - shutdown(serverSocket, SHUT_RDWR); - serverSocket = 0; - continueRunning = false; - break; - } - case 2: - { - // Pinged, so we now must pong. - currentMessage.type = 3; - currentMessage.content = 0; - send(serverSocket, ¤tMessage, sizeof(struct CsptMessage), 0); - break; - } + case 1: + { + // We've been told to disconnect: + shutdown(serverSocket, SHUT_RDWR); + serverSocket = 0; + continueRunning = false; + break; + } + case 2: + { + // Pinged, so we now must pong. + currentMessage.type = 3; + currentMessage.content = 0; + send(serverSocket, ¤tMessage, sizeof(struct CsptMessage), 0); + break; + } } } else diff --git a/src/cspt-state.c b/src/cspt-state.c index 8e0558d..1935d4f 100644 --- a/src/cspt-state.c +++ b/src/cspt-state.c @@ -1,3 +1,4 @@ +#include #include "cspt-state.h" void updateInput(struct gameState * state, struct clientInput * message) { @@ -16,55 +17,34 @@ void doGameTick(struct gameState * state) state->timestamp = time(NULL); for (int index = 0; index < 16; index++) { - if (state->clients[index].registered == true) + // Calculate acceleration: + if (state->clients[index].leftAcceleration) { - // Calculate acceleration: - if (state->clients[index].leftAcceleration) - { - state->clients[index].xVelocity -= 0.5; - } - if (state->clients[index].rightAcceleration) - { - state->clients[index].xVelocity += 0.5; - } - if (state->clients[index].upAcceleration) - { - state->clients[index].yVelocity += 0.5; - } - if (state->clients[index].downAcceleration) - { - state->clients[index].yVelocity += 0.5; - } - if (!state->clients[index].leftAcceleration && !state->clients[index].rightAcceleration) - { - state->clients[index].xVelocity *= 0.1; - } - if (!state->clients[index].upAcceleration && !state->clients[index].downAcceleration) - { - state->clients[index].yVelocity *= 0.1; - } + state->clients[index].xVelocity -= 0.1; + } + if (state->clients[index].rightAcceleration) + { + state->clients[index].xVelocity += 0.1; + } + if (state->clients[index].upAcceleration) + { + state->clients[index].yVelocity -= 0.1; + } + if (state->clients[index].downAcceleration) + { + state->clients[index].yVelocity += 0.1; + } - // Clamp speed: - if (state->clients[index].xVelocity > 15) - { - state->clients[index].xVelocity = 15; - } - if (state->clients[index].xVelocity < -15) - { - state->clients[index].xVelocity = -15; - } - if (state->clients[index].yVelocity > 15) - { - state->clients[index].yVelocity = 15; - } - if (state->clients[index].yVelocity < -15) - { - state->clients[index].yVelocity = -15; - } - - // Do movement: - state->clients[index].xPosition += state->clients[index].xVelocity; - state->clients[index].yPosition += state->clients[index].yVelocity; + // Do movement: + state->clients[index].xPosition += state->clients[index].xVelocity; + state->clients[index].yPosition += state->clients[index].yVelocity; + if(state->clients[index].xPosition > 600 || state->clients[index].xPosition < 0) + { + state->clients[index].xPosition = 300; + } + if(state->clients[index].yPosition > 600 || state->clients[index].yPosition < 0) + { + state->clients[index].yPosition = 300; } } } diff --git a/src/server/cspt-server.c b/src/server/cspt-server.c index 7e61478..2b514c9 100644 --- a/src/server/cspt-server.c +++ b/src/server/cspt-server.c @@ -51,26 +51,38 @@ void * networkThreadHandler(void * arguments) printf("Started network thread.\n"); socklen_t test = sizeof(clientAddress); + int returnvalue = 0; + bzero(arguments, sizeof(struct gameState)); while (true) { - recvfrom(udpSocket, &message, sizeof(struct clientInput), MSG_WAITALL, (struct sockaddr *)&clientAddress, &test); - sendto(udpSocket, arguments, sizeof(struct gameState), MSG_CONFIRM, + recvfrom(udpSocket, &message, sizeof(struct clientInput), 0, (struct sockaddr *)&clientAddress, &test); + returnvalue = sendto(udpSocket, arguments, sizeof(struct gameState), 0, (struct sockaddr *)&clientAddress, (socklen_t)sizeof(struct sockaddr_in)); - updateInput(arguments, &message); - doGameTick(arguments); + if(returnvalue > 0) + { + updateInput(arguments, &message); + } bzero(&message, sizeof(struct clientInput)); } return NULL; } +void * gameThreadHandler(void * arguments) +{ + while(true) + { + doGameTick(arguments); + usleep(9000); + } +} int main(int argc, char ** argv) { int returnValue = 0; int masterSocket = 0; int clientSockets[16]; fd_set connectedClients; - pthread_t networkThread; + pthread_t networkThread, gameThread; struct gameState currentState; struct CsptMessage currentMessage; struct connectionStatus clientStatus[16]; @@ -83,6 +95,7 @@ int main(int argc, char ** argv) signal(SIGINT, sigintHandler); pthread_create(&networkThread, NULL, networkThreadHandler, ¤tState); + pthread_create(&gameThread, NULL, gameThreadHandler, ¤tState); // Setup TCP Master Socket: printf("Setting up master socket... "); @@ -206,6 +219,10 @@ int main(int argc, char ** argv) { currentMessage.type = 0; currentState.clients[index].registered = true; + currentState.clients[index].xPosition = 300; + currentState.clients[index].yPosition = 300; + currentState.clients[index].xVelocity = 0; + currentState.clients[index].yVelocity = 0; currentMessage.content = (uint8_t)index; send(clientSockets[index], ¤tMessage, sizeof(struct CsptMessage), 0); break; @@ -280,3 +297,4 @@ int main(int argc, char ** argv) shutdown(masterSocket, SHUT_RDWR); return 0; } +