Ball passing between courts
This commit is contained in:
@@ -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
2
main.c
@@ -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;
|
||||
|
||||
180
src/gameServer.c
180
src/gameServer.c
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user