Skip to content

Space类

Space是KBEngine模块的一部分。 更多...

import KBEngine

成员函数

def addProximity( self, range, userArg ):

def addTimer( self, start, interval=0.0, userData=0 ):

def delTimer( self, id ):

def destroy( self ):

def entitiesInRange( self, range, entityType=None, position=None ):

def getRandomPoints( self, centerPos, maxRadius, maxPoints, layer ):

def getComponent( self, componentName, all ):

def fireEvent( self, eventName, *args ):

def registerEvent( self, eventName, callback ):

def deregisterEvent( self, eventName, callback ):

回调函数

def onDestroy( self ):

def onEnterTrap( self, entity, rangeXZ, rangeY, controllerID, userArg ):

def onLeaveTrap( self, entity, rangeXZ, rangeY, controllerID, userArg ):

def onRestore( self ):

def onSpaceGone( self ):

def onTimer( self, timerHandle, userData ):

def onUpdateBegin( self ):

def onUpdateEnd( self ):

属性

spaceID 只读 Integer

base 只读 BaseEntityCall

className 只读 string

id 只读 Integer

isDestroyed 只读 bool

详细描述

Space空间是一个抽象概念,它只是存在于cellapp的内存中。通过Baseapp的KBEngine.Space实体的创建让引擎在Cellapp上分配一个空间,并把对应实体的cell部分创建到这个新的空间内。

这个空间与其他空间隔离,View视图、触发器系统、实体碰撞等等只在当前空间相互影响。

由于空间是一个抽象的概念,所以具体是什么,是由用户来定义,它可以是一个场景、副本、房间等等等。比如,在一个MMORPG中,一张地图或一个副本就是一个Space空间,只有空间内的角色、怪物、NPC可以互相交互。当跳转或传送到另一张地图时,之前的怪物、NPC就不可见了,你也无法对刚才地图里的怪物进行攻击,也无法对刚才地图中的NPC进行交谈。再比如,棋牌游戏中,一般有很多房间,每个房间是一个牌局,玩家在一个房间内进行该局游戏过程,两个房间互相之间不会有交互(聊天等等的系统除外)。

Space其实就是一个Entity,Space会在创建时自动调用createCellEntityInNewSpace创建。

所有属性、方法都和Entity一样,但我们为了避免混淆,这里会删除Space用不到的方法与属性。

成员函数文档


def addProximity( self, rangeXZ, rangeY, userArg ):

功能说明:

创建一个范围触发器,当有其它实体进入或离开这个触发器区域的时候会通知这个Entity 。这个区域是一个方形(为了效率)。如果其它实体在x轴和z轴上均在给定的距离里面,则实体被视为在这个范围里面。这个Entity 通过onEnterTrap和onLeaveTrap函数被通知,这两个函数可以如下定义:

py
def onEnterTrap( self, entityEntering, rangeXZ, rangeY, controllerID, userArg = 0 ):
def onLeaveTrap( self, entityLeaving, rangeXZ, rangeY, controllerID, userArg = 0 ):

由于这个范围触发器是一个控制器,使用Entity.cancelController 带上控制器ID来删除它。

需要注意的是回调有可能会立刻被触发,即使在addProximity()调用返回之前。

参看:

Entity.cancelController

参数:

rangeXZ: float,给定触发器xz轴区域的大小,必须大于等于0。

rangeY: float,给定触发器y轴高度,必须大于等于0。

需要注意的是,这个参数要生效必须开放kbengine_defaults.xml->cellapp-> coordinate_system->rangemgr_y ,开放y轴管理会带来一些消耗,因为一些游戏大量的实体都在同一y轴高度或者在差不多水平线高度,此时碰撞变得非常密集。

3D太空类游戏或者小房间类实体较少的游戏比较适合开放此选项。

userArg: 是一个可选的整型,所有控制器共有。如果这个值不为0则传给回调函数。建议 在回调原型里设置默认值为0。

返回:

返回创建控制器的id。


def addTimer( self, start, interval=0.0, userData=0 ):

功能说明:

注册一个定时器,定时器由回调函数*onTimer* 触发,回调函数将在"initialOffset"秒后被执行第1次,而后将每间隔"repeatOffset"秒执行1次,可设定一个用户参数"userArg" (仅限integer类型)。

onTimer 函数必须在entity的cell部分被定义,且带有2个参数,第1个integer类型的是timer的id(可用于移除timer的"delTimer "函数),第2个是用户参数"userArg"。

例子:

py
# 这里是使用addTimer的一个例子
import KBEngine

class MyCellEntity( KBEngine.Entity ):

    def __init__( self ):
        KBEngine.Entity.__init__( self )

        # 增加一个定时器,5秒后执行第1次,而后每1秒执行1次,用户参数是9
        self.addTimer( 5, 1, 9 )

        # 增加一个定时器,1秒后执行,用户参数缺省是0
        self.addTimer( 1 )

    # Entity的定时器回调"onTimer"被调用
    def onTimer( self, id, userArg ):
        print "MyCellEntity.onTimer called: id %i, userArg: %i" % ( id, userArg )
        # if 这是不断重复的定时器,当不再需要该定时器的时候,调用下面函数移除:
        #     self.delTimer( id )

参数:

initialOffset: float,指定定时器从注册到第一次回调的时间间隔(秒)。

repeatOffset: float,指定第一次回调执行后每次执行的时间间隔(秒)。必须用函数delTimer 移除定时器,否则它会一直重复下去。值小于等于0将被忽略。

userArg: integer,指定底层回调"onTimer"时的userArg参数值。

返回:

integer,该函数返回timer的内部id,这个id可用于delTimer移除定时器。


def delTimer( self, id ):

功能说明:

函数delTimer用于移除一个注册的定时器,移除后的定时器不再执行。只执行1次的定时器在执行回调后自动移除,不必要使用delTimer移除。 如果delTimer函数使用一个无效的id(例如已经移除),将会产生错误。

参数:

id: integer,它指定要移除的定时器id。如果参数为字符串"All",则一次性移除所有的定时器。


def destroy( self ):

功能说明:

这个函数销毁它的本地Entity实例,如果实体在其他进程上存在ghost 部分也会同时通知销毁。 这个函数最好由实体自己调用,如果这个实体是一个ghost则会抛出一个异常。如果回调函数onDestroy() 被实现则被调用。


def entitiesInRange( self, range, entityType=None, position=None ):

功能说明:

在给定的距离内搜索实体。这是一个球形的搜索,3个轴的距离 都要测量。这可以找到在这个实体View 范围之外的实体,但不能找到其他cell的实体。

例子:

py
self.entitiesInRange( 100, 'Creature', (100, 0, 100) )

搜索到'Creature'类型的实体列表('Creature'的子类实例化的实体)。中心点是(100, 0, 100),搜索半径是100米。

py
[ e for e in self.entitiesInRange( 100, None, (100,0,100) ) if isinstance( e, BaseType ) ]

将给出一个来自'BaseType'或'BaseType'的子类实例化的实体列表。

参数:

range: 围绕这个实体搜索的距离,float类型

entityType: 一个可选的字符串参数,实体的类型名称,用于匹配实体。如果实体类型是一个有效的类名( 有效的实体类型在res/scripts/entities.xml列出 ),则只有这个类型的实体会被返回,否则将这个范围的所有实体都返回。

position: 一个可选的Vector3类型参数,作为搜索半径的中心, 默认以实体自身为中心。

返回:

在给定范围内的Entity对象列表。


def getRandomPoints( self, centerPos, maxRadius, maxPoints, layer ):

功能说明:

这个函数用于获取以某个坐标点为中心一定区域内Entity.navigate 可到达的随机坐标点。

参数:

centerPos: Vector3,Entity中心坐标点

maxRadius: float,最大的搜索半径

maxPoints: uint32,最多返回的随机坐标点数量。

layer: int8,使用某个层的navmesh来搜索。

返回:

tuple,包含一个或者多个坐标的数组。


def getComponent( self, componentName, all ):

功能说明:

该函数用于获取实体所绑定的某一类组件实例。

参数:

componentName: string,组件类型名称,组件的模块名称。

all: bool,如果为True,返回所有同类组件实例,否则只返回第一个或空列表。


def fireEvent( self, eventName, *args ):

功能说明:

该函数用于触发实体事件。

参数:

eventName: string,要触发的事件名称。

args: 要附带的事件数据,可变参数。


def registerEvent( self, eventName, callback ):

功能说明:

该函数用于注册实体事件。

参数:

eventName: string,要注册监听的事件名称。

callback: 当事件触发时,用于响应该事件的回调方法。


def deregisterEvent( self, eventName, callback ):

功能说明:

该函数用于注销监听实体事件。

参数:

eventName: string,要注销监听的事件名称。

callback: 要注销监听的回调方法。

回调函数文档


def onDestroy( self ):

如果这个函数在脚本中有实现,这个函数在调用Entity.destroy()后,在实际销毁之前被调用。 这个函数没有参数。


def onEnterTrap( self, entity, rangeXZ, rangeY, controllerID, userArg ):

当注册了使用Entity.addProximity 注册了一个范围触发器,有其他实体进入触发器时,该回调函数被调用。

参数:

entity: 已经进入了范围的实体。

rangeXZ: float,给定触发器xz轴区域的大小,必须大于等于0。

rangeY: float,给定触发器y轴高度,必须大于等于0。

需要注意的是,这个参数要生效必须开放kbengine_defaults.xml->cellapp-> coordinate_system->rangemgr_y ,开放y轴管理会带来一些消耗,因为一些游戏大量的实体都在同一y轴高度或者在差不多水平线高度,此时碰撞变得非常密集。

3D太空类游戏或者小房间类实体较少的游戏比较适合开放此选项。

controllerID: 这个触发器的控制器id。

userArg: 这个参数的值由用户调用addProximity时给出,用户可以根据此参数对当前行为做一些判断。


def onLeaveTrap( self, entity, rangeXZ, rangeY, controllerID, userArg ):

如果这个函数在脚本中有实现,当实体离开了当前实体注册的范围触发器区域时被触发,范围触发器由Entity.addProximity 注册。

参数:

entity: 已经离开触发器区域的实体。

rangeXZ: float,给定触发器xz轴区域的大小,必须大于等于0。

rangeY: float,给定触发器y轴高度,必须大于等于0。

需要注意的是,这个参数要生效必须开放kbengine_defaults.xml->cellapp-> coordinate_system->rangemgr_y ,开放y轴管理会带来一些消耗,因为一些游戏大量的实体都在同一y轴高度或者在差不多水平线高度,此时碰撞变得非常密集。

3D太空类游戏或者小房间类实体较少的游戏比较适合开放此选项。

controllerID: 这个触发器的控制器ID。

userArg: 这个参数的值由用户调用addProximity时给出,用户可以根据此参数对当前行为做一些判断。


def onRestore( self ):

如果这个函数在脚本中有实现,这个函数在Cell应用程序崩溃后在其它Cell应用程序上重新创建该实体时被调用。这个函数没有参数。


def onSpaceGone( self ):

如果这个函数在脚本中有实现,当前实体所在的Space将要销毁时触发 。这个函数没有参数。


def onTimer( self, timerHandle, userData ):

功能说明:

这个函数当一个与此实体关联的定时器触发的时候被调用。 一个定时器可以使用Entity.addTimer函数添加。

参数:

timerHandle: 定时器的id。

userData: 传进Entity.addTimer的integer用户数据。


def onUpdateBegin( self ):

当同步一帧开始时被调用。


def onUpdateEnd( self ):

当同步一帧结束时被调用。

属性文档


base

base是用于联系Entity 实体的entityCall。这个属性是只读的,且如果这个实体没有关联的Entity实体时属性是None。

其他参考:

Entity.clientEntity

Entity.allClients

Entity.otherClients

类型:

只读的,ENTITYCALL


spaceID

这个属性是实体所在的空间的ID。

类型:

只读 Integer


className

实体的类名。

类型:

只读 string


id

id是Entity的对象id。这个id是一个整型,在base,cell相关联的实体之间是相同的。 这个属性是只读的。

类型:

只读 int32


isDestroyed

如果这个属性的值为True,Entity则已经被销毁了。

类型:

只读 bool

文档内容由 Comblock® 提供