我正在尝试为一个班级项目编写一个流行的太空射击游戏,并且遇到了模块实例化的问题。我们目前有一个模块,可以对射弹的运动进行编码,并创建了一组要“激活”的射弹。
我们希望我们的飞船发射用户想要的尽可能多的射弹,而射弹将简单地从枪管中出现并向上移动到屏幕上。
这转化为每个射弹的简单内部状态机:
- 停:
- 如果用户想开枪,请激活此模块
- 在里面:
- 设置弹丸位置以匹配枪管。将弹丸运动设置为非零。
- 移动:
- 如果我们的碰撞检测单元发现碰撞(与敌人或墙壁),禁用模块并转到停止
- 否则只需将位置步进一些预定数量的像素
我已经对状态机进行了正确编程,但目前如果用户开枪,枪会一直持续到屏幕边缘,并且在存在时无法再开枪。
理想情况下,我会有某种字典,我可以查看并找到要激活的“可用”射弹模块,当该模块可以再次发射时状态机会更新该模块。
所以这个过程看起来像:
- 用户想要发射弹丸
- 某事...在我们的射弹阵列中找到一个未启用的元素并启用它
- 射击开始,并禁止该模块进行另一次射击,直到当前的射击被摧毁。
我能想到的一种方法是从射弹阵列中读取“启用”位,这将是当前正在发射的单热编码:
0110 0011 - Projectiles 1, 2, 6, and 7 are in use
然后我们取出这些位,对它们执行……某些操作,并得到数字 3,它对应于最小的可用射弹模块的索引。数字 3 是用户输入状态机的输出,用于索引到我们的射弹模块阵列,然后将发送“激活”信号。