Skip to main content

SDKExample、Vue

介绍

该示例使用了 ioGame TypeScript SDK

当前示例提供了 TypeScript 、Netty、WebSocket、Protobuf 与游戏服务器交互的演示。


该示例主要演示以下几个方面的内容

  1. ioGame SDK + 代码生成 = 诸多优势。
  2. 使用代码生成后的接口文件(action、广播)与服务器交互。
  3. 心跳的处理,每次心跳将时间与服务器同步。
  4. 交互演示内容包括
    • 协议碎片:“基础类型”的参数与返回值。
    • List 类型的参数与返回值。
    • Protobuf 对象类型的参数与返回值。

示例目录 ./src/assets/gen/code 中的 action、广播、错误码 ...等交互接口文件由 ioGame 生成。 代码生成可为客户端开发者减少巨大的工作量,并可为客户端开发者屏蔽路由等概念。


SDK 代码生成的几个优势

  1. 帮助客户端开发者减少巨大的工作量,不需要编写大量的模板代码
  2. 语义明确,清晰。生成的交互代码即能明确所需要的参数类型,又能明确服务器是否会有返回值。这些会在生成接口时就提前明确好。
  3. 明确的交互接口,确保了方法的参数类型安全且明确,使我们在编译阶段就能发现潜在问题。 这种做法有效避免了安全隐患,并减少了联调时可能出现的低级错误。
  4. 减少服务器与客户端双方对接时的沟通成本,代码即文档。生成的联调代码中有文档与使用示例,方法上的示例会教你如何使用,即使是新手也能做到零学习成本
  5. 帮助客户端开发者屏蔽与服务器交互部分,将更多的精力放在真正的业务上
  6. 为双方联调减少心智负担。联调代码使用简单,与本地方法调用一般丝滑
  7. 抛弃传统面向协议对接的方式,转而使用面向接口方法的对接方式
  8. 当我们的 java 代码编写完成后,我们的文档及交互接口可做到同步更新,不需要额外花时间去维护对接文档及其内容

Example Source Code

see https://github.com/iohao/ioGameSdkTsExampleVue

快速开始

启动游戏服务器

see https://github.com/iohao/ioGameExamples/tree/main/SdkExample

运行 SdkApplication.java 启动游戏服务器

server

SDK TypeScript 安装

当前示例项目已经安装好了相关环境,新项目请参考 TypeScript SDK

启动 Vue

首次下载运行,安装相关环境

npm install

启动

npm run dev

Test

点击按钮会向服务器发送请求,并接收服务器的响应数据。 test

SDK 设置说明

MyNetConfig.ts 文件,该配置文件做了以下事情

  1. 错误码及广播监听相关的加载。
  2. listenMessageCallback:自定义消息监听。
  3. netChannel:网络实现的配置、登录、心跳处理。
  4. startNet: 启动 ioGame Sdk。
export class MyNetConfig {
public static currentTimeMillis: bigint = BigInt(Date.now());

static startNet() {

// biz code init
GameCode.init();
listen();

// --------- IoGameSetting ---------
ioGameSetting.enableDevMode = true;
// China or Us
ioGameSetting.language = ioGameLanguage.CHINA;
// message callback. 回调监听
ioGameSetting.listenMessageCallback = new MySimpleListenMessageCallback();

// socket
ioGameSetting.url = "ws://127.0.0.1:10100/websocket";
ioGameSetting.netChannel = new MyNetChannel();

ioGameSetting.startNet()
}
}

class MyNetChannel extends SimpleNetChannel {

onOpen(event: Event) {
// login
const loginVerify = create(LoginVerifyMessageSchema, {jwt: "10000"});
SdkAction.ofLoginVerify(loginVerify, result => {
const message = result.getValue(UserMessageSchema);
result.log(message);
});

// heartbeat
const heartbeatMessage = toBinary(ExternalMessageSchema, create(ExternalMessageSchema, {}));
setInterval(function () {
// Send heartbeat to server. 发送心跳给服务器
ioGameSetting.netChannel.writeAndFlushUint8Array(heartbeatMessage);
}, 8 * 1000);
}
}

class MySimpleListenMessageCallback extends SimpleListenMessageCallback {

onIdleCallback(message: NetExternalMessage) {
const data = message.data;
if (data === undefined || data.length === 0) return;

/*
* Synchronize the time of each heartbeat with that of the server.
* 每次心跳与服务器的时间同步
*/
const longValue = fromBinary(LongValueSchema, data);
MyNetConfig.currentTimeMillis = longValue.value;
}
}

Example Source Code Directory

记住,你不需要编写任何交互文件 action、广播、错误码,这些是由 ioGame 服务器生成的,你只需要关注真正的业务逻辑。

codeGen

下图是 ioGame 游戏服务器的源码,上图中的 TypeScript 源码由 ioGame 生成。

enter;

关于代码生成与使用

click here

如何根据 .proto 生成相关 pb

执行命令后,会根据 buf.gen.yaml 生成相关 pb

npx buf generate

buf.gen.yaml

# Learn more: https://buf.build/docs/configuration/v2/buf-gen-yaml
# npx buf generate
version: v2
inputs:
- directory: proto
plugins:
- local: protoc-gen-es
out: assets/scripts/gen
opt: target=ts

最后

记住,你不需要编写任何交互文件 action、广播、错误码,这些是由 ioGame 服务器生成的,你只需要关注真正的业务逻辑。