我学xingo golang服务器之-xingo_demo 服务器游戏逻辑处理初始化过程

我学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://blog.csdn.net/atgczcl/article/details/75312474

我们来看看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://blog.csdn.net/kenkao/article/details/5668575
实际上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://blog.csdn.net/atgczcl/article/details/76034435
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

我学xingo golang服务器之-xingo_demo 服务器游戏逻辑处理初始化过程

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭