Ball passing between courts
This commit is contained in:
@@ -36,7 +36,7 @@ void CreateGameServer(Server* serv,GameData*gd);
|
|||||||
/**
|
/**
|
||||||
* Creates the Client game loop
|
* Creates the Client game loop
|
||||||
*/
|
*/
|
||||||
void RunGameClient(Client* c);
|
void RunGameClient(Client* c,GameData*gd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws the walls based on player 1 or 2
|
* Draws the walls based on player 1 or 2
|
||||||
|
|||||||
2
main.c
2
main.c
@@ -52,7 +52,7 @@ int main(int argc, char* argv[])
|
|||||||
printf("Connecting to %s:%i\n", data.domain, data.port);
|
printf("Connecting to %s:%i\n", data.domain, data.port);
|
||||||
Client c = StartClient(data.domain, data.port);
|
Client c = StartClient(data.domain, data.port);
|
||||||
|
|
||||||
RunGameClient(&c);
|
RunGameClient(&c,&data);
|
||||||
|
|
||||||
close(c.client_fd);
|
close(c.client_fd);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
180
src/gameServer.c
180
src/gameServer.c
@@ -1,15 +1,31 @@
|
|||||||
#include "../include/game.h"
|
#include "../include/game.h"
|
||||||
|
#include "../include/object.h"
|
||||||
|
#include "../include/network/packet.h"
|
||||||
#include <curses.h>
|
#include <curses.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
long GetCurrentMS()
|
||||||
|
{
|
||||||
|
struct timespec ts;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||||
|
|
||||||
|
long ms = ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
|
||||||
|
return ms;
|
||||||
|
}
|
||||||
|
|
||||||
void CreateGameServer(Server* serv, GameData* gd)
|
void CreateGameServer(Server* serv, GameData* gd)
|
||||||
{
|
{
|
||||||
|
|
||||||
Server s = *serv;
|
Server s = *serv;
|
||||||
|
Paddle paddle = CreatePaddle(gd);
|
||||||
|
|
||||||
|
Ball ball = CreateBall(gd);
|
||||||
|
long lastBallUpdate = GetCurrentMS();
|
||||||
|
|
||||||
bool game_running = true;
|
bool game_running = true;
|
||||||
|
|
||||||
@@ -22,6 +38,11 @@ void CreateGameServer(Server* serv, GameData* gd)
|
|||||||
SetupTermWin();
|
SetupTermWin();
|
||||||
|
|
||||||
DrawWalls(*gd);
|
DrawWalls(*gd);
|
||||||
|
DrawPaddle(&paddle);
|
||||||
|
// DrawBall(&ball);
|
||||||
|
|
||||||
|
GameAlert("Waiting for Client");
|
||||||
|
int allowServe = false;
|
||||||
|
|
||||||
while (game_running) {
|
while (game_running) {
|
||||||
|
|
||||||
@@ -79,8 +100,10 @@ void CreateGameServer(Server* serv, GameData* gd)
|
|||||||
snprintf(msg, sizeof(msg), "Client %d says: %s\r", fd, buffer);
|
snprintf(msg, sizeof(msg), "Client %d says: %s\r", fd, buffer);
|
||||||
GameAlert(msg);
|
GameAlert(msg);
|
||||||
|
|
||||||
|
ProcessBallPacket(buffer,&ball,gd);
|
||||||
|
|
||||||
// Example: echo back
|
// Example: echo back
|
||||||
send(fd, buffer, bytes, 0);
|
//send(fd, buffer, bytes, 0);
|
||||||
} else if (bytes == 0) {
|
} else if (bytes == 0) {
|
||||||
char msg[64];
|
char msg[64];
|
||||||
snprintf(msg, sizeof(msg), "Client %d disconnected\n", fd);
|
snprintf(msg, sizeof(msg), "Client %d disconnected\n", fd);
|
||||||
@@ -96,38 +119,147 @@ void CreateGameServer(Server* serv, GameData* gd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s.client_count < 1) {
|
char ch = getch();
|
||||||
char msg[64];
|
if (ch == 'w')
|
||||||
snprintf(msg, sizeof(msg), "Waiting for other player\n");
|
MovePaddleUP(&paddle);
|
||||||
GameAlert(msg);
|
if (ch == 's')
|
||||||
} else {
|
MovePaddleDown(&paddle);
|
||||||
// Process Game Data
|
|
||||||
|
// Process Ball only if on court
|
||||||
|
if (ball.visible && s.client_count > 0) {
|
||||||
|
if (GetCurrentMS() > lastBallUpdate + 10) {
|
||||||
|
lastBallUpdate = GetCurrentMS();
|
||||||
|
UpdateBall(&ball, &paddle);
|
||||||
|
}
|
||||||
|
if (CheckBallCourtChange(gd,&ball)) {
|
||||||
|
GameAlert("Ball is in other court");
|
||||||
|
HideBall(&ball);
|
||||||
|
|
||||||
|
char msg[1024];
|
||||||
|
snprintf(msg, sizeof(msg), "BTRANS %f %f %f", ball.y,ball.vx,ball.vy);
|
||||||
|
send(s.clients[0], msg, strlen(msg), 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ch == 'q') {
|
||||||
|
GameAlert("Quitting...");
|
||||||
|
sleep(1);
|
||||||
|
game_running = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (s.client_count < 1) {
|
||||||
|
// char msg[64];
|
||||||
|
// snprintf(msg, sizeof(msg), "Waiting for other player\n");
|
||||||
|
// GameAlert(msg);
|
||||||
|
// } else {
|
||||||
|
// // Process Game Data
|
||||||
|
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
CloseTermWin();
|
CloseTermWin();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RunGameClient(Client* client)
|
void RunGameClient(Client* client, GameData* gd)
|
||||||
{
|
{
|
||||||
Client c = *client;
|
Client c = *client;
|
||||||
|
|
||||||
// char* msg = "Hello from client, this is a test, I really want to see what happens if I create a really long packet and try to send it. I would imagine it will be some kind of buffer overflow";
|
Paddle paddle = CreatePaddle(gd);
|
||||||
// send(c.client_fd, msg, strlen(msg), 0);
|
Ball ball = CreateBall(gd);
|
||||||
|
|
||||||
// {
|
|
||||||
// char buffer[1024] = { 0 };
|
|
||||||
// read(c.client_fd, buffer, sizeof(buffer));
|
|
||||||
// printf("Server: %s\n", buffer);
|
|
||||||
// }
|
|
||||||
|
|
||||||
sleep(10);
|
long lastBallUpdate = GetCurrentMS();
|
||||||
// char* msg2 = "Ok I am leaving now";
|
|
||||||
// send(c.client_fd, msg2, strlen(msg2), 0);
|
bool game_running = true;
|
||||||
// {
|
|
||||||
// char buffer[1024] = { 0 };
|
SetupTermWin();
|
||||||
// read(c.client_fd, buffer, sizeof(buffer));
|
|
||||||
// printf("Server: %s\n", buffer);
|
GameAlert("Connected to server");
|
||||||
// }
|
int allowServe = true;
|
||||||
|
|
||||||
|
DrawWalls(*gd);
|
||||||
|
DrawPaddle(&paddle);
|
||||||
|
|
||||||
|
while (game_running) {
|
||||||
|
|
||||||
|
fd_set read_fds;
|
||||||
|
FD_ZERO(&read_fds);
|
||||||
|
|
||||||
|
// Watch server socket
|
||||||
|
FD_SET(c.client_fd, &read_fds);
|
||||||
|
|
||||||
|
int max_fd = c.client_fd;
|
||||||
|
|
||||||
|
// Small timeout (same idea as server)
|
||||||
|
struct timeval tv;
|
||||||
|
tv.tv_sec = 0;
|
||||||
|
tv.tv_usec = 1000; // 1ms
|
||||||
|
|
||||||
|
int ret = select(max_fd + 1, &read_fds, NULL, NULL, &tv);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
perror("select");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle server messages
|
||||||
|
if (FD_ISSET(c.client_fd, &read_fds)) {
|
||||||
|
char buffer[1024];
|
||||||
|
int bytes = recv(c.client_fd, buffer, sizeof(buffer) - 1, 0);
|
||||||
|
|
||||||
|
if (bytes > 0) {
|
||||||
|
buffer[bytes] = '\0';
|
||||||
|
|
||||||
|
char msg[1024];
|
||||||
|
snprintf(msg, sizeof(msg), "Server says: %s\r", buffer);
|
||||||
|
GameAlert(msg);
|
||||||
|
|
||||||
|
ProcessBallPacket(buffer,&ball,gd);
|
||||||
|
|
||||||
|
} else if (bytes == 0) {
|
||||||
|
GameAlert("Server disconnected");
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
perror("recv");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char ch = getch();
|
||||||
|
if (ch == 'w')
|
||||||
|
MovePaddleUP(&paddle);
|
||||||
|
if (ch == 's')
|
||||||
|
MovePaddleDown(&paddle);
|
||||||
|
|
||||||
|
// Process Ball only if on court
|
||||||
|
if (ball.visible) {
|
||||||
|
if (GetCurrentMS() > lastBallUpdate + 10) {
|
||||||
|
lastBallUpdate = GetCurrentMS();
|
||||||
|
UpdateBall(&ball, &paddle);
|
||||||
|
}
|
||||||
|
if (CheckBallCourtChange(gd,&ball)) {
|
||||||
|
GameAlert("Ball is in other court");
|
||||||
|
HideBall(&ball);
|
||||||
|
|
||||||
|
char msg[1024];
|
||||||
|
snprintf(msg, sizeof(msg), "BTRANS %f %f %f", ball.y,ball.vx,ball.vy);
|
||||||
|
send(c.client_fd, msg, strlen(msg), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ch == 'q') {
|
||||||
|
GameAlert("Quitting...");
|
||||||
|
sleep(1);
|
||||||
|
game_running = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ch == ' ') {
|
||||||
|
allowServe = false;
|
||||||
|
ServeBall(&ball,gd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseTermWin();
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user