首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在基于字符的图形系统中保留适当的背景?

如何在基于字符的图形系统中保留适当的背景?
EN

Stack Overflow用户
提问于 2020-01-02 00:29:13
回答 3查看 76关注 0票数 2

我有感觉复古,并决定写我最喜欢的8位电脑游戏(威廉姆斯的后卫)在我的第一台电脑(准将PET 4032)。所有的代码都是用6502汇编语言编写的。对于那些不熟悉PET的人,所有的图形都是基于字符的,为了构建游戏,您可以在40列x25行屏幕上移动不同的字符。这是非常古老的技术-没有精灵,没有图形层,没有能力和在屏幕水平,等等,我们会习惯今天。

我希望游戏有多个“激光束”同时发射,而这些激光束可能在屏幕上相互覆盖。现在,当光束沿着屏幕移动时,它们会将它们存储在记忆中,然后在它们移动时替换它们下面的东西,以恢复背景的原始状态。问题出现在第一台激光器上的第二台激光器上。第一个移动,取代原来的背景,而不是留下第二个激光器在顶部,然后第二个激光移动,并留下第一个文物后。

是否有一个经典的“轻”算法或规则集,允许多个对象在彼此之间移动,从而保留原来的适当东西?我尝试过不同的方法(在事情发生时交换背景,等等),但似乎没有什么能给出我想要的正确结果。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-02 03:46:55

可以肯定的是,让每个精灵保留一份它覆盖的东西的副本,让它们按照与你画的顺序相反的顺序擦除。这不会失败,但它假设您有时间进行完整的精灵绘制和删除每一帧。

您还可以使用屏幕大小的缓冲区'is后台‘和'is sprite’标志。每次绘制精灵时,将其字符位置标记为“is”。若要擦除所有精灵,请在屏幕大小的缓冲区中迭代,在未标记为“是背景”的任何地方重新绘制背景。如果迭代整个2000潜在时隙的成本太高,则可以保持更新位置的上、下界。

您还可以比较两个这样的缓冲区之间的差异,以减少闪烁实质上假设您只有一个视频缓冲区:首先绘制新的精灵,无论他们应该去哪里,并注意到他们在新的缓冲区。一旦所有精灵都被绘制出来,在新缓冲区没有标记为“isn”的任何地方填入背景,但填上旧的是。

票数 2
EN

Stack Overflow用户

发布于 2020-01-05 17:01:55

我建议:

  • 维护游戏状态的模型,允许您随时重新绘制整个屏幕。这将包括在更新框架之间的游戏状态时,所有可移动元素的位置和其他状态,积累需要重新绘制的所有单元格的掩码,因为它们中的某些元素发生了更改或移动。
  • 从上到下按深度顺序遍历游戏元素,重新绘制更改后的单元格掩码中的每个元素的部分,
  • 移除从更改的单元格掩码中提取的任何单元格,这样就不会被更深的元素重写。
  • 的背景将是最后一个,并将重新绘制所有剩余的单元格。留给您一个空的掩码为下一个帧做好准备。

此过程避免因在单个框架中绘制任何绘图而引起的任何闪烁。

可以将各种索引结构添加到更改的单元掩码中,以避免不必要的绘图工作。在这里,什么样的优化是合适的取决于您的游戏。例如,如果背景基本上是静态的,那么在更新期间将每个更改的单元格的坐标添加到列表中是有用的,然后在背景重绘期间只检查这些单元格。或者你可以根据所有可移动元素的位置来做这件事。上两个你。

如果大多数场景在每帧中都有变化,那么您可以跳过掩码积累,只需从一个全屏幕掩码开始.虽然我认为PET可能不够快,这样的游戏。

票数 2
EN

Stack Overflow用户

发布于 2020-01-18 04:31:13

没有为宠物编程,我不能提供任何具体的建议,你可能会尝试,但我可以建议保留当前屏幕背景的副本在大约1k的RAM。这样,您可以在删除写入该瓷砖的最后一个"sprite“时使用该数据恢复背景。不幸的是,这也要求您将代码和对象数据组合在31k以下,除非您将其作为一个墨盒进行编程。只是一些想法,不管它们值多少钱。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59557212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档