【发布时间】:2017-07-21 17:39:19
【问题描述】:
在太空侵略者中,当外星人的子弹击中你的防御基地时,它们会慢慢退化。谁能解释一下游戏是如何做到的?
我猜他们没有使用图像作为基础,也没有边界矩形碰撞检测?
【问题讨论】:
标签: collision-detection 2d-games
在太空侵略者中,当外星人的子弹击中你的防御基地时,它们会慢慢退化。谁能解释一下游戏是如何做到的?
我猜他们没有使用图像作为基础,也没有边界矩形碰撞检测?
【问题讨论】:
标签: collision-detection 2d-games
拨入回程机。最初的太空入侵者使用一个简单的位掩码来增加对基地的破坏。这些图像只是基本的 1 位图像,来自内存 1 字节宽和 8 字节向下(8 x 8 像素)
为了应用损坏,有一个掩码 [0b11111001,0b11110000] 左移(进位放在最低位),然后用基本字节掩码。 pixelByte &= maskByte。然后剪掉损坏的图案。如果有任何像素残留在炸弹的路径上,炸弹将继续击中基地。
为了检测碱基命中,还使用了掩码。 bombMask = 0b00000011 向左移动(或可能已被查找)以匹配 x pos。要查看是否有命中,您只需将掩码与基位 pixelByte & bombMask 相加,如果结果不为零,则基数已命中。
它都是用汇编编写的,在当时是编程杰作。我仍然记得当时在想,“他们怎么能这么快地移动这么多像素。”
今天你可以使用同样的方法,但你很少看到像这样在细节上付出那么多努力。我发现现代游戏倾向于走捷径,只有一组图像来显示伤害。
因此,只需根据命中框或圆圈计算伤害计数,显示图像以说明伤害状态、健康、轻微伤害、重大伤害和被摧毁。易于实施!对游戏有好处吗?好吧,那完全是另一回事了。
【讨论】:
我不完全确定它最初是如何完成的,但让它发挥作用的一种方法是让每个屏障由许多单独的块组成,每个块都有自己的健康值。如果一个方块获得了足够多的命中,则将其移除。
这应该允许障碍逐渐恶化。
编辑:澄清一下,你会让每个屏障由许多单独的图像组成(我相信它们只是原始图像中的一种平面颜色),并且每个图像都有一个矩形,弹丸可能会与之碰撞,从而损坏该部分的障碍。
【讨论】:
在最初的太空入侵者中,任何时候屏幕上的入侵者炸弹都不超过3个,所以简单的矩形碰撞就可以了。
我这样做的方法是从具有 id 的单个块/像素创建基础。当炸弹击中基地时,我会通过在该点中断的反向循环获得第一个像素命中的 id。
从那个像素开始,我大致计算了爆炸形状的上、下、左、右的像素数量,并移除了那些基本像素,在底部留下了一个很好的凹痕。
激光炮在基地发射时使用相同的方法。
很遗憾,我无法发布游戏代码,因为它超过了最大字符发布限制。我在 Codepen 上有游戏,但我不允许发布没有如上所述太大代码的链接!
但是,如果你去 Codepen 搜索太空侵略者,它会在第一页显示为“Space Invaders Taito 1978”
【讨论】: