如何在汇编x86语言中移动形状,例如square

时间:2016-05-16 13:53:52

标签: assembly tasm

根据标题,我知道如何在13h模式下绘制形状,但不知道如何在屏幕上移动它,接下来的事情就是强迫形状从屏幕边缘反弹,我想重新绘制循环中的形状...但不确定,因为我刚开始组装,我在Tasm工作。感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

根本与装配无关。如果您知道如何在13h模式下绘制形状,只需进行心理锻炼即可。想象一下当您在第一个位置绘制正方形时视频内存(a000:0000区域)内容的外观,然后在正方形位于第二个位置时想象vram的内容。

这两者之间的差异是实现形状运动效果的步骤之间所需的最小值。清除整个屏幕并重新绘制形状将实现这一点,但正如您所能想象的那样,对vram的写入次数要多于所需的最小值。

早期的许多游戏开发研究都花费在尽可能接近最小的变化上,以便在慢速CPU上进行大量的图形更改。在某些早期的计算机上,甚至可以像清除屏幕一样简单。可能比显示单帧花费的时间更长,即没有"撕裂"影响。在这种情况下,天真的方法清除屏幕+在新位置绘制形状会导致形状的大量闪烁(因为一些显示框架会显示清晰的屏幕而不是形状)。

后来通过双(三)屏幕缓冲避免了闪烁/撕裂 - 首先在屏幕外存储缓冲区中准备最终图像,在此期间保持旧图像可见,然后尽可能快地切换整个缓冲区(在某些情况下) gfx卡可以切换vram的地址,因此它设置gfx寄存器的便宜操作,在某些计算机上你必须逐字节地将缓冲区复制到目的地.VGA DOS 13h模式允许对于vram地址集IIRC,但是如果你可以进入另一个64k RAM区域,或者你被固定到a000段,那么就不能回想起来,因此无法加倍缓冲区。)

另一种常见方法是"脏矩形"更新技术,首先评估所有移动/更改图形元素的边界框,计算需要更新的vram区域,然后只完全重绘这些区域,保持vram的其余部分完整。

所有这些只是操纵视频ram中的值,你可以在程序集,C,pascal,等等中以相同的方式执行此操作(实际上javascript + canvas以相同的方式工作,因此所有原则都适用) 。现代gfx API通常提供很好的方法来轻松更新大面积的vram,比如填充形状,绘制精灵(将值从屏幕外的精灵缓冲区复制到vram中),混合(值不仅写入vram,而是与旧值混合)混合算法)等...

实际上有一系列技巧是不接触vram本身的值(这是CPU昂贵的操作),但是通过更改调色板值(每帧只有几个帐篷/数百个CPU指令)来创建一些移动错觉,请参阅例如:http://www.effectgames.com/effect/article.psp.html/joe/Old_School_Color_Cycling_with_HTML5

因此,如果您不得不提出这个问题,您可能需要更多地查看图像在显示时的创建方式,与视频内存内容的关​​系以及使用它可以做些什么。

对于另一个心理挑战,谷歌为Atari 2600规格,它根本没有任何视频ram,游戏必须通过逐行设置视频芯片寄存器来重新创建图像,同时计算其余的游戏逻辑介于两者之间。这可以让您更深入地了解计算机如何显示事物。