家庭电脑派对 | 17. 对象池

  • 引入敌人飞船与对象池:示例项目能控制飞船后像游戏了,接下来引入敌人飞船,本章重点是对象池技术。对象池是固定内存块,用于存储游戏中特定类型实体的数据,如每个实体的绘制瓦片、坐标等信息,在非回合制游戏中最好存储在零页 RAM 中,NES 的零页空间有限,对象池能保证不超内存且方便规划使用。对象池从游戏性角度也有帮助,如限制玩家屏幕上的子弹数量等。
  • 设计对象池:对象池应足够灵活以适应多种实体类型,只要这些实体有共同角色,如将伤害玩家的实体放入一个池,将参与碰撞检测的和不参与的分开等,没有固定规则。确定哪些实体放入一个池后,要确定为每个实体存储哪些数据,如太空射击游戏的敌人池包含位置、速度、位标志等数据,玩家子弹池只需存储位置,即使添加更多属性,池仍很灵活。
  • 实现对象池:在现代编程语言中用对象数组等跟踪相似实体,在 NES 上更流行结构数组方法,步骤更简单且执行更快。为游戏创建对象池需在.segment "ZEROPAGE"中添加相关代码,如预留零页 RAM 存储非玩家对象状态,包括敌人和子弹的各种数据。
  • 将代码从 NMI 移到 main 循环:为充分利用 Vblank 时间,将 NMI 处理限制在每帧都发生的事情,如复制精灵数据到 OAM、背景更新、更新滚动寄存器、播放音乐和音效等,其他功能移到 main 循环,用一个字节的零页来跟踪是否发生 Vblank,通过INCLDA操作控制循环,主循环和 NMI 相互传递控制,提高效率。
  • 敌人相关例程:创建两种敌人图形瓦片,将其类型用于敌人池的“类型”字段,方便更新和绘制敌人。绘制子程序通过检查敌人是否活跃,找到 OAM 地址偏移,根据敌人类型获取瓦片编号和调色板等信息来绘制敌人,使用索引寄存器跟踪数组偏移和 OAM 写入位置。敌人行为子程序简单地增加敌人的 Y 位置,若超出屏幕底部则标记为不活跃。
  • 通过对象池生成敌人:简单地通过循环敌人列表,根据敌人槽的状态调用相应子程序来生成敌人,每个帧用 CPU 时间处理敌人,空闲时用定时器控制敌人生成间隔,不同敌人类型有不同的初始设置和移动速度。
  • 作业:可尝试改变池中的敌人数量、添加第三种敌人类型、给敌人添加 X 速度、根据玩家位置生成敌人、添加玩家射击子弹功能等,以改变游戏感受。

总结来说,本章详细介绍了在 NES 游戏开发中使用对象池技术来管理游戏实体,包括对象池的设计、实现、与 NMI 处理的分离以及相关的敌人例程和生成敌人的方法等,并提供了作业供玩家尝试不同的修改和扩展。

阅读 12
0 条评论