2017-04-19 31 views
2

我想创建一个像装配吉他英雄(TASM)的游戏,我想我需要使用页面滚动屏幕。如何在上面的页面上打印矩形并向上滚动页面?如何在装配中使用页面(TASM)?

+0

this http://www.ctyme.com/intr/rb-0091.htm可能对您有所帮助 – Tommylee2k

+1

我不认为分页是这样的方式查看相关[移动对象的最佳方式是什么该屏幕?](http://stackoverflow.com/a/29579522/2521214)我分享那里我的古代2D asm游戏源与地图滚动,菜单,3人(分屏),拍摄等...'rep movsd '是你的朋友 – Spektre

回答

2

确实,不同的视频模式有不同数量的可用“页面”,具体取决于视频硬件有多少内存可用。你可以看到一个大体完整的列表here。不过,并非所有的视频模式都支持多页。例如,mode 13h,VGA上的常见图形模式(因为它允许直接操纵视频内存的简化方式,因此使编程更容易)而仅支持一页,这意味着以普通方式翻页是不可能的。 *您需要选择一种支持多页的模式。我自己并不是一个图形模式的人,我不知道哪些人很受欢迎,哪一个人推荐。也许0Dh,一个320 × 200分辨率,16色和8页?

翻页之间的标准方式是使用BIOS服务10h(视频功能),功能05h。这将选择活动的显示页面。正如你可以在在线文档here中所看到的,你AH寄存器设置为功能标识符(05h),AL你要选择的显示页面,然后调用中断10H:

mov al, 01h ; select display page 1 
mov ah, 05h ; function 05h: select active display page 
int 10h 

或者,最好性能,真正的汇编程序员都同时设置了AX寄存器的这些半了,就象这样:

mov ax, 0501h ; AL == display page, AH == function 05h 
int 10h 

如果请求的页面不存在,那么中断通话将没有任何效果。您可以通过事后检查当前显示的页码,使用function 0Fh,返回活动显示页面中BH寄存器验证这一点:

mov ax, 0F00h ; AH == function 0Fh 
int 10h 

所以这就是你如何使用网页,但真的没有任何关系,带滚动。您一次无法在屏幕上显示多个页面。为了滚动目的,您实际需要的是function 06h—scroll window up。 DX寄存器包含要滚动的矩形左上角的坐标(DL ==列,DH ==行),CX寄存器包含右下角的坐标(CL == column,CH ==行)。 AL寄存器包含要滚动的行数,BH寄存器包含要在新清空区域中使用的screen attributes(颜色)。

例如,如果你想滚动由10行(0,0)×(80,20)向上限定的屏幕的矩形区域,可以执行以下操作:

xor dx, dx  ; DL == 0, DH == 0 
mov cx, 1450h ; CL == 80, CH == 20 
mov ax, 060Ah ; AL == 10, AH == 06h 
mov bh, 0Eh ; yellow foreground, black background 
int 10h 

甲该功能非常常见的用途是清除整个屏幕。正如你可能想象的那样,这是通过设置DX和CX来定义整个屏幕的坐标,然后将AL设置为0来填充整个矩形来完成的。屏幕将被清除并填充BH中指定的颜色属性。请记住屏幕的原点(左上角)在(0,0)。程度(右下角)取决于您所在的模式。

有互补功能,07h,即滚动窗口,而不是向上。否则它的功能与06h功能完全一样。

请注意,就像我之前说过的那样,正如链接文档中所述,这些滚动屏幕功能仅适用于当前活动的显示页面。所以一旦你滚动了屏幕 - 不管是向上还是向下 - 近乎曝光的区域都会被你指定的颜色/视频属性所填充,然后你需要将新的图形绘制到其中。

这里唯一的缺点是,当您将新内容拖到屏幕上时,您可能会遇到一些闪烁现象。页面翻转会有助于防止这种情况发生,但实施起来需要更多的工作。你不会通过自动滚动屏幕的一部分来帮助你。你必须保持两页 - 一页包含当前正在屏幕上显示的内容,另一页已经被绘制,就好像它已经被滚动一样。然后您将直接从当前页面翻到新页面。

*实际上,你可以模拟翻页在13h模式,但是,通过使用多个细分,以迅速写的优势,显存该模式允许。基本上,你有一个段寄存器,它的地址是实际的视频内存,然后你有一个或多个额外的段寄存器来处理你视为存储器的“划痕”存储区。然后,当您想要翻页时,只需将您的某个临时区域的所有数据移到实际的视频内存中即可。如果您熟悉现代图形编程技术,这只是双缓冲 - 您将绘制到屏幕外缓冲区中,然后当您准备好时,将数据从此屏幕外缓冲区复制到屏幕上。一切又旧又新。

+0

那么这款游戏最合适的选择是什么? – Emil

+0

请验证您正在使用的文档。它是包含要滚动矩形左上角坐标的CX寄存器和包含右下角坐标的DX寄存器。你已经在文本和代码片段中相反地写了它。我总是通过** D ** X与** D ** OWN记住这一点 –