graphics - 如何在基于字符的图形系统上保留适当的背景?

标签 graphics 6502 commodore

我感到复古,并决定在我的第一台计算机 (Commodore PET 4032) 上编写我最喜欢的 8 位计算机游戏 (Williams' Defender)。所有代码都是用 6502 汇编语言完成的。对于那些不熟悉 PET 的人来说,所有图形都是基于角色的,要构建游戏,您需要在 40 列 x 25 行的屏幕上移动不同的角色。这是非常古老的技术 - 没有 Sprite ,没有图形层,没有屏幕级别的 AND 能力,等等​​,而我们今天已经习惯了。

我希望游戏能够同时发射多个“激光束”,并且这些激光束在穿过屏幕时可能会相互重叠。现在,当光束沿着屏幕移动时,它们会将其下方的内容存储在内存中,然后在移动时替换自身下方的内容,以将背景恢复到原始状态。当第二个激光位于第一个激光之上时,问题就出现了。第一个激光沿着移动并替换了原始背景,而不是将第二个激光留在顶部,然后第二个激光沿着移动并留下第一个激光的伪影。

是否存在一种经典的“轻”算法或规则集,允许多个对象相互移动,从而保留下面的原始正确内容?我尝试了不同的方法(在物体遍历时交换背景等),但似乎没有任何方法可以给我想要的正确结果。

最佳答案

可以选择让每个 Sprite 保留其覆盖的任何内容的副本,并让它们按照与绘制它们的顺序相反的顺序删除自己。这不会失败,但它假设您有时间绘制完整的 Sprite 并删除每一帧。

您还可以使用“是背景”和“是 Sprite ”标志的屏幕大小缓冲区。每次绘制 Sprite 时,将其角色位置标记为“is sprite”。要删除所有 Sprite ,请遍历屏幕大小的缓冲区,在未标记为“是背景”的任何位置重新绘制背景。如果迭代整个 2000 个潜在位置的成本太大,您可以保留更新位置的上限和下限。

假设您只有一个视频缓冲区,您还可以比较两个此类缓冲区之间的差异,以显着减少闪烁:首先绘制新的 Sprite ,无论它们应该去哪里,并在新缓冲区中标记它们。绘制完所有 Sprite 后,在新缓冲区未标记为“是 Sprite ”但旧缓冲区标记为“是 Sprite ”的任何位置填充背景。

关于graphics - 如何在基于字符的图形系统上保留适当的背景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59557212/

相关文章:

flash - 扭曲网格中的坐标

assembly - 使用 xa65 汇编程序创建 Commodore 64 .prg

c++ - glDrawElementBaseVertex() 与 glDrawElement()

silverlight - 在 Silverlight 3.0 中显示 360 度图像(不是全景)

r - 在 plot.xts 中设置颜色

assembly - NES(6502组装) Sprite 机芯

assembly - 6502 带标签的寻址方式

javascript - 6502 仿真增强型基本无限循环 $C000 至 $E0ED

assembly - CA65:来自 16 位计算地址的 'Range error'

basic - Vic-20 basic 中的变量替换比内联整数更快?