Skip to content

快速集成

完整源代码下载

压缩包内目录说明:TxNet 为 txnet 静态库源码及编译脚本,Output 为预编译静态库与头文件(可直接集成),Test 为示例 Demo。使用预编译库时从 Output 中取 libtxnet.a 与头文件按下方方式集成;若需自行编译或兼容更旧 NDK,请在 TxNet 的 TxNet 目录下执行 运行.bat,使用与主程序相同的 NDK 编译。

NDK 版本要求:使用我们提供的预编译 libtxnet.a(Output)时,主程序须使用 NDK r23+ 链接;自行在 TxNet 中编译时,可与主程序使用相同 NDK,以兼容更旧版本(如 r21、r22)。

添加依赖

Android.mk

makefile
# 引入预编译静态库
include $(CLEAR_VARS)
LOCAL_MODULE := libtxnet
LOCAL_SRC_FILES := $(LOCAL_PATH)/prebuilt/arm64-v8a/libtxnet.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/prebuilt/include
include $(PREBUILT_STATIC_LIBRARY)

# 你的模块
include $(CLEAR_VARS)
LOCAL_MODULE := your_module
LOCAL_SRC_FILES := main.cpp
LOCAL_STATIC_LIBRARIES := libtxnet
LOCAL_LDLIBS := -llog -lz
include $(BUILD_EXECUTABLE)

头文件

cpp
#include "txnet.h"

基础流程

cpp
#include "txnet.h"

int main() {
    // ========== 1. 初始化 ==========
    txnet_config config = {
        .app_id = "your_app_id",
        .server_public_key = "-----BEGIN PUBLIC KEY-----\n...",
        .client_private_key = "-----BEGIN PRIVATE KEY-----\n...",
        .version_code = 1,
        .version_name = "1.0.0",
        .login_save_path = "/data/local/tmp/login.dat"
    };
    txnet_init(&config);
    
    // ========== 2. 连接服务器 ==========
    if (!txnet_connect()) {
        return 1;
    }
    
    // ========== 3. 登录 ==========
    txnet_login();
    
    if (!txnet_is_logged_in()) {
        return 1;
    }
    
    // ========== 4. 检查更新 ==========
    txnet_check_update();
    
    // ========== 5. 获取远程配置 ==========
    static bool g_enabled = false;
    static float g_value = 1.0f;
    
    txnet_bind_config_bool("enabled", &g_enabled, false);
    txnet_bind_config_float("value", &g_value, 1.0f);
    txnet_get_config();
    
    // ========== 6. 业务逻辑 ==========
    while (txnet_is_logged_in()) {
        // 你的代码...
    }
    
    // ========== 7. 断开连接 ==========
    txnet_disconnect();
    return 0;
}

回调设置(可选)

cpp
// 连接状态回调
void onConnection(int status, const char* msg) {
    printf("[连接] %s\n", msg);
}

// 登录结果回调
void onLogin(bool ok, int code, const char* msg, long long expire) {
    if (ok) {
        printf("[登录] 成功,到期: %lld\n", expire);
    } else {
        printf("[登录] 失败: %s\n", msg);
    }
}

// 更新检查回调
void onUpdate(bool need, bool force, int ver, const char* name,
              const char* content, const char* url, const char* disk) {
    if (need) {
        printf("[更新] 发现新版本: %s\n", name);
    }
}

int main() {
    txnet_init(&config);
    
    txnet_set_connection_callback(onConnection);
    txnet_set_login_callback(onLogin);
    txnet_set_update_callback(onUpdate);
    
    // ...
}

共享雷达集成

共享雷达用于将游戏内玩家/载具/空投等数据实时同步到接收端(显示端)。库在后台按设定帧率同步,你只需在游戏循环里更新数据即可。

步骤概览:程序启动时调用一次 txnet_radar_init;每帧(或按你的更新频率)调用 txnet_radar_set_gametxnet_radar_set_self、再对每个物品调用 txnet_radar_add_itemset_self 仅上报自身 address;物品列表建议包含自身(与该 address 一致的那条),接收端可按 address 在 items 中匹配得到完整自身数据。

cpp
#include "txnet.h"

static bool g_radarEnabled = true;
static float g_radarFps = 10.0f;

void initRadar() {
    txnet_radar_init(&g_radarEnabled, &g_radarFps, TXNET_RADAR_GAME_PUBGMHD);
}

void gameLoop(uint64_t worldAddress, int gameState, int mapId,
              uint64_t selfAddress,
              const PlayerList& players, const VehicleList& vehicles, const AirdropList& airdrops) {
    txnet_radar_set_game(worldAddress, gameState, mapId);
    txnet_radar_set_self(selfAddress);

    // 玩家:必填 address、name、pos;其余按需,无数据用 TXNET_RADAR_NO_VALUE(-999)
    for (const auto& p : players) {
        txnet_radar_item_pubgmhd item = {};
        item.type = "player";
        item.address = p.address;
        item.name = p.name;                    // 必填;可传 nullptr,库会安全拷贝
        item.uid = p.uid;
        item.team = p.team;
        item.pos_x = p.x;  item.pos_y = p.y;  item.pos_z = p.z;  // 游戏单位 1=0.01m
        item.health = p.health;
        item.signal = p.hasSignal ? p.signal : (float)TXNET_RADAR_NO_VALUE;
        item.rotator = p.hasYaw ? p.yaw : (float)TXNET_RADAR_NO_VALUE;
        item.weapon_name = p.weaponName;
        item.current_ammo = p.currentAmmo >= 0 ? p.currentAmmo : TXNET_RADAR_NO_VALUE;
        item.max_ammo = p.maxAmmo >= 0 ? p.maxAmmo : TXNET_RADAR_NO_VALUE;
        item.distance = p.distance;
        txnet_radar_add_item(&item);
    }

    // 载具:必填 address、name、pos;可选 health、fuel、rotator
    for (const auto& v : vehicles) {
        txnet_radar_item_pubgmhd item = {};
        item.type = "vehicle";
        item.address = v.address;
        item.name = v.name;
        item.pos_x = v.x;  item.pos_y = v.y;  item.pos_z = v.z;
        item.health = v.hasDurability ? v.durability : (float)TXNET_RADAR_NO_VALUE;
        item.fuel = v.hasFuel ? v.fuel : (float)TXNET_RADAR_NO_VALUE;
        item.rotator = v.hasYaw ? v.yaw : (float)TXNET_RADAR_NO_VALUE;
        txnet_radar_add_item(&item);
    }

    // 空投:仅需 type、address、name、pos
    for (const auto& a : airdrops) {
        txnet_radar_item_pubgmhd item = {};
        item.type = "airdrop";
        item.address = a.id;
        item.name = a.name;
        item.pos_x = a.x;  item.pos_y = a.y;  item.pos_z = a.z;
        txnet_radar_add_item(&item);
    }
}
  • mapId:0=未开局,-1=用户选图,>0=当前地图 ID;接收端可据此选图/显示状态。
  • 可选字段:结构体有默认值,只填必填项 + 当前 type 需要的即可;字符串可传 nullptr,库内会安全处理。
  • 完整字段说明与无畏契约示例见 共享雷达 API

同行检测集成

cpp
// 初始化
txnet_peer_init([](const char* uid, bool same, const char** progs, int cnt) {
    if (same) {
        printf("发现同行: %s\n", uid);
    }
});

// 游戏循环中
void gameLoop() {
    txnet_peer_submit_self(self_uid, self_name, world_address);
    
    for (auto& player : players) {
        txnet_peer_add_player(player.uid, player.name);
        
        if (txnet_peer_is_same_server(player.uid)) {
            player.is_peer = true;
        }
    }
}

运行模式

库提供两种运行模式,通过 txnet_set_xxx_mode(mode) 设置:

模式行为
默认模式0自动处理错误(重试/退出),适合简单场景
自定义模式1仅回调通知,由主程序处理,适合复杂场景

各模块默认模式行为

模块失败行为
连接自动重连,超过5次后 exit(1)
登录提示输入登录码重试;超时3分钟后 exit(1)
更新强制更新时打开浏览器并 exit(0)
退出收到踢出/退出指令后 exit(0)

注意事项

  1. 调用顺序: 必须先 txnet_init,再调用其他函数
  2. 阻塞函数: connectlogincheck_updateget_config 都是阻塞的
  3. 登录超时: 连接成功后 3 分钟内未登录将触发超时
  4. 配置绑定: 在 get_config 之前完成所有 bind_config_xxx 调用
  5. 线程安全: 回调在接收线程执行,注意数据同步

TxNet 网络通信库文档