我小时候就用BASIC进行游戏,并且对1988年用C ++编写的Dangerous Dave版本中的图形处理方式感到好奇。特别是因为这些天他们没有任何有价值的图形包。还记得当戴夫到达屏幕边缘时,整个屏幕图形曾经以向后移动的方式向左移动吗?我记得读过罗梅罗(Romero)使用一种特殊的技术来做到这一点。我一直想创建像Dave这样的东西,并且想知道
- 他们为Dave使用了哪些图形包/方法?
- 以及如何使整个屏幕图形像他们一样移动?
我小时候就用BASIC进行游戏,并且对1988年用C ++编写的Dangerous Dave版本中的图形处理方式感到好奇。特别是因为这些天他们没有任何有价值的图形包。还记得当戴夫到达屏幕边缘时,整个屏幕图形曾经以向后移动的方式向左移动吗?我记得读过罗梅罗(Romero)使用一种特殊的技术来做到这一点。我一直想创建像Dave这样的东西,并且想知道
Answers:
我的1988年的Dangerous Dave版本是Apple II版本。滚动是通过将所有屏幕字节移过来,然后在屏幕边缘绘制一个新的图块来完成的-重复20次以进行全屏平移。Apple II版本全部以6502汇编语言编写。
在1990年版本的PC上,我当时以80x86汇编语言为所有视频模式(CGA,EGA和VGA)编写了图形代码。危险的戴夫PC是我所知道的唯一一款具有所有3种视频模式并且可以在任何时候(F2)切换的游戏,即使是在跳跃过程中也可以!
为了快速滚动屏幕,所有操作都使用汇编语言,并且我使用了与Apple II版本类似的技术-快速移动视频内存中的字节并在右侧绘制磁贴。在EGA中,这比较棘手,因为要在EGA模式下快速执行任何操作都需要使用锁存模式来进行内存移动。我记得曾教过Todd Replogle如何做到这一点,所以《 Nukem Duke 1》将是一个有趣的游戏(缓慢的Duke Nukem不会很酷)。
Dangerous Dave PC的游戏代码是用Borland C 3.0 IDE中的C编写的。大多数调试是在Turbo Debugger中通过插入Hercules卡的12英寸琥珀色显示器进行的。
啊,我记得DOS时代的这些技术。在移动视频RAM的同时执行滚动操作将导致滚动滚动。EGA引入了垂直和水平像素平移寄存器,该寄存器可用于设置屏幕原点(视频卡在视频存储器中的位置开始显示数据)。因为没有进行内存复制,所以这几乎是即时的,如果可以直接访问硬件寄存器,则可以在EGA和VGA上实现非常平滑和快速的逐像素滚动。DOS中的大多数滚动器都将使用此功能,而这部分代码可能是用汇编语言编写的,可以直接访问硬件寄存器。这些方法实际上不再有效。为了达到类似的效果,我认为,在现代图形硬件上,您只需每帧重新绘制整个屏幕就可以足够快地完成操作。我能想到的另一种方法是使用OpenGL或DirectX,然后将纹理渲染为屏幕宽度的四分之一,然后将其移动。某种程度上,它似乎不如操纵硬件寄存器那么有趣:)
编辑:这是Dobbs博士的文章的链接,该文章讨论了横向滚动。这可能是用于此效果的方法。
http://www.drdobbs.com/184408045
很难准确地判断这是怎么做到的,但是要考虑该游戏是针对非常特定的硬件规格编写的-带有EGA视频卡(640x480像素)的DOS。该代码可能正在对视频内存进行一些相当低级的操作,以使滚动顺利进行。
这是一个讨论DOS图形编程的网站,它可能会让您有所了解。
Metagun(由Markus aka Notch aka MineCraft家伙开发的游戏)具有与您想要的相同的滚动感。
游戏是开源的,用Java编写。
希望您能从看代码中学到东西。
我可以想到两种方法:
我可能会选择1),因为图形化处理不多,可能会有一些自生成的代码在边缘边缘剪切和剪切图像。当时我的一个同事正在研究的一种可能的技术是自写精灵,即精灵数据不是数据,而是代码。这意味着没有透明性检查,并且读取blit的数据实际上是免费的(这是在386上,其中读取了每条指令,然后将其解码,因此,代替读取代码->读取数据->写入数据,它只是读取代码- >写入数据)。它的效果非常好-我们在多个视差图层上以25fps +的速度运行了许多巨大的精灵。
但是我们在这里谈论的是罗梅罗,关于这些技术可能有些夸张。