目录

2. 实体的Python实现

第一步:创建文件

本文档中会使用pycharm或visual studio code做编码IDE,请忽略一些提示性的IDE警告。

base部分的脚本必须创建在scripts/base文件夹下。我们来创建一个名为FirstEntity.py的文件(注意:def中使用FirstEntity,这里也要用FirstEntity,且区分大小写)。

1

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是CBE引擎的模块,几乎所有引擎的api都是在该模块内的。

3、KBEDebug是辅助模块,用来调试以及输出日志。

4、类名使用FirstEntity,和def中的定义一致,并且继承KBEngine.Proxy。

什么是Proxy?

Proxy是一种特殊的Entity。客户端要和服务端保持连接,就需要使用Proxy,在服务端上它代表一个客户端连接。


接着往下走,我们来实现def中声明的方法

第二步:实现def中的say方法

由于say方法声明在CellMethods中,需要在scripts/cell中也同样创建一个FirstEntity.py的文件,如下图:

1

打开文件并写入:

# -*- 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声明时使用了<Exposed/>标签,而代码中也需要新增一个参数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空间实体


Copyright © 2018 Yolo Technologies. Publication: 2.0-025. Built: 2018-12-07.