目录

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的关系

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所在空间中放入目标实体。非常方便。


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