太空侵略者基地恶化

问题描述 投票:0回答:4

在《太空入侵者》中,当外星子弹击中你的防御基地时,它们会慢慢恶化。谁能解释一下游戏是如何做到这一点的?

我猜他们没有使用图像作为底座,也没有边界矩形碰撞检测?

collision-detection 2d-games
4个回答
1
投票

拨入回程机。最初的太空入侵者使用简单的位掩码来增加对基地的伤害。这些图像只是基本的 1 位图像,来自内存 1 字节宽和 8 字节向下(8 x 8 像素)

为了施加损坏,有一个掩码 [0b11111001,0b11110000],该掩码左移(进位放置在最低位),然后用基字节掩码。

pixelByte &= maskByte
。然后剪掉损坏的图案。如果任何像素剩余并且位于炸弹的路径中,炸弹将继续击中基地。

为了检测基地击中,还使用了面具。炸弹掩码 = 0b00000011 左移(或者可以查找)以匹配 x 位置。要查看是否命中,只需将掩码与基数位相与

pixelByte & bombMask
如果结果不为零,则基数已被命中。

它全部是用汇编编写的,在当时是编程杰作。我仍然记得当时的想法:“他们怎么能这么快地移动这么多像素。”

今天你可以使用同样的方法,但你很少看到像这样在细节上投入如此多的努力。我发现现代游戏往往会走捷径,只用一组大量的图像来显示伤害。

因此,只需根据命中框或圆圈获取伤害计数,显示图像来说明伤害状态,健康,轻微伤害,严重伤害和损坏。易于实施!对游戏有好处吗?好吧,那完全是另一回事了。


1
投票

我不太确定它最初是如何完成的,但使其发挥作用的一种方法是让每个障碍由许多单独的块组成,每个块都有自己的健康值。如果某个方块受到了足够的点击,请将其移除。

这应该会让障碍逐渐恶化。

编辑:为了澄清,每个障碍物都由许多单独的图像组成(我相信它们只是原始图像中的平面颜色),并且每个图像都有一个矩形,射弹可能会与该矩形发生碰撞,从而损坏该部分障碍。


0
投票

在原版《太空侵略者》中,屏幕上同时出现的入侵者炸弹不超过 3 个,所以简单的矩形碰撞就可以了。

我的方法是从带有 id 的单个块/像素创建基础。当炸弹击中基地时,我通过反向循环获得命中的第一个像素的 ID,该循环在该点中断。

从该像素开始,我大致以爆炸的形状向上、下、左、右数了一些像素,并删除了这些基本像素,在底部留下了一个漂亮的凹痕。

基地发射的激光炮也采用同样的方法。

不幸的是,我无法发布游戏代码,因为它超出了最大字符发布限制。我在 Codepen 上有这个游戏,但我不允许在没有代码的情况下发布链接,如上所述,代码太大了!

但是,如果您前往 Codepen 并搜索 Space Invaders,第一页上会显示“Space Invaders Taito 1978”


0
投票

我不确定 og 太空入侵者们是如何做到的,但是,我根据我所拥有的 pygame 知识进行推断是,创建一个以 255 颜色值作为基础、以 0 为透明的 2d 数组,将其作为像素数组对象。

每当您想要 blit 该数组时,都可以使用 make_surface() 函数将其转换为表面。从此表面创建一个掩模,并使用重叠方法来检测发生碰撞的二维数组中的哪个索引,半径为 r ,使单元格位于以碰撞点为中心的圆内。现在,在下一次迭代中,使用这个修改后的二维数组来创建表面并对其进行 blit。

© www.soinside.com 2019 - 2024. All rights reserved.