🗺️ 创建第一个Space空间
创建第一个Space空间
上一小节中,我们成功创建了一个FirstEntity实体,但是它没有放入到某个空间中(不在一个空间时,在客户端上是无法和它进行互动、通讯的)。本文会介绍如何创建一个Space空间的实体,使我们的FirstEntity在空间内互动。
为了便于对本文的理解,先回顾一下《引擎Overview》中提到的Space概念:
提示
Space空间是cell上的一个抽象的概念,每个Space相当于一个空间,它可以是一个场景、一个副本、一个房间等等等。
我们的FirstEntity就是需要这么一个空间来进行交互。
和上一小节类似,我们先从def配置开始。
第一步:Entity声明
在{项目资产库}/scripts/entities.xml文件中,添加FirstSpace:
<root>
<FirstEntity hasClient="true"></FirstEntity>
<FirstSpace></FirstSpace>
</root>
本教程中的FirstSpace实体是不需要客户端部分的,所以这里,没有指明hasClient字段。
第二步:def配置
在“scripts/entity_defs”下,新建一个名为FirstSpace.def的文件,写入:
<root>
<!-- BaseApp上的远程方法 -->
<BaseMethods>
</BaseMethods>
<!-- CellApp上的远程方法 -->
<CellMethods>
</CellMethods>
</root>
该实体下使用了最简单的申明方式,没有申明任何远程方法。
第三步:Python实现
1. base部分的实现
在“scripts/base”文件夹下创建FirstSpace.py文件。
class FirstSpace(KBEngine.Space):
"""
FirstSpace的base部分,
注意:它是一个实体,并不是真正的space,真正的space存在于cellapp的内存中,通过这个实体与之关联并操控space。
"""
def __init__(self):
KBEngine.Space.__init__(self)
# 存储在globalData中,方便获取
KBEngine.globalData["FirstSpace"] = self
1、空间实体会继承自KBEngine.Space;
2、我们在__init__时直接调用KBEngine.globalData["FirstSpace"] = self,使用全局变量globalData字典来保存自己,方便在其他地方直接获取到自己。
小贴士:在本节后续部分中,会使用该字典获取到FirstSpace对象,通过该对象可以立即把FirstEntity的cell部分创建在该空间中。
2. cell部分的实现
在scripts/cell文件夹下创建FirstSpace.py文件。
class FirstSpace(KBEngine.Space):
"""
FirstSpace的cell部分。
"""
def __init__(self):
KBEngine.Space.__init__(self)
pass
cell部分使用最简单的Space实体的实现方法,这里不再赘述。
第四步:Baseapp就绪时,创建Space空间
因为需要把FirstEntity放入空间,所以必须先创建Space实体对象,本教程选择在Baseapp就绪时,对空间进行创建。
我们看下流程:

修改kbemain.py
打开文件scripts/base/kbemain.py,在onBaseAppReady函数中,添加如下代码:
# baseapp就绪时,创建一个Space空间实体
KBEngine.createEntityLocally("FirstSpace", {})
结果如下图:

这里我们通过createEntityLocally的API,对FirstSpace实体进行了创建,第一个参数是Entity类型字符串即FirstSpace类型,第二个参数是Entity属性字典,这里使用空字典对象。当服务器启动时,就会创建它。
OK,我们启动引擎,验证一下空间是否会在开启服务器时创建吧!
第五步:验证空间是否创建
1. 启动引擎
在本项目的资产库“getstarted_assets”下,找到start_server.bat,并双击运行。

会出现许多窗口,如下图:

等待所有服务器组件的窗口都出现“Found all the components!”字样,就说明成功启动了。
[INFO]: Found all the components!
提示
Tips:初次启动引擎时,MySQL需要初始化一些表结构,可能会花上几分钟请耐心等待完成。
ok,看到所有窗口都出现”Found all the components!”时,恭喜你,成功启动了引擎!!
2. 查找FirstSpace实体
在本项目的资产库“getstarted_assets”下,找到guiconsole.bat,并双击运行。
在出现的窗口中选中baseapp和它的Debug选项卡。如下图:

GUIConsole是引擎提供的工具,可以使用python控制台进行Debug。在其他章节中会详细讲解,这里不再赘述。
查询FirstSpace的entity id,在Debug选项卡中输入如下语句,并按Ctrl+Enter发送:
KBEngine.entities.items()
从结果中看到,有FirstSpace的实体,其id为1,说明FirstSpace创建成功!如下图:

3. 关闭引擎
和启动引擎类似,在本项目的资产库“getstarted_assets”下,找到kill_server.bat,并双击运行。
刚才出现的服务器组件窗口会自动关闭。待窗口全部关闭后,引擎即已完成关闭。
最后一步:让我们的FirstEntity进入空间
有了Space空间,但是我们的FirstEntity还没有任何方式方法进入该空间。我们可以在客户端连接服务器并和FirstEntity关联时,就立马进入空间。
打开之前base部分代码,scripts/base/FirstEntity.py,添加onClientEnabled回调函数,最终如下:
class FirstEntity(KBEngine.Proxy):
"""
第一个实体的base部分的实现
"""
def __init__(self):
KBEngine.Entity.__init__(self)
def onClientEnabled(self):
"""
该entity被正式激活为可使用, 此时entity已经建立了client对应实体。
"""
# 客户端一旦连接,就把他放入FirstSpace空间
first_space = KBEngine.globalData["FirstSpace"]
self.createCellEntity(first_space.cell)
可以看到,简单的从KBEngine.globalData["FirstSpace"]中获取到FirstSpace,并调用了createCellEntity方法,把我们的FirstEntity创建到FirstSpace的cell部分所在的空间中去。值得注意的是,这里的参数使用first_space.cell,该api需要提供的是first_space实体的cell部分。
恭喜你,FirstEntity已经能进入到一个Space空间里了!
OK,我们的FirstSpace空间实体已经创建完毕。
当客户端登录进服务器时,FirstEntity就会被放入该空间,客户端向服务器进行say请求后,服务器会在该空间中广播,所有空间内的客户端都会收到。
至此,Get Started章节的服务端已全部介绍完毕,完整的服务器端代码下载:server.zip
注意:
server源代码的配置中,数据库连接配置为localhost:3306,如果有区别请自行修改。可参考:《DBMgr配置》
开发者应该已经迫不及待的想要让我们第一个实体能连接进服务器并进入空间了吧?那我们马上来看如何实现客户端部分的代码。
点击链接进入下一节:《客户端对应实现》。