Integración Videojuegos/Motores (C++ / PO++)

Usado en Unreal Engine 5, servidores de MMORPG y software bursátil. Wrapper Moderno C++17 RAII encima de la API nativa para evitar fugas de memoria.

1

Descargar Binarios Base

Antes de programar en C++, necesitas descargar la API Nativa oficial en C de nuestro repositorio GitHub. Esta API será el "cerebro" que ejecutará todo por debajo usando Rust.
📥 Descargar po-native-sdk (Windows / Linux / Mac)

💡 Para que lo entiendas súper fácil: Descomprime el ".zip" que descargaste y arrastra el archivo po.h y po_c.dll (o .so) al lado del archivo `.cpp` donde vas a programar todo.

2

Wrapper C++ "RAII"

En C puro había que llamar al `free()` manual. En C++, creamos una Clase Inteligente (Wrapper) que destruye el túnel automáticamente cuando termina la función. A esto le dimos el nombre de "PO++".
#include <iostream>
#include <string>
// Este bloque mágico jala el archivo de cabecera que descargaste en el Paso 1
#include "po.h"

// Clase Constructora RAII (Destrucción automática)
class PoClient {
private:
    PoClientC* handle;
public:
    PoClient(const std::string& remote) {
        handle = po_client_new("0", remote.c_str());
        if (!handle) throw std::runtime_error("Fallo Criptográfico");
    }

    ~PoClient() {
        po_client_free(handle);
    }

    bool Send(const std::string& msg) {
        int res = po_client_send(handle, (const uint8_t*)msg.data(), msg.size());
        return res == 0;
    }
};

💡 Para que lo entiendas súper fácil: RAII es como tener un asistente robótico a tu lado. En lugar de decirle "abre el túnel y cuando terminemos ciérralo con llave manualmente", tú simplemente usas el túnel, y cuando el asistente ve que te vas de la habitación (termina la función), él cierra la puerta con llave por ti.

2

Usarlo en tu juego o app de consola

Gracias al envoltorio que acabamos de hacer, el código de "cliente" de PO++ es super minúsculo y limpio.
int main() {
    try {
        // En Unreal Engine, pudieras conectar esto en el GameMode
        PoClient client("127.0.0.1:4433");
        
        client.Send("Player 1 se ha movido a X: 34 Y: 89");
        std::cout << "Paquete cifrado enviado por UDP." << std::endl;
        
    } catch(const std::exception& e) {
        std::cerr << e.what() << std::endl;
    }
    // ¡La memoria c++ se limpia sola aquí!
    return 0;
}