KBEngine学习笔记 - Entity_defs和EntityCall

在使用KB引擎开发中,因工作问题放了一段时间,彻底不记得entity_defs 文件中需要怎么加,他们又是怎么交互的,今天开个文档记录一下。

一般分为Properties(属性)部分、BaseMethods(基础)、CellMethods(空间)、ClientMethods(客户端)这4个部分(如下),Properties这个不是今天的重点,后面有机会单独写一个属性部分文章。

		<Properties>
		</Properties>
		<BaseMethods>
		</BaseMethods>
		<ClientMethods>
		</ClientMethods>
		<CellMethods>
		</CellMethods>

首先我们讲一下BaseMethods里需要加哪些方法。这个明白了其他的就明白了。

我们知道EntityCall是脚本层与实体远程交互的常规手段。(其他参考:allClients、otherClients、clientEntity)。

EntityCall对象在C++底层实现非常简单,它只包含了实体的ID、目的地的地址、实体类型、EntityCall类型。当用户请求一次远程交互时,底层首先能够通过实体类型找到实体定义的描述,
通过实体定义的描述对用户输入的数据进行检查,如果检查合法那么底层将数据打包并发往目的地,目的地进程根据协议进行解包最终调用到脚本层。

注意: EntityCall只能调用其对应def文件中声明过的方法,不能访问实体的属性以及其他任何信息。

一个实体最多可以包含三个部分:
client: 当实体包括客户端部分时(通常为玩家),在服务端可以访问实体的client(EntityCall)属性。
base:当实体的一部分创建在Baseapp时,在非当前Baseapp中可以访问实体的base(EntityCall)属性。
cell:当实体的一部分创建在Cellapp时,在非当前Cellapp中可以访问实体的cell(EntityCall)属性。

举例说明,假设玩家登录调用了
KBEngine.globalData[“Halls”].enterHalls(self)
表示玩家首先登录了大厅,代码如下:

		#进入了大厅
		def enterHalls(self, entityCall):
			"""
			defined method.
			请求进入某个Room中 
			"""
			self.entities[entityCall.id] = entityCall
			entityCall.SendHallData(self.typeEntitiesNum)

如果我们没有在Halls.def中定义

<BaseMethods>
    <enterHalls>
      <Arg>		ENTITYCALL		</Arg>
    </enterHalls>
</BaseMethods>

那么这个函数会报错(当然你开一个base进程是不会的),我们只要记得KBEngine.globalData[“Halls”] 存在于唯一的base进程,其他进程的都是entityCall。所以其他的base进程也要调用,这种就需要你在BaseMethods里声明,相当于跨进程了。

那么我们继续思考下,我们上面的代码中有一行代码
entityCall.SendHallData(self.typeEntitiesNum)
这个假设是负责玩家登录后把大厅登录的总人数回传给Acount,那么这个SendHallData需不需要再def中定义?答案是肯定的,玩家的对象可能也是一个entityCall ,是他调用了SendHallData
所以我们需要在Account.def中定义

<SendHallData>
      <Arg>            ROOM_DATA_NUMBER            </Arg>
</SendHallData>

所以只要记住只要是entityCall调用就必须声明。
CellMethods和ClientMethods也是同理的。你如果有多个baseApp,那么你的Acount必然存在多个进程中,那么除了真实的Entity,其他也都是entityCall,所以如果把上面的人数要同步到玩家客户端,那么也需要在def中声明,只不过这个要放到ClientMethods里才行,为了和上面的SendHallData区分我加了一个Int32参数,看起来不混淆。

#进入大厅后刷新到客户端的
	def SendHallData(self, hallData):
		INFO_MSG("account[%i],大厅数据发给客户端!!![%i]. entityCall:%s" % (self.id,len(hallData), self.client))
		self.client.SendHallData(len(hallData), hallData)
  <ClientMethods>
    <SendHallData>
      <Arg>            INT32            </Arg>
      <Arg>            ROOM_DATA_NUMBER            </Arg>
    </SendHallData>
  </<ClientMethods>>

至于CellMethods当然是在CellApp进程上的,我们依此类推。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值