Compare commits
7 Commits
ab7b40f778
...
5fe24bffd9
Author | SHA1 | Date | |
---|---|---|---|
5fe24bffd9 | |||
6e0b7f8394 | |||
4b7880349d | |||
14131d8942 | |||
6331d81ba3 | |||
fa0cadfabf | |||
b113098c7b |
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,3 +1,6 @@
|
||||
[submodule "subprojects/raylib"]
|
||||
path = subprojects/raylib
|
||||
url = https://github.com/raysan5/raylib.git
|
||||
[submodule "subprojects/netpong-serialization"]
|
||||
path = netpong-serialization
|
||||
url = https://gitea.twomorecents.org/Rockingcool/netpong-serialization.git
|
||||
|
14
README.md
14
README.md
@@ -10,15 +10,23 @@ The game has only one runtime dependency: The [raylib](https://www.raylib.com/)
|
||||
|
||||
This application uses [Meson](https://mesonbuild.com/) as a build system. To build the application:
|
||||
1. Install meson from the link above.
|
||||
2. Set up the build directory.
|
||||
|
||||
2. Clone the repository.
|
||||
|
||||
3. Update all submodules:
|
||||
```
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
3. Set up the build directory.
|
||||
```
|
||||
meson setup build
|
||||
```
|
||||
3. Compile the application. Meson should use a system installation of raylib, if it exists. If not, it falls back to a bundled version.
|
||||
4. Compile the application. Meson should use a system installation of raylib, if it exists. If not, it falls back to a bundled version.
|
||||
```
|
||||
meson compile -C build
|
||||
```
|
||||
4. You can also create a statically-linked version of the game (with no runtime dependencies) on Linux by running the following commands:
|
||||
5. You can also create a statically-linked version of the game (with no runtime dependencies) on Linux by running the following commands:
|
||||
|
||||
```
|
||||
meson configure -Ddefault_library=static build/
|
||||
|
@@ -1,33 +0,0 @@
|
||||
#ifndef _SERIALIZATION_H
|
||||
#define _SERIALIZATION_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/* Struct used to hold the data that will be sent between sockets */
|
||||
typedef struct {
|
||||
uint16_t pad_x; // X-coordinate of sending paddle
|
||||
uint16_t pad_y; // Y-coordinate of sending paddle
|
||||
uint16_t ball_x; // X-coordinate of ball (only the server fills this in)
|
||||
uint16_t ball_y; // Y-coordinate of ball (only the server fills this in)
|
||||
bool should_quit; // Flag to indicate whether game should be quit or not
|
||||
} Serial_Data;
|
||||
|
||||
/* Create a Serial_Data struct from float values */
|
||||
Serial_Data Serial_create_data(float pad_x, float pad_y, float ball_x, float ball_y, bool should_quit);
|
||||
|
||||
/* Serialize a struct into a byte array, that can be sent through a socket */
|
||||
uint8_t* Serial_serialize(Serial_Data data);
|
||||
|
||||
/* Deserialize a byte array into a struct, and return the struct */
|
||||
Serial_Data Serial_deserialize(uint8_t* serialized);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
6
main.cpp
6
main.cpp
@@ -34,7 +34,7 @@
|
||||
#include "includes/check_input.hpp"
|
||||
#include "includes/display_text.hpp"
|
||||
#include "includes/easysock.h"
|
||||
#include "includes/serialization.h"
|
||||
#include "netpong-serialization/includes/serialization.h"
|
||||
#include "includes/timer.h"
|
||||
|
||||
/* Global variables used to instantiate structs */
|
||||
@@ -215,6 +215,9 @@ int main(int argc, char** argv) {
|
||||
|
||||
/* Single player mode */
|
||||
if (selected_item == M_SINGLE) {
|
||||
type.mode = M_SINGLE;
|
||||
type.netsock = NULL;
|
||||
|
||||
GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_WORD); // Enable text wrapping so that the long text, displayed below, will be wrapped
|
||||
BeginDrawing();
|
||||
ClearBackground(BLACK);
|
||||
@@ -429,6 +432,7 @@ int main(int argc, char** argv) {
|
||||
/* Up */
|
||||
if (IsKeyPressed(KEY_UP) && type.mode != M_CLIENT) {
|
||||
pad2.velocity.y = (-1) * PADDLE_SPEED;
|
||||
|
||||
}
|
||||
|
||||
/* Stop */
|
||||
|
@@ -35,6 +35,6 @@ endif
|
||||
|
||||
executable('pong',
|
||||
'main.cpp', 'sock.cpp','paddle.cpp', 'ball.cpp', 'numeric_base.cpp', 'connect_code.cpp', 'server.cpp', 'client.cpp', 'check_input.cpp', 'raygui_helpers.cpp', 'display_text.cpp',
|
||||
'serialization.c', 'timer.c', 'easysock.c',
|
||||
'netpong-serialization/serialization.c', 'timer.c', 'easysock.c',
|
||||
dependencies: [raylib, ws2_dep, winmm]
|
||||
)
|
||||
|
1
netpong-serialization
Submodule
1
netpong-serialization
Submodule
Submodule netpong-serialization added at c0c7e14aa6
@@ -1,87 +0,0 @@
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#if defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#ifdef _WIN32
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#include "includes/serialization.h"
|
||||
|
||||
|
||||
/* Takes in float values, casts them to uint16_t and creates a Serial_Data struct */
|
||||
Serial_Data Serial_create_data(float pad_x, float pad_y, float ball_x, float ball_y, bool should_quit) {
|
||||
Serial_Data data;
|
||||
data.pad_x = (uint16_t)pad_x;
|
||||
data.pad_y = (uint16_t)pad_y;
|
||||
data.ball_x = (uint16_t)ball_x;
|
||||
data.ball_y = (uint16_t)ball_y;
|
||||
data.should_quit = should_quit;
|
||||
return data;
|
||||
}
|
||||
|
||||
/* Serializes a 'Data' struct into a byte array, converted to network-byte order */
|
||||
uint8_t* Serial_serialize(Serial_Data data) {
|
||||
/* Create a pointer that can fit the entire struct */
|
||||
uint8_t* serialized = malloc(sizeof(Serial_Data) + 1);
|
||||
uint8_t* pad_x_ptr;
|
||||
uint8_t* pad_y_ptr;
|
||||
uint8_t* ball_x_ptr;
|
||||
uint8_t* ball_y_ptr;
|
||||
uint8_t* should_quit_ptr;
|
||||
|
||||
memset(serialized, 0, sizeof(Serial_Data) + 1); // Zero out the memory
|
||||
pad_x_ptr = serialized;
|
||||
pad_y_ptr = pad_x_ptr + sizeof(uint16_t);
|
||||
ball_x_ptr = pad_y_ptr + sizeof(uint16_t);
|
||||
ball_y_ptr = ball_x_ptr + sizeof(uint16_t);
|
||||
should_quit_ptr = ball_y_ptr + sizeof(uint16_t);
|
||||
|
||||
*((uint16_t *)pad_x_ptr) = data.pad_x;
|
||||
*((uint16_t *)pad_x_ptr) = htons(*((uint16_t *)pad_x_ptr));
|
||||
|
||||
*((uint16_t *)pad_y_ptr) = data.pad_y;
|
||||
*((uint16_t *)pad_y_ptr) = htons(*((uint16_t *)pad_y_ptr));
|
||||
|
||||
*((uint16_t *)ball_x_ptr) = data.ball_x;
|
||||
*((uint16_t *)ball_x_ptr) = htons(*((uint16_t *)ball_x_ptr));
|
||||
|
||||
*((uint16_t *)ball_y_ptr) = data.ball_y;
|
||||
*((uint16_t *)ball_y_ptr) = htons(*((uint16_t *)ball_y_ptr));
|
||||
|
||||
*((bool *)should_quit_ptr) = data.should_quit;
|
||||
*(should_quit_ptr + sizeof(bool)) = '\0';
|
||||
|
||||
return serialized;
|
||||
}
|
||||
|
||||
/* Deserialize a byte array into a 'Data' struct, converted to host byte order */
|
||||
Serial_Data Serial_deserialize(uint8_t* serialized) {
|
||||
Serial_Data deserialized;
|
||||
/* Use successive chunks of memory address to create pointers to the data */
|
||||
uint8_t* pad_x_ptr = serialized;
|
||||
uint8_t* pad_y_ptr = serialized + sizeof(uint16_t);
|
||||
uint8_t* ball_x_ptr = pad_y_ptr + sizeof(uint16_t);
|
||||
uint8_t* ball_y_ptr = ball_x_ptr + sizeof(uint16_t);
|
||||
uint8_t* should_quit_ptr = ball_y_ptr + sizeof(uint16_t);
|
||||
|
||||
/* Dereference (and cast) the pointers, and store them into the struct */
|
||||
deserialized.pad_x = *((uint16_t *)pad_x_ptr);
|
||||
deserialized.pad_x = ntohs(deserialized.pad_x);
|
||||
|
||||
deserialized.pad_y = *((uint16_t *)pad_y_ptr);
|
||||
deserialized.pad_y = ntohs(deserialized.pad_y);
|
||||
|
||||
deserialized.ball_x = *((uint16_t *)ball_x_ptr);
|
||||
deserialized.ball_x = ntohs(deserialized.ball_x);
|
||||
|
||||
deserialized.ball_y = *((uint16_t *)ball_y_ptr);
|
||||
deserialized.ball_y = ntohs(deserialized.ball_y);
|
||||
|
||||
deserialized.should_quit = *((bool *)should_quit_ptr);
|
||||
|
||||
return deserialized;
|
||||
}
|
||||
|
Reference in New Issue
Block a user