快速集成
完整源代码下载
- 下载地址: 123 云盘
- 官网: https://admins.ttzzii.com
压缩包内目录说明: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_game、txnet_radar_set_self、再对每个物品调用 txnet_radar_add_item。set_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) |
注意事项
- 调用顺序: 必须先
txnet_init,再调用其他函数 - 阻塞函数:
connect、login、check_update、get_config都是阻塞的 - 登录超时: 连接成功后 3 分钟内未登录将触发超时
- 配置绑定: 在
get_config之前完成所有bind_config_xxx调用 - 线程安全: 回调在接收线程执行,注意数据同步