如何解决DosBox中汇编太空侵略者游戏的屏幕闪烁问题?
汇编开发《太空侵略者》:解决屏幕闪烁问题
我是汇编语言新手,正在开发《太空侵略者》游戏,遇到了屏幕闪烁的问题。目前的做法是每次绘制主飞船和敌人前先清空整个屏幕,再在新位置重绘;为了控制游戏速度,还添加了延迟函数,但屏幕闪烁问题依然存在。听说可以用页面切换的方式解决,但对这个概念理解不深。
打印相关函数
imprimeEnemigo proc push cx mov al, 219 mov cx, 1 call imprime add dl, 1 mov al, 220 mov cx, 1 call imprime add dl, 1 mov al, 219 mov cx, 1 call imprime add dl, 1 mov al, 220 mov cx, 1 call imprime add dl, 1 mov al, 219 mov cx, 1 call imprime sub dh, 1 mov al, 220 mov cx, 1 call imprime sub dl, 1 mov al, 219 mov cx, 1 call imprime sub dl, 1 mov al, 220 mov cx, 1 call imprime sub dl, 1 mov al, 219 mov cx, 1 call imprime sub dl, 1 mov al, 220 mov cx, 1 call imprime add dh, 2 add dl, 1 mov al, 223 mov cx, 1 call imprime add dl, 2 mov al, 223 mov cx, 1 call imprime pop cx ret imprimeEnemigo endp ; 打印敌人的函数 imprime proc mov bh, 0 ; BH = 页码 mov ah, 02h ; 设置光标位置,参数为dh和dl int 10h mov ah, 09h ; 在光标位置写入字符和属性 int 10h ret imprime endp ; 主打印函数,包含光标定位和打印,也用于分数等其他内容
清屏代码
每次循环后执行的清屏逻辑:
mov ah, 0Fh int 10h mov ah, 0 int 10h
主角打印函数
imprime_Jugador proc mov al, 219 mov cx, 1 call imprime sub dl, 1 mov al, 220 mov cx, 1 call imprime add dl, 2 mov al, 220 mov cx, 1 call imprime ret imprime_Jugador endp
延迟函数
retardo proc push ax push bx xor ax, ax xor bx, bx mov ax, cx ; cx初始值为1300,是变量 ret2: dec ax jz finDec mov bx, cx ret1: dec bx jnz ret1 jmp ret2 finDec: pop bx pop ax ret retardo endp
游戏运行时屏幕存在明显闪烁,尝试过多种方法仅能减轻闪烁,无法彻底解决,希望实现画面的流畅移动。
内容的提问来源于stack exchange,提问作者Nicolás
相关产品推荐
相关产品推荐

