🔗 概述
Space空间 概述
概念:
Space空间是一个抽象概念,它只是存在于cellapp的内存中。通过Baseapp的KBEngine.Space实体的创建或调用API:Entity.createCellEntityInNewSpace让引擎在Cellapp上分配一个空间,并把对应实体的cell部分创建到这个新的空间内。
这个空间与其他空间隔离,View视图、触发器系统、实体碰撞等等只在当前空间相互影响。
由于空间是一个抽象的概念,所以具体是什么,是由用户来定义,它可以是一个场景、副本、房间等等等。比如,在一个MMORPG中,一张地图或一个副本就是一个Space空间,只有空间内的角色、怪物、NPC可以互相交互。当跳转或传送到另一张地图时,之前的怪物、NPC就不可见了,你也无法对刚才地图里的怪物进行攻击,也无法对刚才地图中的NPC进行交谈。再比如,棋牌游戏中,一般有很多房间,每个房间是一个牌局,玩家在一个房间内进行该局游戏过程,两个房间互相之间不会有交互(聊天等等的系统除外)。
我们知道Space是在cellapp上的,那它和Entity、cell存在什么样的关系?如何创建、销毁一个Space?一个Entity如何放入到一个已知的Space中?
下面我们会围绕这几个问题来解释:
Space、Entity、Cell的关系
创建与销毁Space
如何把一个Entity实体放入到一个已知的Space中?
Space与Entity、Cell的关系
1:每个Space至少有一个Entity。这第一个Entity就是请求创建该空间,并把自己的cell部分创建到该Space中的实体对象。该实体我们称之为Space的拥有者,有权限操控该Space。
2:每个Space含有一个Cell
注意:从设计上,每个Space是可以含有多个Cell,每个Cell处理Space的一个区域。但目前不支持一个Space拆分多个Cell,在将来的版本中会陆续增加支持。
3:Cell是Cellapp上的一个处理单元,维护着Entity的列表以及Entity的属性、通讯、ghost等,对客户端client来说不可见,是服务器内部的单元。
如何创建、销毁一个Space?
假设我们有一个名为MySpace的Entity实体。
1. 使用KBEngine.Space这个类进行创建与销毁
KBEngine.Space类是为了方便Space空间的创建和销毁而提供的。利用它可以像对待一般的实体一样进行Space空间的创建和销毁。
Tips: 在引擎版本2.3.X以上版本开始提供了KBEngine.Space实体类。如果版本低于2.3.X,请使用1.2中的API方式创建。
1.1 在Base部分创建MySpace.py文件
实体的配置部分可参见Getting Started章节,这里省略。
见代码块:
# -*- coding: utf-8 -*-
import KBEngine
from KBEDebug import *
class MySpace(KBEngine.Space):
"""
MySpace的base部分,可以操控CellApp上真正MySpace的实体
注意:它是一个实体,并不是真正的space,真正的space存在于cellapp的内存中,通过这个实体与之关联并操控space。
"""
def __init__(self):
KBEngine.Space.__init__(self)
和一般的实体创建一模一样,如此,一个空间的Base部分就完成了。我们再来看看Cell部分。
1.2 在Cell部分也创建MySpace.py文件
# -*- coding: utf-8 -*-
import KBEngine
from KBEDebug import *
class MySpace(KBEngine.Space):
"""
MySpace的cell部分。
"""
def __init__(self):
KBEngine.Space.__init__(self)
也是一样。差别在于继承的类是KBEngine.Space,而不是一般实体用的KBEngine.Entity。
1.3 把MySpace创建出来
刚才都是在做MySpace的设计工作,现在我们来创建该空间。创建该空间的过程,实质是和普通实体的创建一样。
KBEngine.createEntityLocally("MySpace", {})
Tips: 关于实体的创建的详细描述,请参见API手册中createEntity相关的API。
1.4 MySpace的销毁
由于MySpace就是一个Entity实体,所以销毁和普通实体的销毁一致。
为了方便起见,我们给MySpace增加一个destroy方法。
# -*- coding: utf-8 -*-
import KBEngine
from KBEDebug import *
class MySpace(KBEngine.Space):
"""
MySpace的cell部分。
"""
def __init__(self):
KBEngine.Space.__init__(self)
def destroy(self):
self.destroy()
如上面代码可见,调用了API:destroy进行了实体的删除,同时会销毁MySpace对应的空间。
接着我们再来看看使用API如何对Space空间进行创建和销毁。
2. 使用API的创建和销毁
2.1 创建
通过Baseapp API:Entity.createCellEntityInNewSpace创建一个新空间,并把该Entity的cell部分创建到这个空间中。我们还是拿MySpace来看一下base实现:
# -*- coding: utf-8 -*-
import KBEngine
from KBEDebug import *
class MySpace(KBEngine.Entity):
"""
MySpace的base部分,可以操控CellApp上真正MySpace的实体
注意:它是一个实体,并不是真正的space,真正的space存在于cellapp的内存中,通过这个实体与之关联并操控space。
"""
def __init__(self):
KBEngine.Entity.__init__(self)
# 向cellappmgr请求创建一个cell,并关联本实体对象
# 参数cellappIndex为None,表示由引擎负载均衡进行动态选择
self.createCellEntityInNewSpace(None)
只需要该API:createCellEntityInNewSpace,即完成了Space空间的创建,又完成了MySpace实体的cell部分创建,并把MySpace的cell部分放进了该Space,成为该Space拥有者。
2.2 销毁
通过Cellapp API:Entity.destroySpace 销毁MySpace实体所在的空间
# 本脚本在MySpace的cell部分实现的代码中。
# -*- coding: utf-8 -*-
import KBEngine
from KBEDebug import *
class MySpace(KBEngine.Entity):
"""
MySpace的cell部分。space代表的是一个抽象的空间,该MySpace是该抽象空间的实体呈现,方便进行控制
"""
def __init__(self):
KBEngine.Entity.__init__(self)
def onDestroy(self):
"""
KBEngine method.
销毁时的回调
"""
# api:销毁MySpace实体所在的空间
self.destroySpace()
在MySpace的cell部分销毁时,主动调用destroySpace()来销毁所在的空间即可。
如何把一个Entity放入到一个已知的Space中?
还是拿刚才MySpace实体的例子。
# 在刚才的MySpace的base部分实现的代码中。
class MySpace(KBEngine.Space):
...省略__init__代码块
...
def login(self, avatarEntity):
"""
某个玩家请求登录到该空间
:param avatarEntity: 要进入本场景的实体
"""
# 通过实体的API:createCellEntity,即可把avatar实体放入MySpace所在空间中去。
avatarEntity.createCellEntity(self.cell)
在该例子中,我们声明了一个方法login,里面调用了要进入MySpace的实体的Baseapp API:Entity.createCellEntity,并给予MySpace实体的cell部分作为参数,即可在MySpace所在空间中放入目标实体。非常方便。