第二步:Python实现
实体的Python实现
第一步:创建文件
本文档中会使用pycharm或visual studio code做编码IDE,请忽略一些提示性的IDE警告。
base部分的脚本必须创建在scripts/base
文件夹下。我们来创建一个名为FirstEntity.py的文件(注意:def中使用FirstEntity,这里也要用FirstEntity,且区分大小写)。
提示
Tips:使用“创建资产库”工具时会默认生成kbemain.py
和Account.py
,其中kbemain.py
是base的入口脚本,在章节脚本篇-app的入口脚本 中会详细介绍。Account.py
是用来控制账户实体的。这里我们先忽略它们。
在FirstEntity.py文件中写入:
# -*- coding: utf-8 -*-
import KBEngine
from KBEDebug import *
class FirstEntity(KBEngine.Proxy):
"""
第一个实体的base部分的实现
"""
def __init__(self):
KBEngine.Entity.__init__(self)
1、# -- coding: utf-8 --,这是Python的基础写法,不再赘述。
2、引入KBEngine模块,import KBEngine,KBEngine是KBE引擎的模块,几乎所有引擎的api都是在该模块内的。
3、KBEDebug是辅助模块,用来调试以及输出日志。
4、类名使用FirstEntity,和def中的定义一致,并且继承KBEngine.Proxy。
什么是Proxy?
Proxy是一种特殊的Entity。客户端要和服务端保持连接,就需要使用Proxy,在服务端上它代表一个客户端连接。
接着往下走,我们来实现def中声明的方法
第二步:实现def中的say方法
由于say方法声明在CellMethods中,需要在scripts/cell中也同样创建一个FirstEntity.py的文件,如下图:
打开文件并写入:
# -*- coding: utf-8 -*-
import KBEngine
from KBEDebug import *
class FirstEntity(KBEngine.Entity):
"""
第一个实体的cell部分的实现
"""
def __init__(self):
KBEngine.Entity.__init__(self)
# 通知客户端,本实体已进入
self.client.onEnter()
def say(self, callerID, content):
"""
实现了CellMethods中的say方法,content即为申明的类型为UNICODE的参数
:param callerID: 调用者ID
:param content: say的内容
:return:
"""
INFO_MSG("FirstEntity::say")
# 广播给所有客户端的onSay方法
self.allClients.onSay("Entity: " + str(self.id) + " " + content)
1、首先我们来看一下__init__中,执行了self.client.onEnter()。之前在def的ClientMethods中对onEnter进行了申明,所以这边只需简单的通过client.onEnter即可通知到本实体关联的客户端。
2、我再来看say方法。其使用def中定义的名字作为方法名,由于该方法是可以给客户端调用,所以def声明时使用了标签,而代码中也需要新增一个参数callerID与之对应,其由引擎来指明是谁在调用该远程方法。除此之外,其他参数的数量要和def中定义的一致,如def中申明了一个UNICODE的参数,这里参数content与之对应,表示接收到的say的内容。
这样,我们的客户端可以向FirstEntity实体进行say的请求了。
3、INFO_MSG,是日志输出。
4、self.allClients.onSay,是广播给所有客户端的onSay方法。之前在def的ClientMethods中也有对onSay进行了申明,所以可以通过allClients属性进行广播。
好了,至此,我们第一个Entity实体已经制作完成了。
之前的工作都是在进行一个Entity的制作,但还没有被引擎创建出来。下面介绍下该实体对象是如何被创建。
第三步:使用账户入口对实体进行创建
使用账户入口实体,是为了当客户端连接服务器时就可以创建出我们FirstEntity实体,并与客户端保持连接。
之前在base部分创建FirstEntity脚本时,继承的是KBEngine.Proxy,是为了简化本教程,把账户入口实体与我们第一个实体合二为一。此处需对引擎的配置做出一些调整,方法如下:
1、打开{项目资产库}/res/server/kbengine.xml
2、找到dbmgr->account_system标签,在其下添加accountEntityScriptType,并设置为FirstEntity。结果如下图:

关于账户入口,详情请参见《用户入口实体(Account)》文档。
关于引擎配置,请参见《kbengine.xml配置》文档。
恭喜你,第一个Entity已经创建完毕!
做得好,我们第一个Entity已经完成。
那从客户端上如何发送say hello,并收到服务器的广播呢?首先,需要把该实体放入一个空间(实体只有被放置在一个空间内,才能进行空间内的交互,包括广播消息、位置移动等)。
下面会我们来看看如何创建一个空间,并把FirstEntity放入该空间。点我跳转下一节创建第一个Space空间实体。