我想创建一个像装配吉他英雄(TASM)的游戏,我想我需要使用页面滚动屏幕。如何在上面的页面上打印矩形并向上滚动页面?如何在装配中使用页面(TASM)?
回答
确实,不同的视频模式有不同数量的可用“页面”,具体取决于视频硬件有多少内存可用。你可以看到一个大体完整的列表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模式,但是,通过使用多个细分,以迅速写的优势,显存该模式允许。基本上,你有一个段寄存器,它的地址是实际的视频内存,然后你有一个或多个额外的段寄存器来处理你视为存储器的“划痕”存储区。然后,当您想要翻页时,只需将您的某个临时区域的所有数据移到实际的视频内存中即可。如果您熟悉现代图形编程技术,这只是双缓冲 - 您将绘制到屏幕外缓冲区中,然后当您准备好时,将数据从此屏幕外缓冲区复制到屏幕上。一切又旧又新。
那么这款游戏最合适的选择是什么? – Emil
请验证您正在使用的文档。它是包含要滚动矩形左上角坐标的CX寄存器和包含右下角坐标的DX寄存器。你已经在文本和代码片段中相反地写了它。我总是通过** D ** X与** D ** OWN记住这一点 –
- 1. 反转装配中的字符串(TASM)
- 2. 如何在装配中使用ADC?
- 3. 在TASM中使用两个数据段
- 4. 如何在JSP页面中使用Iterables?
- 5. 如何在jsf中使用AngularJS页面
- 6. 如何在jsp页面中使用servlet?
- 7. 如何在aspx页面中使用Request.QueryString?
- 8. 如何在Joomla中使用php页面?
- 9. 如何在WordPress中使用页面?
- 10. 如何在asp.net中使用asp页面
- 11. 颜色变化在组装tasm
- 12. Drupal如何组装页面
- 13. 如何在windows phone7中使用页面标签创建页面?
- 14. 如何在安装项目中使用安装配置变量?
- 15. 需要装配编程帮助(TASM) - 布斯算法
- 16. 8086装配(TASM):将ASCII字符值显示为HEX
- 17. 如何扩展TASM宏
- 18. 如何在缩放时使页面停留在页面中?
- 19. 如何使用JavaScript在bootstrap分页中隐藏中间页面?
- 20. 在TASM中显示负数
- 21. 如何使用PnP配置引擎配置SharePoint Online中的发布页面?
- 22. 如何在视图页面使用viewbag
- 23. 如何在登录页面使用dropdownbox更改页面文化?
- 24. 如何在Javascript中使页面减速
- 25. 使用CreateFileMapping在页面文件中分配页面的目的是什么?
- 26. 如何在网页网站中不使用_Layout页面
- 27. 如何使用Ajax在.aspx.cs页面中的.asp页面中获取变量值
- 28. 如何使用jQuery将页面的中心放在页面的中心?
- 29. 如何自动在用户页面上安装应用程序?
- 30. 如何使div数据不包装在ASP.NET View页面上?
this http://www.ctyme.com/intr/rb-0091.htm可能对您有所帮助 – Tommylee2k
我不认为分页是这样的方式查看相关[移动对象的最佳方式是什么该屏幕?](http://stackoverflow.com/a/29579522/2521214)我分享那里我的古代2D asm游戏源与地图滚动,菜单,3人(分屏),拍摄等...'rep movsd '是你的朋友 – Spektre