GameSystem

这些类中的大多数都有不能被sphinx读取的cdefed函数。如果您想了解更多关于使用它们的信息,请阅读源代码。

Python GameSystems

这是创建可从python使用的GameSystem的基础。它将组件Componnet存储在一个python列表中,并允许动态控制组件数据,因为它只是一个python对象。这些类型GameSystem并不像更优化的游戏系统那样连续地存储它们的内存,但是非常适合于原型制作或简单地不做那么多处理的游戏系统。

class kivent_core.systems.gamesystem.GameSystem(kwargs)

GameSystem是游戏的一部分,它保存着操作实体Entity 组件Conponent数据的逻辑。它还将管理组装、清理、存储和销毁保存系统数据的组件。基本的游戏GameSystem跟踪组件,这是一个常规的python对象,支持python的所有动态特性,但没有很多静态优化。基本的设置是,我们将创建一个组件对象,并在实体不再需要的时候释放它们以进行垃圾收集。我们将避免通过重用列表中的空间来调整组件列表的大小(删除组件后,组件将被清除为“无”,内部空闲列表将在增加列表之前提供这些空间)。

Attributes属性:

  • system_id (int) :正整数类型,此游戏系统的名称,用于命名实体组件属性,并引用GameSystem。
  • system_index(NumericProperty):SystemManager数组中GameSystem的整数索引。对应于实体Entity数组中可以找到该系统的Component组件索引的位置。
  • updateable (BooleanProperty):Boolean让GameWorld标记是否在这个游戏系统上运行更新。默认为假
  • paused (BooleanProperty): 布尔值,用于确定是否应在当前Tick上更新此GameSystem(前提是updateable为真)
  • gameworld (ObjectProperty): GameWorld对象引用 ,通过在KV文件中进行绑定
  • gameview (StringProperty): 该GameSystem将被渲染到的GameView名字. 如果设置为None,该GameSystem将被渲染到GameWorld的Canvas。默认是None
  • update_time (NumericProperty): GamSystem更新Tick刷新率。默认是 1 / 60或者60FPS 。
  • components(list):当前激活的component列表。如果列表包含 None,component已经被垃圾回收,内部会维护一个空闲列表,在处理的时候需要跳过这些处理。
  • frame_time (float): 上次更新的剩余时间,尚未消耗。
  • do_allocation (BooleanProperty):决定在GameWorld分配内存的时候,GameWorld是否运行分配GameSystem的工作
  • do_components(BooleanProperty):指示GameSystem是否实际具有组件,从而保留一个用于将组件存储在EntityManager数组中的插槽。
  • zones(ListProperty):确定GameSystem内存分配中存在哪些区域。在默认实现中未使用。

函数

  • allocate(self, Buffer master_buffer, dict reserve_spec)
    • Args:
      master_buffer(Buffer) : 系统将从中分配自身的缓冲区。
      reserve_spec(dict):key-value字典数据结构。代表:zone名字 - Entities 数量
      如果你的GameSystem想要对某些保持生命周期的数据做静态内存分配,那么需要重载该函数。
  • clear_component(self, component_index)

如果必须在销毁或重用组件之前以某种方式清理组件,那么需要重载该函数。

  • copy_component(self, unsigned int entity_id, unsigned int component_index)
  • create_component(self, unsigned int entity_id, str zone, args)
    • Args:
      entity_id (unsigned int) : 要将此组件分配给的Entity的标识ID。
      zone(str):不用于基本GameSystem,但用于使用indexedMemoryZone的其他系统。
      arg(dict):字典类型,component创建用于初始化参数
    • Return:
      component_index (unsigned int) : 新分配好的Component ID
  • get_component(self, zone)

    此函数在内部用于确定是将新点添加到列表中,还是使用现有的空闲槽。通常,除非您正在为组件设计自定义内存管理,否则不需要直接调用或使用它。

    • Return:
      component_id (unsigned int): 新生成组件的Component ID。
  • init_component(self, component_index, entity_id, zone, args)

重写此函数以提供用于设置组件的自定义逻辑,默认情况下,args字典参数每个key-value对将在组件上setattr。

  • on_add_system(self, component_index, entity_id, zone, args)

在GameWorld的state改变的期间,GameSystem被添加的时候,函数就会被调用

  • on_delete_system(self, component_index, entity_id, zone, args)

当GameWorld删除一个System的时候,函数就会调用

  • on_gameview(self, instance, value)

如果设置了gameview,则处理将此Widget添加到相应父级的事件。

  • on_remove_system(self, instance, value)

在GameWorld state更改期间移除GameSystem时调用的函数

  • remove_component(self, unsigned int component_index)

通常情况下,GameWorld会自动调用它。如果要在不销毁Entity的情况下删除组件,请直接调用此函数。如果要重写组件清理的行为,请重写clear_component。如果你直接处理系统组件的存储时才重写此功能。

  • Args:
    component_index(unsigned int):组件需要被删除的component_id

  • update(self, dt)
    • Args:
      dt(float):Clock传入的时间参数。应该等于update_time。

重写此函数以创建游戏系统更新逻辑,通常如下所示:

gameworld = self.gameworld
entities = gameworld.entities
for component in self.components:
    #make sure to skip released components.
    if component is not None:
        #If we need other components from the entity let us
        #retrieve it like this:
        entity_id = component.entity_id
        entity = entities[entity_id]
        #Do your system logic per entity here

class kivent_core.systems.gamesystem.GameSystem(kwargs)

组件将跟踪游戏系统逻辑的数据。它跟踪自己的ID(组件列表中的索引)和它自己Entity的ID。如果返回的实体_id为<unsigned int>-1,则组件当前未连接到实体。

Attributes属性:

_id(unsigned int):Component的id

Cython GameSystems

StaticMemGameSystemMemComponent 是所有内置游戏系统GameSystem的基础。它们是cythonic类,将数据存储在使用自定义内存管理分配的原始C数组中,这些自定义内存管理是为内存处理程序模块中的池和连续处理而设计的。

kivent_core.systems.staticmemgamesystem.StaticMemGameSystem

StaticMemGameSystem保留一个静态分配的C结构数组作为其组件。分配分为几个不同的Zone“区域”。这样做有助于确保对特定类型的所有实体Entity进行大致有序的处理。StaticMemGameSystem的组件也将进行"池"管理。所有组件都将创建一次,并尽可能频繁地重复使用。在区域中创建的组件不能超过Zone配置指定的数量。这个类不应该直接使用,而是从继承来创建自己的游戏系统,使用静态的内存池功能。在python中永远不应该继承这个类,因为您需要cython/c级别的访问权来访问各种属性和组件。

Attributes属性:

  • size_of_component_block (int):内存将在内部分解成块大小为 size_of_component_block大小的字节块。默认值为4。

  • type_size(int):类型大小,一般你会设置成sizeof(你的结构体)

  • component_type(MemComponent) :这个对象可以让你的C struct 组件的数据从python进行访问。应该从MemComponent继承

  • processor (BooleanProperty):如果设置为true,系统将分配一个助手对象ZonedAggregator,以便在更新函数中批处理系统的所有组件。默认为false。

  • system_names (ListProperty):要由ZonedAggregator绑定其他组件系统的名称,这应该是在更新函数期间需要组件数据的其他StaticMemGameSystem系统的列表。

  • do_allocation (BooleanProperty):对于StaticMemGameSystem,默认为true

  • components(IndexedMemoryZone):与简单的python列表不同,组件存储在更复杂的indexedmemoryzone中,后者既支持对底层结构数组的直接C访问,也支持对封装C数据的组件类型对象的python级别访问。

  • allocate(self, Buffer master_buffer, dict reserve_spec)

从提供的Buffer中,根据reserve_spec参数zone_name-count字典 分配indexedmemoryzone
indexedmemoryzone将存储在C扩展名imz_components属性的内部,可以通过components属性在python中访问。如果processor 为真,则还将分配ZonedAggregator。这将根据system_name 存储指向实体各个组件的空指针。这使得检索各种组件数据进行处理变得更容易。
- Args:
master_buffer(Buffer):此系统项将从中分配自身的缓冲区
reserve_spec (dict):字典类型key-value,代表区域名-entity数量

  • clear_component(self, unsigned int component_index)

没有为StaticMemGameSystem实现,在子类化时重载该函数。使用此功能设置清除组件的值以进行回收

  • get_component(self, str zone)

替代GameSystem的默认get_component,使用indexedMemoryZone代替处理组件数据。clear_component将在返回组件的新索引之前调用,以确保不存在垃圾数据。

  • 返回:
    unsigned int:新产生的组件Index

  • get_size_estimate(self, dict reserve_spec)

    返回在调用allocate之前可以安全调用的估计大小内存空间。GameWorld内部用来估计是否有足够的内存来支持GameSystem

    • 返回:
      int:系统分配的估计大小(字节)。
  • init_component(self, unsigned int component_index, unsigned int entity_id, args)

没有为StaticMemGameSystem实现,在子类化时重载实现。使用此函数设置组件值的初始化。

  • remove_component(self, unsigned int component_index)

覆盖GameSystem的默认行为,将数据处理职责传递给indexedMemoryZone。在调用memoryzone上的free_slot之前,将调用clear_component。

kivent_core.systems.staticmemgamesystem.MemComponent

Aggregators

待续。。。

Position Systems

待续。。。

Rotate Systems

待续。。。

Scale Systems

待续。。。

Color Systems

待续。。。

Rendering Systems

待续。。。

Controlling the Viewing Area

待续。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • class kivent_core.gameworld.GameWorld  游戏世界是您游戏中所有实体和游戏系统...
    大米zhu阅读 472评论 0 0
  • 概述 本文就数种重要的Gameplay框架及插件,简述它们的原理,介绍这些Gameplay框架的适用场合,并进行对...
    DonaldW阅读 11,153评论 7 58
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,448评论 0 13
  • 2009.2.4 天气:晴 妈妈今天买了本大大的本子给我,说是给我写日记的,张老师前几天才刚教我们怎么写日记呢,我...
    番茄炒蛋饭ww阅读 167评论 0 0
  • 新篇章开始以前,回顾一下,总结一波,写给现在和未来的自己: 1.把自己当作自己的领导,安排好生活,安放好情绪。 首...
    海锦阅读 216评论 0 0