Space类
import KBEngine
成员函数
def addTimer( self, initialOffset, repeatOffset=0, userArg=0 ):
def delTimer( self, id ):
def destroy( self, deleteFromDB, writeToDB ):
def destroyCellEntity( self ):
def getComponent( self, componentName, all ):
def fireEvent( self, eventName, *args ):
def registerEvent( self, eventName, callback ):
def deregisterEvent( self, eventName, callback ):
def writeToDB( self, callback, shouldAutoLoad, dbInterfaceName ):
回调函数
def onCreateCellFailure( self ):
def onDestroy( self ):
def onGetCell( self ):
def onLoseCell( self ):
def onPreArchive( self ):
def onRestore( self ):
def onTimer( self, timerHandle, userData ):
def onWriteToDB( self, cellData ):
属性
databaseID 只读 int64
databaseInterfaceName 只读 string
shouldAutoArchive True, False or KBEngine.NEXT_ONLY
shouldAutoBackup True, False or KBEngine.NEXT_ONLY
详细描述
Space空间是一个抽象概念,它只是存在于cellapp的内存中。通过Baseapp的KBEngine.Space实体的创建让引擎在Cellapp上分配一个空间,并把对应实体的cell部分创建到这个新的空间内。
这个空间与其他空间隔离,View视图、触发器系统、实体碰撞等等只在当前空间相互影响。
由于空间是一个抽象的概念,所以具体是什么,是由用户来定义,它可以是一个场景、副本、房间等等等。比如,在一个MMORPG中,一张地图或一个副本就是一个Space空间,只有空间内的角色、怪物、NPC可以互相交互。当跳转或传送到另一张地图时,之前的怪物、NPC就不可见了,你也无法对刚才地图里的怪物进行攻击,也无法对刚才地图中的NPC进行交谈。再比如,棋牌游戏中,一般有很多房间,每个房间是一个牌局,玩家在一个房间内进行该局游戏过程,两个房间互相之间不会有交互(聊天等等的系统除外)。
Space其实就是一个Entity,Space会在创建时自动调用createCellEntityInNewSpace创建。
所有属性、方法都和Entity一样,但我们为了避免混淆,这里会删除Space用不到的方法与属性。
成员函数文档
def addTimer( self, initialOffset, repeatOffset=0, userArg=0 ):
功能说明:
注册一个定时器,定时器由回调函数*onTimer* 触发,回调函数将在"initialOffset"秒后被执行第1次,而后将每间隔"repeatOffset"秒执行1次,可设定一个用户参数"userArg"(仅限integer类型)。
onTimer 函数必须在entity的base部分被定义,且带有2个参数,第1个integer类型的是timer的id(可用于移除timer的"delTimer "函数),第2个是用户参数"userArg"。
例子:
# 这里是使用addTimer的一个例子
import KBEngine
class MyBaseEntity( 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 "MyBaseEntity.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, deleteFromDB, writeToDB ):
功能说明:
这个函数销毁该实体的base部分。如果实体存在cell部分,那么用户必须先销毁cell部分,否则将会产生错误。要销毁实体的cell部分,调用Entity.destroyCellEntity。
也许在onLoseCell回调里调用self.destroy更为恰当。这能保证实体的base部分被销毁。
参数:
deleteFromDB: 如果是True,在数据库里与这个实体有关联的条目将会被删除,该参数默认为False。
writeToDB: 如果是True,与这个实体相关联的存档属性将会写入数据库。只有在这个实体是从数据库读取的或者是使用过Entity.writeToDB 写入数据库才会被执行。这个参数默认为True,但当deleteFromDB为True的时候它将被忽略。
def destroyCellEntity( self ):
功能说明:
destroyCellEntity请求销毁关联的cell实体。如果没有关联的cell实体该方法将会产生错误。
def writeToDB( self, callback, shouldAutoLoad, dbInterfaceName ):
功能说明:
该函数保存这个实体的存档属性到数据库,使得以后需要的时候可以重新从数据库加载。
实体也可以被标记为自动加载,这样当服务启动后实体将会被重新创建。
参数:
callback: 这个可选参数是当数据库操作完成后的回调函数。 它有两个参数。第一个是boolean类型标志成功或失败,第二个是base实体。
shouldAutoLoad: 这个可选参数指定这个实体在服务启动的时候是否需要从数据库加载。
TIP
注意:服务器启动时自动加载实体,底层默认将会调用createEntityAnywhereFromDBID将实体创建到一个负载最小的baseapp上,整个过程将会在第一个启动的baseapp调用onBaseAppReady之前完成。
脚本层可以在个性化脚本(kbengine_defaults.xml->baseapp->entryScriptFile定义)中重新实现实体的创建方法,例如:
def onAutoLoadEntityCreate(entityType, dbid):
KBEngine.createEntityFromDBID(entityType, dbid)dbInterfaceName: string,可选参数,指定由某个数据库接口来完成, 默认使用"default"接口。数据库接口由kbengine_defaults.xml->dbmgr->databaseInterfaces中定义。
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 onCreateCellFailure( self ):
功能说明:
如果这个函数在脚本中有实现,这个函数在cell实体创建失败的时候被调用。 这个函数没有参数。
def onDestroy( self ):
功能说明:
如果这个函数在脚本中有实现,这个函数在调用Entity.destroy()后,在实际销毁之前被调用。 这个函数没有参数。
def onGetCell( self ):
功能说明:
如果这个函数在脚本中有实现,这个函数在它获得cell实体的时候被调用。 这个函数没有参数。
def onLoseCell( self ):
功能说明:
如果这个函数在脚本中有实现,这个函数在它关联的cell实体销毁之后被调用。 这个函数没有参数。
def onPreArchive( self ):
功能说明:
如果这个函数在脚本中有实现,这个函数在该实体自动写入数据库之前被调用。这个回调在Entity.onWriteToDB 回调之前被调用。
如果该回调返回False,该归档操作中止。这个回调应该返回True使得操作继续。如果这个回调不存在,则归档操作继续进行。
def onRestore( self ):
功能说明:
如果这个函数在脚本中有实现,这个函数在Entity应用程序崩溃后在其它Entity应用程序上 重新创建该实体时被调用。 这个函数没有参数。
def onTimer( self, timerHandle, userData ):
功能说明:
这个函数当一个与此实体关联的定时器触发的时候被调用。 一个定时器可以使用Entity.addTimer函数添加。
参数:
timerHandle: 定时器的id。
userData: 传进Entity.addTimer的integer用户数据。
def onWriteToDB( self, cellData ):
功能说明:
如果这个函数在脚本中有实现,这个函数在实体数据将要写进数据库的时候被调用。
需要注意的是在该回调里调用writeToDB会导致无限循环。
参数:
cellData: 包含将要存进数据库的cell属性。 cellData是一个字典。
属性文档
cell
说明:
cell是用于联系cell实体的ENTITYCALL。这个属性是只读的,且如果这个base实体没有关联的cell时属性是None。
类型:
只读 ENTITYCALL
cellData
说明:
cellData是一个字典属性。每当base实体没有创建它的cell实体时,cell实体的属性会保存在这里。
如果cell实体被创建,这些用到的值和cellData属性将被删除。除了cell实体在实体定义文件里指定的属性外,它还包含position, direction and spaceID。
类型:
className
说明:
实体的类名。
类型:
只读 string
databaseID
说明:
databaseID是实体的永久ID(数据库id)。这个id是uint64类型且大于0,如果是0则表示该实体不是永久的。
类型:
只读 int64
databaseInterfaceName
说明:
databaseInterfaceName是实体持久化所在的数据库接口名称,该接口名称在kbengine_defaults->dbmgr中配置。实体必须持久化过(databaseID>0)该属性才可用,否则返回空字符串。
类型:
只读 string
id
说明:
id是实体的对象id。这个id是一个整型,在base,cell和client相关联的实体之间是相同的。 这个属性是只读的。
类型:
只读 int32
isDestroyed
说明:
如果该Entity实体已经被销毁了,这个属性为True。
类型:
bool
shouldAutoArchive
说明:
这个属性决定了自动存档的策略。如果设为True,自动存档将可用,如果设为False,自动存档将不可用。 如果设为KBEngine.NEXT_ONLY,自动存档将在下一个预定的时间可用, 在下一次存档后,这个属性将置为False。
类型:
True, False or KBEngine.NEXT_ONLY
shouldAutoBackup
说明:
这个属性决定了自动备份的策略。如果设为True,自动备份将可用,如果设为False,自动备份将不可用。 如果设为KBEngine.NEXT_ONLY,自动备份将在下一个预定的时间可用, 在下一次备份后,这个属性将置为False。
类型: