Ball passing between courts

This commit is contained in:
2026-04-26 16:35:09 -04:00
parent d79e73df8b
commit ab35c9216e
3 changed files with 158 additions and 26 deletions

View File

@@ -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
View File

@@ -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;

View File

@@ -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();
} }