他们是如何使屏幕在危险戴夫中移动的?

当我还是个孩子的时候,我在BASIC上做过游戏,而且我很好奇graphics是如何在1988年的C ++版本的Dangerous Dave中完成的; 特别是因为那些日子他们没有任何有价值的graphics软件包。 还记得戴夫到达屏幕边缘的时候,整个屏幕的graphics是用来向左移动的吗? 我记得罗梅罗曾经使用过一种特殊的技术来做到这一点。 我一直想创造像戴夫这样的东西,并想知道

  1. 他们用于Dave的graphics包/方法是什么?
  2. 以及如何使整个屏幕图像像他们一样移动?

啊,我记得我DOS时代的这些技巧。 用blitting移动videoRAM来执行滚动会导致滚动。 EGA引入了可用于设置屏幕原点的垂直和水平像素扫平寄存器(video卡开始显示数据的video内存中的位置)。 由于没有进行内存复制,所以这几乎是即时的,并且如果您可以直接访问硬件寄存器,则可以在EGA和VGA上逐个像素地滚动,从而实现非常平滑和快速的扫描。 DOS中的大多数滚动器都会使用这个代码,这部分代码可能用汇编语言编写,直接访问硬件寄存器。 这些方法虽然不是真的有效。 为了达到类似的效果,我认为在现代的graphics硬件上,你可以做得足够快,每一帧重画整个屏幕。 我能想到的另一种方法是使用OpenGL或DirectX,并将纹理渲染到屏幕宽度的两倍,然后移动。 不知何故,它似​​乎不像操纵硬件寄存器虽然有趣:)

我的1988年危险戴夫版本是苹果II版本。 滚动是通过移动所有的屏幕字节,然后在屏幕边缘绘制一个新的瓷砖 – 重复20次全屏幕移动。 Apple II版本全部采用6502汇编语言编写。

在个人电脑上,1990年代,我用80×86汇编语言编写了当时所有video模式的graphics代码:CGA,EGA,VGA。 Dangerous Dave PC是我所知道的唯一一款拥有3种video模式的游戏,在任何时候都可以切换(F2),即使是在跳跃中!

要快速滚动屏幕,全部都是汇编语言,而且我使用了与Apple II版本类似的技术 – 快速在video内存中移动字节,并在右侧绘制一个图块。 在EGA中,这是棘手的,因为在EGA模式下快速执行任何操作都需要使用锁存模式进行内存移动。 我记得教Todd Replogle是如何做到的,所以“公爵1号”将是一个有趣的游戏(一个缓慢的杜克公爵会不会很酷)。

Dangerous Dave PC的游戏代码是用C编写的,在Borland C 3.0 IDE中。 大多数debugging都是在Turbo Debugger上的12英寸琥珀色显示器上插入Hercules卡。

编辑:这是一个链接到博士多布斯讨论横向滚动的文章。 这可能是用于这种效果的方法。

http://www.drdobbs.com/184408045


很难判断这是怎么完成的,但考虑到这个游戏是为了一个非常具体的硬件规格而写的 – 带有EGAvideo卡(640×480像素)的DOS。 该代码可能正在做一些相当低级别的video内存操作,使滚动顺利进行。

这里是一个网站,谈论编程的DOSgraphics,可能会给你一个什么样的感觉…

http://www.phatcode.net/res/224/files/html/index.html

Metagun (由Markus aka Notch又名MineCraft开发的游戏)具有相同的滚动感觉,你正在寻找。

游戏是开源的,用Java编写。

  • 游戏: http : //www.mojang.com/compo/metagun/
  • 资料来源: http : //www.mojang.com/compo/metagun/metagun-source.zip

希望你能从代码中学习。

我可以想到两种方法:

  1. 蛮力:只是画现场
  2. 模式-X和平移寄存器。 将要滚​​动的位绘制到视图中,并调整平移寄存器以滚动场景。 您需要重新绘制每个框架的顶部显示区域,但是比绘制主要区域要做的工作要less。 您不需要重绘底部区域,因为在硬件中有一个寄存器会导致videoDAC从给定扫描行的地址0读取(所以底部区域将位于videoRAM中的地址0处,顶部将在底部区域之后开始) *

我可能会去1),因为没有太多的graphics进行,可能有一些自我生成的代码来blit和剪切图像的边缘。 我的一个同事正在研究的一种可能的技术是自写精灵,那就是精灵数据不是数据,而是代码。 这意味着没有透明度检查,blit的数据读取是有效的(这是在386每个指令被读取,然后解码,而不是读取代码 – >读取数据 – >写入数据,它只是读取代码 – >写入数据)。 它工作得非常好 – 我们在25fps以上的多个视差层上获得了大量的精灵。

但是我们在这里正在谈论罗梅罗,可能有一些关于这些技术的事情正在发生。

  • 我在我的第一个主要DOS游戏中确实这样做了,并且在某些硬件中存在一个错误,即地址重置过早发生在扫描线上,所以您将在两个部分之间有一个半高像素。