如何使两个代码同时运行? (DOS程序集)

时间:2019-03-31 18:15:53

标签: assembly dos x86-16 tasm

我做了2个正方形(我正在使用DOS装配),我试图使一个正方形移动,而当用户按下SPACE时,另一个正方形会跳动。 问题是用户只能在另一个方块停止移动后按空格键。你能帮我吗?

代码:

IDEAL
MODEL small
STACK 100h
DATASEG

X dw ?
Y dw ?
SquareSize dw ?

PlayerSquareX dw 20
PlayerSquareY dw 193

BlockX dw 305
BlockY dw 193

color db 1  ; default color is blue

FloorY dw 194
FloorX dw 0




CODESEG



    proc HalfSecondDelay
    push cx ;Backup
    push dx
    push ax

    MOV CX, 1H
    MOV DX, 3H
    MOV AH, 86H
    INT 15H

    pop ax ;Backup
    pop dx
    pop cx
    ret
    endp HalfSecondDelay


    proc WaitForSpace
    EnterSpace:  ;Wait until user presses Space
    mov ah,0
    int 16h
    cmp al,32
    ;jne EnterSpace
    jne ReturnToMain
    call PlayerJump
    ReturnToMain:
    ret
    endp WaitForSpace

    proc ClearKeyboardBuffer
    push ax
    ClearKeyboardBuffer_loop:
    mov ah,01h
    int 16h                     ; is there a key pressed
    jz ClearKeyboardBuffer_ret  ; if not, return
    mov ah,00h
    int 16h                     ; "handle" the key
    jmp ClearKeyboardBuffer_loop

    ClearKeyboardBuffer_ret:
    pop ax
    ret
endp ClearKeyboardBuffer


    proc PlayerJump ;Makes The Square Jump
    push cx


    mov cx, 10
    MoveUp:
    Call HalfSecondDelay

    call RemovePlayerSquare
    sub [PlayerSquareY],4 ; Move Up
    call PaintPlayerSquare
    loop MoveUp

    mov cx, 10
    MoveDown:
    Call HalfSecondDelay
    call RemovePlayerSquare
    add [PlayerSquareY], 4 ; Move Down
    Call PaintPlayerSquare
    loop MoveDown

    pop cx
    ret
    endp PlayerJump


proc PaintFloorLine
    push bp
    mov bp,sp
    push cx



    mov cx, 320
LoopPaintFloorLine:
    call PaintPixel

    inc [X]
    loop loopPaintFloorLine


    pop cx
    pop bp
    ret
endp PaintFloorLine

proc PaintFloor ;Paints The Floor
    push bp
    mov bp,sp
    push cx

    mov [x], 0
    mov [y], 194
    mov [color], 0Ah

    mov cx, 7

loopPaintFloor:     
    call PaintFloorLine
    inc [Y]
    mov [x], 0
    loop loopPaintFloor


    pop cx
    pop bp
    ret
endp PaintFloor


proc PaintPixel
    push bp
    mov bp,sp

    push ax
    push bx
    push cx
    push dx 


    mov cx,[X]
    mov dx,[Y]
    mov al,[color]
    mov ah,0ch
    int 10h

    pop dx
    pop cx
    pop bx
    pop ax
    pop bp
    ret
endp PaintPixel

proc PaintLine
    push bp
    mov bp,sp
    push cx

    mov cx, [SquareSize]

loopPaintLine:  
    call PaintPixel
    inc [X]
    loop loopPaintLine

    mov cx, [SquareSize] ; Return The X
    sub [X], cx

    pop cx
    pop bp
    ret
endp PaintLine


proc PaintSquare ;Paints A Sqaure
    push bp
    mov bp,sp
    push cx

    mov cx, [SquareSize]

loopPrinSquare:     
    call PaintLine
    dec [Y]
    loop loopPrinSquare

    mov cx, [SquareSize] ; Return The Y
    add [Y], cx

    pop cx
    pop bp
    ret
endp PaintSquare

proc PaintPlayerSquare ; Paints The Player Square
    push bp
    mov bp,sp

    mov ax, [PlayerSquareX]
    mov [x], ax

    mov ax, [PlayerSquareY]
    mov [Y], ax

    mov [SquareSize], 25
    mov  [color], 1 ; blue color
    call PaintSquare ;  

    pop bp
    ret 
endp PaintPlayerSquare

proc RemovePlayerSquare ;Removes The Player Square
    push bp
    mov bp,sp

    push ax
    push bx
    push cx
    push dx 

    mov ax, [PlayerSquareX]
    mov [x], ax

    mov ax, [PlayerSquareY]
    mov [Y], ax

    mov [SquareSize], 25
    mov  [color], 0 ; black color
    call PaintSquare ;  

    pop dx
    pop cx
    pop bx
    pop ax

    pop bp
    ret 
endp RemovePlayerSquare


proc PaintBlockSquare ; Paints The Block Square
    push bp
    mov bp,sp


    mov ax, [BlockX]
    mov [x], ax

    mov ax, [BlockY]
    mov [Y], ax

    mov [SquareSize], 15
    mov  [color], 4 ; red color
    call PaintSquare ;  

    pop bp
    ret 
endp PaintBlockSquare

proc RemoveBlockSquare ;Removes The block Square
    push bp
    mov bp,sp

    push ax
    push bx
    push cx
    push dx 


    mov ax, [BlockX]
    mov [x], ax

    mov ax, [BlockY]
    mov [Y], ax

    mov [SquareSize], 15
    mov  [color], 0 ; black color
    call PaintSquare ;  

    pop dx
    pop cx
    pop bx
    pop ax

    pop bp
    ret 
endp RemoveBlockSquare

proc MoveBlockLeft ;Makes The Square Jump
    push cx


    mov cx, 77
    loopMoveBlockLeft:
    Call HalfSecondDelay

    call RemoveBlockSquare
    sub [BlockX], 4 ; Move Up
    call PaintBlockSquare
    loop loopMoveBlockLeft



    pop cx
    ret
endp MoveBlockLeft



proc GraphicsScreen
    mov al, 13h
    mov ah, 0
    int 10h
    ret
endp GraphicsScreen

proc ResetBlockLocation
    mov [BlockX], 305
    mov [BlockY], 193
    ret
endp ResetBlockLocation


start:
    mov ax, @data
    mov ds, ax

    Call GraphicsScreen
    Call PaintFloor
    Call PaintPlayerSquare


    call PaintBlockSquare
    call MoveBlockLeft
    call RemoveBlockSquare
    call ResetBlockLocation
    call ClearKeyboardBuffer
    call WaitForSpace




exit:
    mov ax, 4c00h
    int 21h
END start

1 个答案:

答案 0 :(得分:0)

一种可行的方法是实现game loop或类似的概念-event loop

这个想法是将动画分成一系列帧,并且一次仅更新一帧。假设您要执行30 FPS,并且移动速度为每秒90px。这意味着您需要在1帧中将对象移动3px左右,然后暂停0.033秒(33 ms)。

每帧之后,您都要检查输入和处理操作。

其运行方式是开始第一个动画,记住动画状态,更新到下一帧,然后检查输入,更新到下一帧,然后再次检查输入,也许开始第二个动画(现在开始)您一次处理2种动画状态),将两者都更新到下一帧,再次检查输入等。