|
||
---|---|---|
.github | ||
component | ||
config | ||
examples | ||
game | ||
notify | ||
planner/configexport | ||
server | ||
tools/natapp | ||
utils | ||
.gitignore | ||
LICENSE | ||
README.md | ||
go.mod | ||
go.sum | ||
local-doc.bat | ||
local-doc.sh |
README.md
Minotaur
Minotaur 是一个基于Golang 1.20 编写的服务端开发支持库,其中采用了大量泛型设计,用于游戏服务器开发。
未经严格测试,开发阶段,生产慎用!
目录结构概况
mindmap
root((Minotaur))
/component 通用组件接口定义
/components 通用组件内置实现
/config 针对配置导表的配置加载
/game 游戏通用功能接口定义
/builtin 游戏通用功能内置实现
/notify 通知功能接口定义
/planner 策划相关工具目录
/configexport 配置导表功能实现
/server 网络服务器支持
/cross 内置跨服功能实现
/router 内置路由器功能实现
/tools 第三方工具
/utils 常用辅助函数包
Server 架构预览
安装
注意:依赖于 Go 1.20 +
运行以下 Go 命令来安装软件包:minotaur
$ go get -u github.com/kercylan98/minotaur
用法
- 在
Minotaur
中大量使用了 泛型 、 观察者(事件) 和 选项模式,在使用前建议先进行相应了解; - 更多的 示例 参考可在 examples 目录查阅;
- 项目文档可访问 pkg.go.dev 进行查阅;
简单示例
创建一个基于Websocket的回响服务器。
package main
import (
"github.com/kercylan98/minotaur/server"
)
func main() {
srv := server.New(server.NetworkWebsocket)
srv.RegConnectionReceiveWebsocketPacketEvent(func(srv *server.Server, conn *server.Conn, packet []byte, messageType int) {
conn.Write(packet, messageType)
})
if err := srv.Run(":9999"); err != nil {
panic(err)
}
}
访问 WebSocket 在线测试 进行验证。
Websocket地址: ws://127.0.0.1:9999
事件
在 Miontaur
中,绝大多数场景都采用事件注册的方式进行回调,可通过XXX.RegXXXEvent
的方式进行事件注册,例如:
package main
import (
"github.com/kercylan98/minotaur/server"
)
func main() {
srv := server.New(server.NetworkWebsocket)
srv.RegConsoleCommandEvent("command", nil)
srv.RegStartBeforeEvent(nil)
srv.RegStartFinishEvent(nil)
srv.RegConnectionClosedEvent(nil)
srv.RegConnectionOpenedEvent(nil)
srv.RegConnectionReceivePacketEvent(nil)
srv.RegConnectionReceiveWebsocketPacketEvent(nil)
srv.RegReceiveCrossPacketEvent(nil)
srv.RegMessageErrorEvent(nil)
srv.RegMessageLowExecEvent(nil)
}
其他的一些支持事件的结构体(非所有):
game.Room
游戏房间实现synchronization.Map
并发安全的Map
实现- ...
可选项
大部分的 New
函数均可使用可选项进行创建,具体函数前缀通常为 With
。
package main
import (
"github.com/kercylan98/minotaur/server"
)
func main() {
server.New(server.NetworkWebsocket,
server.WithTicker(50, false),
server.WithProd(),
server.WithMultiCore(3),
// ...
)
}
更多的网络模式
package main
import (
"github.com/kercylan98/minotaur/server"
)
func main() {
server.New(server.NetworkTcp)
server.New(server.NetworkTcp4)
server.New(server.NetworkTcp6)
server.New(server.NetworkUdp)
server.New(server.NetworkUdp4)
server.New(server.NetworkUdp6)
server.New(server.NetworkWebsocket)
server.New(server.NetworkKcp)
server.New(server.NetworkUnix)
server.New(server.NetworkHttp)
server.New(server.NetworkGRPC)
}