跳到主要内容

SDKExample、CocosCreator

介绍

该示例使用了 ioGame TypeScript SDK

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


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

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

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


SDK 代码生成的几个优势

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

Example Source Code

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

快速开始

启动游戏服务器

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

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

server

SDK TypeScript 安装

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

启动 CocosCreator

CocosCreator Version: 3.8.4

enter

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();
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);
});

// MyIdleTimer, 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 服务器生成的,你只需要关注真正的业务逻辑。