Skip to content

EntityComponent类

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

import KBEngine

成员函数

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

def delTimer( self, id ):

def clientEntity( self, destID ):

回调函数

def onAttached( self,owner ):

def onDetached( self ,owner):

def onDestroy( self ):

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

def onEnteredView( self, entity ):

def onGetWitness( self ):

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

def onLoseControlledBy( self, id ):

def onLoseWitness( self ):

def onMove( self, controllerID, userData ):

def onMoveOver( self, controllerID, userData ):

def onMoveFailure( self, controllerID, userData ):

def onRestore( self ):

def onSpaceGone( self ):

def onTurn( self, controllerID, userData ):

def onTeleport( self ):

def onTeleportFailure( self ):

def onTeleportSuccess( self, nearbyEntity ):

def onTimer( self, timerHandle, userData ):

def onUpdateBegin( self ):

def onUpdateEnd( self ):

def onWitnessed( self, isWitnessed ):

def onWriteToDB( self ):

属性

ownerID 只读 int32

owner 只读 ENTITYCALL

name 只读 string

allClients 只读 PyClient

base 只读 BaseEntityCall

client 只读 ClientEntityCall

className 只读 string

isDestroyed 只读 bool

otherClients 只读 PyClient

详细描述

在传统的结构设计中一般会使用“派生”来描述对象之间的关系。子类通过派生父类,来获得父类的功能。在设计游戏对象时,会根据游戏本身的需要而为游戏对象添加各种功能支持,比如渲染,碰撞,刚体,粒子系统等等。这些通用功能为了能够为各种派生类提供服务,都必须实现到基类中。这样就导致了游戏对象基类变得非常庞大臃肿,即难使用,又难维护。

“基于组件”的对象模型就是把所有需要提供给游戏对象的基础功能都独立成单独的“组件模块”(Component) ,一个具体的游戏对象可以将它需要的功能模块组合到一起使用。所有“功能”不再是父类中的接口,而变成子对象实例,为游戏对象提供服务。这样既保证了功能代码的可重用性,又增加了整个对象体系的模块化和灵活度。

成员函数文档

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 clientEntity( self, destID ):

功能说明:

通过这个方法可以访问自己客户端(当前实体必须绑定了客户端)中某个实体的方法,只有在View范围内的实体才会同步到客户端。它只能在一个real 实体上被调用。

参数:

destID: 目标实体的ID。

回调函数文档

def onAttached( self, owner ):

功能说明:

如果这个函数在脚本中有实现,这个函数在该组件被附加的时候被调用。

参数:

owner: 该组件的拥有者的实体对象。


def onDetached( self, owner ):

功能说明:

如果这个函数在脚本中有实现,这个函数在该组件被分离的时候被调用。

参数:

owner: 该组件的拥有者的实体对象。


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 onEnteredView( self, entity ):

如果这个函数在脚本中有实现,当一个实体进入了当前实体的View范围,该回调被触发。

参数:

entity:进入View范围的实体。


def onGetWitness( self ):

如果这个函数在脚本中有实现,当实体绑定了Witness时被调用。
也可以访问实体属性Entity.hasWitness得到实体当前的状态。


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 onLoseControlledBy( self, id ):

如果这个函数在脚本中有实现,当Entity.controlledBy 所关联的实体丢失时改回调方法被调用。

参数:

id:controlledBy实体的ID。


def onLoseWitness( self ):

如果这个函数在脚本中有实现,当实体解除Witness时,该回调被触发。
也可以访问实体属性Entity.hasWitness得到实体当前的状态。


def onMove( self, controllerID, userData ):

如果这个函数在脚本中有实现,相关的Entity.moveToPointEntity.moveToEntity 还有Entity.navigate 方法被调用并且成功后底层每帧移动都会回调此函数。

参数:

controllerID:与某个移动相关的控制器ID。

userData:这个参数值由用户在请求移动相关接口时给出。


def onMoveOver( self, controllerID, userData ):

如果这个函数在脚本中有实现,相关的Entity.moveToPointEntity.moveToEntity 还有Entity.navigate方法被调用后到达指定目标点时会回调此函数。

参数:

controllerID:与某个移动相关的控制器ID。

userData:这个参数值由用户在请求移动相关接口时给出。


def onMoveFailure( self, controllerID, userData ):

如果这个函数在脚本中有实现,相关的Entity.moveToPointEntity.moveToEntity 还有Entity.navigate方法被调用并且失败时会回调此函数。

参数:

controllerID:与某个移动相关的控制器ID。

userData:这个参数值由用户在请求移动相关接口时给出。


def onRestore( self ):

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


def onSpaceGone( self ):

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


def onTurn( self, controllerID, userData ):

如果这个函数在脚本中有实现,相关的Entity.addYawRotator 方法被调用后到达指定yaw时会回调此函数。

参数:

controllerIDEntity.addYawRotator返回的控制器ID。

userData:这个参数值由用户在请求移动相关接口时给出。


def onTeleport( self ):

如果这个函数在脚本中有实现,在通过baseapp的Entity.teleport调用发生的实体传送中,实体(Real entity)被传送之前的时刻此方法会被调用。
请注意,在cell上调用实体的teleport并不会回调此接口,如果你需要这个功能请在Entity.teleport 之后调用此回调。


def onTimer( self, timerHandle, userData ):

功能说明:

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

参数:

timerHandle: 定时器的id。

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


def onTeleportFailure( self ):

如果这个函数在脚本中有实现,当用户调用Entity.teleport失败时该回调被调用。


def onTeleportSuccess( self, nearbyEntity ):

如果这个函数在脚本中有实现,当用户调用Entity.teleport成功时该回调被调用。

参数:

[nearbyEntity]

这个参数由用户调用 Entity.teleport时给出。这是一个real实体。


def onUpdateBegin( self ):

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


def onUpdateEnd( self ):

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


def onWitnessed( self, isWitnessed ):

如果这个函数在脚本中有实现,如果当前实体进入了另一个绑定了Witness的实体的View范围(也可以理解为一个实体被观察者观察到了),则该实体的回调函数被调用。
可以利用这个函数在实体被观察时激活实体的AI,实体停止被观察时可以停止AI的执行,这样可以降低服务端的计算量从而提升效率。

参数:

isWitnessed:bool,实体被观察时为True,实体被停止观察时是False。也可以访问实体属性Entity.isWitnessed 得到实体当前的状态。


def onWriteToDB( self ):

如果这个函数在脚本中有实现,这个函数在实体将要存档到数据库时被调用。

属性文档

ownerID

说明:

ownerID是拥有者的实体ID。这个id是一个整型。 这个属性是只读的。

类型:

只读 int32


owner

说明:

owner是指明该组件的拥有者的实体对象
在使用时需要self.owner.xxx调用owner实体的对应方法

类型:

只读 ENTITYCALL


name

说明:

组件的名称。

类型:

只读 string


allClients

通过这个属性调用实体的客户端远程方法,引擎会将这个消息广播给实体View范围内所有的其他绑定了客户端的实体( 包括自己的客户端,绑定了客户端的实体通常为玩家)。

例子:

avatar的View范围内有玩家A和玩家B以及怪物C。
avatar.allClients.attack(monsterID,skillID, damage)

此时,玩家自己和玩家A还有玩家B的客户端都会调用到该实体attack方法,在他们的客户端可以调用指定技能的攻击动作做表现。

其他参考:

Entity.clientEntity
Entity.otherClients


base

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

其他参考:

Entity.clientEntity
Entity.allClients
Entity.otherClients

类型:

只读 ENTITYCALL


client

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

其他参考:

Entity.clientEntity
Entity.allClients
Entity.otherClients

类型:

只读 ENTITYCALL


className

实体的类名。

类型:

只读 string


isDestroyed

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

类型:

只读 bool


otherClients

通过这个属性调用实体的客户端远程方法,引擎会将这个消息广播给实体View范围内所有的其他绑定了客户端的实体( 不包括自己的客户端,绑定了客户端的实体通常为玩家)。

例子:

avatar的View范围内有玩家A和玩家B以及怪物C。
avatar.otherClients.attack(monsterID,skillID, damage)

此时,玩家A与玩家B的客户端都会调用到该实体attack方法,在他们的客户端可以调用指定技能的攻击动作做表现。

其他参考:

Entity.clientEntity
Entity.otherClients

文档内容由 Comblock® 提供