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
*/
void RunGameClient(Client* c);
void RunGameClient(Client* c,GameData*gd);
/**
* 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);
Client c = StartClient(data.domain, data.port);
RunGameClient(&c);
RunGameClient(&c,&data);
close(c.client_fd);
return 0;

View File

@@ -1,15 +1,31 @@
#include "../include/game.h"
#include "../include/object.h"
#include "../include/network/packet.h"
#include <curses.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.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)
{
Server s = *serv;
Paddle paddle = CreatePaddle(gd);
Ball ball = CreateBall(gd);
long lastBallUpdate = GetCurrentMS();
bool game_running = true;
@@ -22,6 +38,11 @@ void CreateGameServer(Server* serv, GameData* gd)
SetupTermWin();
DrawWalls(*gd);
DrawPaddle(&paddle);
// DrawBall(&ball);
GameAlert("Waiting for Client");
int allowServe = false;
while (game_running) {
@@ -79,8 +100,10 @@ void CreateGameServer(Server* serv, GameData* gd)
snprintf(msg, sizeof(msg), "Client %d says: %s\r", fd, buffer);
GameAlert(msg);
ProcessBallPacket(buffer,&ball,gd);
// Example: echo back
send(fd, buffer, bytes, 0);
//send(fd, buffer, bytes, 0);
} else if (bytes == 0) {
char msg[64];
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 msg[64];
snprintf(msg, sizeof(msg), "Waiting for other player\n");
GameAlert(msg);
} else {
// Process Game Data
char ch = getch();
if (ch == 'w')
MovePaddleUP(&paddle);
if (ch == 's')
MovePaddleDown(&paddle);
// 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();
}
void RunGameClient(Client* client)
void RunGameClient(Client* client, GameData* gd)
{
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";
// send(c.client_fd, msg, strlen(msg), 0);
Paddle paddle = CreatePaddle(gd);
Ball ball = CreateBall(gd);
// {
// char buffer[1024] = { 0 };
// read(c.client_fd, buffer, sizeof(buffer));
// printf("Server: %s\n", buffer);
// }
sleep(10);
// char* msg2 = "Ok I am leaving now";
// send(c.client_fd, msg2, strlen(msg2), 0);
// {
// char buffer[1024] = { 0 };
// read(c.client_fd, buffer, sizeof(buffer));
// printf("Server: %s\n", buffer);
// }
long lastBallUpdate = GetCurrentMS();
bool game_running = true;
SetupTermWin();
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();
}