GameWorld

class kivent_core.gameworld.GameWorld

 游戏世界是您游戏中所有实体和游戏系统的管理者。它将负责初始化和删除实体,以及管理添加、删除和暂停哪些游戏系统。

Attributes属性:

  • state(StringProperty) :一个字符串属性,对应于应用程序在states 字典dict 中的当前状态。它将控制游戏gamescreenmanager 的当前screen,以及当前从画布中添加或删除哪些系统或暂停哪些系统。
  • number_entities(NumericProperty) :这是系统中当前实体的数量。不要直接修改,用于生成entity_id。
  • gamescreenmanager(ObjectProperty) :对GameScreenManager的引用
  • entities(list) :是所有实体对象的列表,entity_id对应于此列表中的位置。
  • states(dict) :是一个包含system_ids的字典。keys是‘systems_added’,’systems_removed’, ‘systems_paused’, ‘systems_unpaused’
  • entites_to_remove(list) :将在下一个update tick中清除的entity_ids列表
  • system_manager(SystemManager):注册所有添加到游戏世界的游戏系统GameSystem,并包含分配和使用这些GameSystem的信息。
  • master_buffer(object):一个缓冲区,所有其他静态分配内存的来源
  • system_count (NumericProperty):在实体Enityes数组中已经分配内存的system数量
  • update_time(NumericProperty):更新间隔
  • size_of_entity_block (NumericProperty):Entity的内存块大小,单位是千字节KB
  • size_of_gameworld(NumericProperty):整个GameWorld 静态分配内存大小,单位是千字节KB
  • zones(DictProperty): 字典类型,区域名-Entity数量。字典元素是: Zones[zone_name] = entity_count(int)
  • model_manager(ModelManager) : 处理VertexModels的加载。您应该只使用这个模型管理器加载模型数据,不要自己去实例化
  • managers(dict):GameWorld中已经注册的GameManagers。默认情况下将包含“纹理管理器”、“模型管理器”、“声音管理器”和“系统管理器”(‘texture_manager’, ‘model_manager’, ‘sound_manager’, and ‘system_manager’ )。其他GameSystem可以使用register_manager注册Managers,或者使用unregister_manager注销Managers

函数

  • add_state(self, state_name, screenmanager_screen=None, systems_added=None, systems_removed=None, systems_paused=None, systems_unpaused=None, on_change_callback=None)
    • Args:
      state_name(str) : state的名字,应该是独一无二的。
    • Kwargs:
      • screenmanager_screen(str):当这个state被过渡进入时,GameScreenManager设置当前screen的名字,默认为None。
      • systems_added(list):system_id的列表。当这个state被过渡进入时,这个列表中的system_ids应该被添加到GameWorld 的canvas中,默认是为None
      • systems_removed(list):system_id的列表。当这个state被过渡进入时,这个列表中的system_ids应该从GameWorld 的canvas中删除,默认是为None
      • systems_paused(list):system_id的列表。当这个state被过渡进入时,这个列表中的system_ids应该被暂停,默认是为None
      • systems_unpaused(list):system_id的列表。当这个state被过渡进入时,这个列表中的system_ids应该恢复运行,默认是为None
      • on_change_callback (object):回调函数将接受state_name,previous_state_name作为参数。回调函数在state 改变之后触发调用。默认是None

这个函数为你的GameWorld增加了一个新的state,这样有助于组织在Canvas中哪些GameSystem会激活,停止或者恢复运行。并帮助将其链接到GameScreenManager的Screen,以便可以同步用户界面和游戏逻辑。

  • add_system(self, widget)
    • Args:
      widget(GameSystem):要添加到GameWorld中system_manager中的GameSystem。
  • add_widget(self, widget, index=0, canvas=None)
    • Args:
      widget(Widget or CWidget):要添加到的Widget
    • Kwargs:
      index(int):要在子列表中指定该Widget的索引。
      canvas(str):取值None,‘before’或者‘after’。指定哪一个canvas添加该widget。默认值是None,意味着base canvas

重载实现了Kivy中默认的add_widget,这样可以确保能够处理GameSystem中相关的逻辑,以及可以接受Widget和CWidget基类作为参数。如果一个GameSystem被添加,gamesystem就会被作为widget参数调用add_system

  • allocate(self)

通常作为init_gameworld的一部分进行内部调用,此函数为gameworld分配主_缓冲区master_buffer,注册zones,分配EntityManager,并在所有GameSystem上调用allocate(do_allocation==true)

  • clear_entities(self, zones=[])

清除GameWorld中每一个Enity

  • delete_system(self, system_id)
    • Args:
      system_id(str):需要被删除的GameSystem 的ID
      从GameWorld中删除GameSystem
  • ensure_startup(self, list_of_systems)
    • Args:
      list_of_systems(list):systems_ids列表,期待初始化的内容
    • Rreturn:
      bool:如果所有的system都已经添加了,那么返回True,否则返回False

init_gameworld期间运行,以确定开始分配是否安全。在这种情况下,意味着所有列在系统列表list_of_systems中的系统ID都已添加到GameWorld中。

  • get_entity(self, str zone)

如果在deactivated_entities中没有实体当前可用,内部会用于创建新实体,不要直接调用该函数。

  • init_entity(self, dict components_to_use, list component_order, zone='general')
    • Args:
      components_to_use (dict):字典类型参数。key是system_id,value是用于创建Component的参数
      component_order (list):列表类型参数。应该包含components_to_use 里面所有的system_id参数,定义了component初始化顺序
      该函数用于创建一个新的实体Entity。它会返回创建Entity的entiy_id。
      这是用于创建新实体的函数。它返回所创建实体的实体ID值entity_id。components_to_use是system_id的dict,用于generate_component函数参数。component_order 是初始化组件的顺序。
      如果用components_to_use dict提供一个现有Entity,而不是创建一个新的。需要注意的是必须先移除父实体Entity。这个操作需要自己处理。如果是这种情况的话,你需要自己跟踪多个实体之间关系。
  • init_gameworld(self, list_of_systems, callback=None)
    • Args:
      list_of_system(list):列表类型,包含了我们想要检查和添加的GameSystems
    • Kwargs:
      callback(object):如果不是为None的话,它将会在内存分配和计划更新以后调用。默认是None

该函数应该在你的应用程序中初始化阶段只调用一次。它将在KV语言中确保所有的GameSystem得到添加,接着进行内存分配操作。一旦内存分配操作已经完成,GameWorld的update操作会随着Clock.schedule_interval而进行,函数是update_time。如果kwarg 中的回调函数并不是None的话,这时候回调函数也会被调用(没有额外的参数)

  • on_state(self, instance, value)
    • Args:
      instance(object):应该指向self
      value(string):新state的名字
      如果state不存在的话,state就会重置为初始的那一个

State切换在这里进行处理。GameSystem在列出顺序中会被添加和删除。这样可以允许控制渲染层的排列,以至于顺序靠后System可以在更前面的System中渲染。

  • register_manager(self, instance, value)
    • Args:
      manager_name(str): 注册manager的名字
      manager_object(GameManager):GameManger注册对象
      注册一个新的GameManager。如果manager_name已经被注册了,那么异常GameManagerAlreadyRegistered 将会被抛出
  • remove_entities(self)

在 update tick中会内部处理实体Entity的移除

  • remove_entity(self, unsigned int entity_id)
    • Args :
      entity_id(int):想要从GameWorld移除的Entity的ID

函数会立即处理entity的移除,同时Component会以加载的逆序进行移除

  • remove_widget(self, widget)
    • Args :
      widget (Widget or CWidget):想要被移除的子对象
      和Widget.remove_widget一样,如果被删除的Widget是一个GameSystem的话,GameSystem对应的on_remove_system 会被进行调用
  • timed_remove_entity(self, unsigned int entity_id, dt)
    • Args :
      entity_id (unsigned int):想要被移除Entity的ID
      dt (float): Kivy’s Clock.schedule.通过传递的时间参数
      此功能可用于使用Kivy的Clock.schedule_once为将来的某个时间安排实体Entity的销毁。
      例如:
Clock.schedule_once(partial(gameworld.timed_remove_entity, entity_id))
  • unregister_manager(self, str manager_name)
    • Args:
      manager_name(str):已经注册GameManager的名字
      注销以前注册的GameManager。如果没有使用此名称注册管理器,将引发GameManagerNotRegistered 异常
  • update(self, dt)
    • Args:
      dt(float):自动通过Kivy的Clock传递
      调用更新函数以推进游戏中的时间。任何可更新且未暂停的GameSystem都将被更新。通常,您将使用clock.schedule_once或clock.schedule_interval调用此函数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容