我学xingo golang服务器之-xingo_demo 服务器游戏逻辑处理初始化过程
上几节
我们学习了xingo_demo,xingo_cluster相关的服务器协议和客户端协议的配置还有,相关协议的解析;xingo大神推荐我用xingo做一个小游戏,暂时没有什么思路,所以先暂停一下,学习一下xingo_demo的这个服务器arpg游戏处理逻辑;
记录一下xingo最新github工程切换项目至noreflect_veriosn:
git checkout noreflect_veriosn
这样最新的xingo_demo就能运行起来了;
最新xingo 服务器api定义发送了变化,
可以支持字符,在服务器里面键值存储做个支持字符就行了(后面专门写一个文章进行说明)
简洁明了高效;
//add api ---------------start
s.AddRouter("0",&api.Api0Router{})
s.AddRouter("2",&api.Api2Router{})
s.AddRouter("3",&api.Api3Router{})
//add api ---------------end
xingo_demo服务器的游戏逻辑
由于作者写的比较隐秘,我们直接找不到游戏逻辑初始化入口,其实作者依然保持使用init()风格,init是golangz自动初始化函数,在main()之前被调用,参考上一节我讲的:
我学xingo golang服务器之-xingo的单进程,集群服务器的配置和初始化过程
http://www.jb51.cc/article/p-hkmuojba-bqm.html
我们来看看xingo_demo/server.go
package main
import (
"github.com/viphxin/xingo/iface"
"github.com/viphxin/xingo/logger"
"github.com/viphxin/xingo/utils"
"xingo_demo/api"
"xingo_demo/core"
"github.com/viphxin/xingo"
_ "net/http"
_ "net/http/pprof"
_ "runtime/pprof"
_ "time"
"xingo_demo/cmd"
)
func DoConnectionMade(fconn iface.Iconnection) {
logger.Debug("111111111111111111111111")
p,_ := core.WorldMgrObj.AddPlayer(fconn)
fconn.SetProperty("pid",p.Pid)
}
func DoConnectionLost(fconn iface.Iconnection) {
logger.Debug("222222222222222222222222")
pid,_ := fconn.GetProperty("pid")
p,_ := core.WorldMgrObj.GetPlayer(pid.(int32))
//移除玩家
core.WorldMgrObj.RemovePlayer(pid.(int32))
//消失在地图
p.LostConnection()
}
func main() {
s := xingo.NewXingoTcpServer()
//add gm command
if utils.GlobalObject.CmdInterpreter != nil {
utils.GlobalObject.CmdInterpreter.AddCommand(cmd.NewOnlineCommand())
}
//test
s.AddRouter("msg_load_bg",&api.Api_msg_dead_info_Router{})
//add api ---------------start
s.AddRouter("0",&api.Api0Router{})
s.AddRouter("2",&api.Api2Router{})
s.AddRouter("3",&api.Api3Router{})
//add api ---------------end
//regest callback
utils.GlobalObject.OnConnectioned = DoConnectionMade
utils.GlobalObject.OnClosed = DoConnectionLost
// go func() {
// fmt.Println(http.ListenAndServe("localhost:6061",nil))
// // for {
// // time.Sleep(time.Second * 10)
// // fm,err := os.OpenFile("./memory.log",os.O_RDWR|os.O_CREATE,0644)
// // if err != nil {
// // fmt.Println(err)
// // }
// // pprof.WriteHeapProfile(fm)
// // fm.Close()
// // }
// }()
//s.Start()
//// close
//c := make(chan os.Signal,1)
//signal.Notify(c,os.Interrupt,os.Kill)
//sig := <-c
//fmt.Println("=======",sig)
//s.Stop()
s.Serve()
}
这就是关键的地方
“xingo_demo/core”
这里就是游戏逻辑核心库:
aoi.go,player.go,worldmgr.go
另外两个好理解,aoi.go是什么呢?
1.有道了一下:
Hello to all Chinese friends,I’m Sora Aoi.
中国的朋友们你们好,我是苍井空。
简直就是—shit!!!
2.百度:
这里有个真正的介绍AOI的:
http://www.jb51.cc/article/p-xyqozsqo-go.html
实际上AOI是AOI (Area of Interest) (地图的有效区域)
这么以来就不难理解了,查看代码全是格子处理,所以aoi.go 就不难理解了;
这个Package,只有worldmgr.go有init()函数
所以游戏逻辑的入口就是:
worldmgr.go init()
下面我们看看init函数
func init() {
logger.Info("start,world 管理。。。")
WorldMgrObj = &WorldMgr{
PlayerNumGen: 0,Players: make(map[int32]*Player),AoiObj1: NewAOIMgr(85, 410, 75, 400, 10, 20),}
logger.Info("over,world 管理!!!!@@@@")
}
我特意打了log,go run server.go
可以很清晰看到游戏逻辑初始化过程; 主要是玩家和Aoi 初始化 下一节,解析xingo_demo的整个游戏net逻辑
原文链接:https://www.f2er.com/go/188176.html