他们如何使屏幕在Dangerous Dave中移动?


14

我小时候就用BASIC进行游戏,并且对1988年用C ++编写的Dangerous Dave版本中的图形处理方式感到好奇。特别是因为这些天他们没有任何有价值的图形包。还记得当戴夫到达屏幕边缘时,整个屏幕图形曾经以向后移动的方式向左移动吗?我记得读过罗梅罗(Romero)使用一种特殊的技术来做到这一点。我一直想创建像Dave这样的东西,并且想知道

  1. 他们为Dave使用了哪些图形包/方法?
  2. 以及如何使整个屏幕图形像他们一样移动?

1
我回忆起自己的童年时光作为礼物的那场比赛
Vishnu 2010年

有关正在运行的该游戏的视频,以查看Nav在谈论的滚动效果,请参阅dosgamesarchive.com/download/dangerous-dave
Tim Holt 2010年

Answers:


18

我的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英寸琥珀色显示器进行的。


哇!从组装中实际使用过这些视频模式的人那里获取信息是一件好事!
2014年

@Nav ehm ...您实际上是在与Romero交谈:-)
Gianluca Ghettini

@GianlucaGhettini好吧,这是具有Romero照片的用户,该照片可以从Internet上获得。John Romero会创建一个帐户来回答一个问题吗?不能完全确定:-)但是,很奇怪,您在很长一段时间后我玩《 Dangerous Dave》的第二天就发表了评论。
2013年

@Nav根据他在这里的推文:twitter.com/romero/status/679769135681826817他实际上告诉Todd Replogle如何为Duken Nukem进行EGA平滑滚动,这正是他在此答案中所说的。我怀疑有人假装自己知道他.. :-)
Gianluca Ghettini


13

啊,我记得DOS时代的这些技术。在移动视频RAM的同时执行滚动操作将导致滚动滚动。EGA引入了垂直和水平像素平移寄存器,该寄存器可用于设置屏幕原点(视频卡在视频存储器中的位置开始显示数据)。因为没有进行内存复制,所以这几乎是即时的,如果可以直接访问硬件寄存器,则可以在EGA和VGA上实现非常平滑和快速的逐像素滚动。DOS中的大多数滚动器都将使用此功能,而这部分代码可能是用汇编语言编写的,可以直接访问硬件寄存器。这些方法实际上不再有效。为了达到类似的效果,我认为,在现代图形硬件上,您只需每帧重新绘制整个屏幕就可以足够快地完成操作。我能想到的另一种方法是使用OpenGL或DirectX,然后将纹理渲染为屏幕宽度的四分之一,然后将其移动。某种程度上,它似乎不如操纵硬件寄存器那么有趣:)


3
“不知怎的,它似乎并不为乐趣,操控硬件寄存器虽然:)” -真正的:)
导航

4

编辑:这是Dobbs博士的文章的链接,该文章讨论了横向滚动。这可能是用于此效果的方法。

http://www.drdobbs.com/184408045


很难准确地判断这是怎么做到的,但是要考虑该游戏是针对非常特定的硬件规格编写的-带有EGA视频卡(640x480像素)的DOS。该代码可能正在对视频内存进行一些相当低级的操作,以使滚动顺利进行。

这是一个讨论DOS图形编程的网站,它可能会让您有所了解。

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


该游戏将使用320x240视频模式。
Skizz 2010年

Skizz我也在想,但我发现了游戏的一些屏幕截图为640x400-EGA分辨率。游戏有不同的版本,我想早期的版本是320x200。
Tim Holt 2010年

4

Metagun(由Markus aka Notch aka MineCraft家伙开发的游戏)具有与您想要的相同的滚动感。

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

希望您能从看代码中学到东西。


1
如果您想看看他在制作游戏中的游戏时光倒流:youtube.com/watch?v=ZV
はると

1
-1,尽管看起来相同,但显然根本没有使用相同的方法。

2
我知道这不是John Romero在1988年使用的确切方法。但是,由于@Nav想要创建类似的东西,所以我只好让他使用Apple II计算机上的Applesoft BASIC对其进行编程。我链接到的代码显然可以完成您所指出的相同工作。
はると2010年

感谢Joe,但是Eibx也是对的,我也正在寻找其他方法。
导航

2

我可以想到两种方法:

  1. 蛮力:只画场景
  2. 模式X和平移寄存器。将要滚​​动的位绘制到视图中,并调整平移寄存器以滚动场景。您将需要每帧重新绘制顶部显示区域,但这比绘制主要播放区域要少。您无需重新绘制底部区域,因为硬件中存在一个寄存器,该寄存器将导致视频DAC从给定扫描线的地址0读取(因此底部区域将位于视频内存中的地址0,顶部将在底部区域之后开始*)

我可能会选择1),因为图形化处理不多,可能会有一些自生成的代码在边缘边缘剪切和剪切图像。当时我的一个同事正在研究的一种可能的技术是自写精灵,即精灵数据不是数据,而是代码。这意味着没有透明性检查,并且读取blit的数据实际上是免费的(这是在386上,其中读取了每条指令,然后将其解码,因此,代替读取代码->读取数据->写入数据,它只是读取代码- >写入数据)。它的效果非常好-我们在多个视差图层上以25fps +的速度运行了许多巨大的精灵。

但是我们在这里谈论的是罗梅罗,关于这些技术可能有些夸张。

  • 我实际上是在我的第一个主要的DOS游戏中这样做的,并且某些硬件中存在一个错误,即地址重置过早发生在扫描线中,因此在两个部分之间有一个半高像素。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.