我在图形模式下工作(320X200)。
我写了一个代码,在点击鼠标crusor的地方打印线。
是否打印像素,但是当我移动鼠标时,某些像素会消失。
ParX equ [bp+8]
ParY equ [bp+6]
ParColor equ [bp+4]
proc PrintPixel
push bp
mov bp, sp
push ax
push bx
push cx
push dx
mov bh, 0
mov cx, ParX
mov dx, ParY
mov al, ParColor
mov ah, 0ch
int 10h
pop dx
pop cx
pop bx
pop ax
pop bp
ret 6
endp PrintPixel
;main
mov ax,0h
int 33h
mov ax,1h
int 33h
MouseLP:
mov ax,3h
int 33h
cmp bx, 01h ; check left mouse click
jne MouseLP
push cx
push dx
mov al, [color]
push ax
call CreateX
答案 0 :(得分:1)
我不认为它们会消失,像素在320x200模式下不会这样做。我很确定他们在那里。
你所谓的“消失”可能是你将它们设置为你不想要的值,比如零。
要擦除鼠标光标,您应该设置光标WAS的像素,其中像素值来自背景图像,该背景图像应该是“在光标下”。
你可以这样做(伪代码):
drawCursor: ; draw cursor at x, y
; there should be no cursor at screen before calling this
mov [oldMouseX],x
mov [oldMouseY],y
copy_memory(to backgroundBuffer, from vram at x,y, cursor size x/y)
blit_cursor(at x, y, cursor gfx)
ret
hideCursor: ; before drawing it at new position
blit_memory(at [oldMouseX], [oldMouseY], from backgroundBuffer, cursor size x/y)
ret
关于那些复制/ blit ...... 创建一些“精灵”操作例程是很常见的,例如:
blit_transparent_gfx:
; params x, y, gfx data ptr, gfx data sizex, gfx data sizey
; globals word [ScreenSizeX] = 320, byte [transparent color]
; calculate direct address into VRAM into es:di
push 0a000h
pop es ; es pointing to VRAM
mov ax,[ScreenSizeX] ; 320
mul word [param y]
add ax,[param x]
mov di,ax ; es:di = VRAM address to write pixels
; prepare registers for outside line loop
mov ah,[transparent color]
mov si,[param gfx data ptr]
mov dx,[param gfx data sizey]
blit_transparent_line:
; outer line loop
mov cx,[param gfx data sizex]
push di
; inner loop drawing pixels
blit_transparent_pixel:
mov al,[si]
cmp al,ah
jz blit_transparent_pixel_skip
mov [es:di],al
blit_transparent_pixel_skip:
inc si
inc di
dec cx
jnz blit_transparent_pixel
; move VRAM pointer one line down
pop di
add di,[ScreenSizeX]
dec dx
jnz blit_transparent_line
ret
存储/恢复背景图像的例程可以稍微简单一些,因为它们不必测试透明度,但原理是相同的(将内存从大小为[sizex,sizey]的VRAM复制到某些内部缓冲区) ,或来自gfx数据)。
请勿使用int 10h
进行像素绘制,直接绘制到A000:xxxx
VRAM在320x200模式下非常简单(您应该在ZX Spectrum上看到VRAM组织,或者更好的是在Atari 2600控制台上看到VRAM组织) (提示:它根本没有VRAM),现在这些并不是微不足道的,但是VGA上的13h模式是直接使用的纯粹乐趣。非常简单,而且速度要快得多,即使是这种天真的未经优化的“blit_transparent_gfx”(写得如此,它应该很容易理解它是如何工作的)与涉及int 10h
调用的任何东西相比都会非常快。
PS。我没有调试“blit_transparent_gfx”(显然你首先用真实的代码来修复那些伪[param ...]
行,只是为了编译它),所以也许我在那里做了一些bug,随时调试它(虽然我确定它应该按原样运行,但一旦你修复了语法)。