为什么我的代码会同时显示起始屏幕和丢失屏幕,即使我在任何时候都不调用丢失屏幕

问题描述 投票:0回答:1

我想为我的游戏制作一个开始屏幕和一个结束屏幕。当我开始时,它会显示我的开始屏幕一秒钟,然后立即更改为失败屏幕,按钮仍在工作以开始游戏,但它只显示失败屏幕。如果苹果接触到地板,它应该进入失败屏幕(proc GamePlay)。开始屏幕在开始部分被调用(调用 Startscreen),whatPress 用于播放按钮。(还有一些东西在代码中不起作用,但这是我现在主要关心的问题)

IDEAL
MODEL small
STACK 100h
P186
;------------------------------------
include "Display.asm"
DATASEG
checkcolor db ?
ballspeed dw 05FFFh;0-0FFFF|0-faster FFFF-slower
x0 dw 163
y0 dw 187
x dw 163
y dw 187
xgreen dw 190
ygreen dw 190
color db 15   ; 15 = white    5 = pink
w dw 17       ; width of the rectangle
h dw 9       ; height of the rectangle

;===============
 floorh dw 4
 floorw dw 320
 floorx0 dw 0
 floory dw 197
 floorx dw 0
 floorcolor db 33
 ;==============
 blackcolor db 0
 appleh dw 6
 applew dw 5
 applex0 dw ?
 appley dw 5
 applex dw ?
 applecolor db 4
;=================
ten db 10
RandomNumber db 0
 ;================
 startcolor db 0
num0 Bitmap {ImagePath="num0.bmp"}
num2 Bitmap {ImagePath="num2.bmp"}
 ;-------------
 mousePress db 0;0=nothing preseed, 1= white pressed(15), 2 rules pressed (5)
 appleHit db 0 ; 0 = no hit, 1 = hit the paddle, 2 = hit the floor
 keyboardStatus db 0
 Hero  db 00,00,255,255,255,255,255,255,255,255,255,255,255,255,255,00,00
       db 00,00,255,255,255,255,255,255,255,255,255,255,255,255,255,00,00
       db 00,00,255,255,255,255,255,255,255,255,255,255,255,255,255,00,00
       db 00,00,255,255,255,255,255,255,255,255,255,255,255,255,255,00,00
       db 00,00,255,255,255,255,255,255,255,255,255,255,255,255,255,00,00
       db 00,00,255,255,255,255,255,255,255,255,255,255,255,255,255,00,00
       db 00,00,255,255,255,255,255,255,255,255,255,255,255,255,255,00,00
       db 00,00,255,255,255,255,255,255,255,255,255,255,255,255,255,00,00
       db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
       ;---------------------------
apple  db 00,00,00,00,00
       db 14,14,14,14,14
       db 14,14,14,14,14
       db 14,14,14,14,14
       db 14,14,14,14,14
       db 14,14,14,14,14
       ;---------------------------
appleblack  db 00,00,00,00,00
            db 00,00,00,00,00 
            db 00,00,00,00,00
            db 00,00,00,00,00
            db 00,00,00,00,00
            db 00,00,00,00,00
       
;----------------------------   
CODESEG
    



;-----------------------------------
proc clean
pusha
    mov cx, 64000    ; 320x200 pixels / 2 bytes per pixel
    xor al, al       ; Color to fill (black)
    rep stosb        ; Fill video memory with AL (black)
popa
ret
endp clean
;-------------------
proc Startscreen
pusha
mov ax, 2h 
int 33h
mov si, offset num0
display_BMP si,0,0   ; 0,0  x y
mov ax, 1h
int 33h
popa
endp Startscreen
proc LoseScreen
pusha
mov ax, 2h 
int 33h
mov si, offset num2
display_BMP si,0,0   ; 0,0 x y
mov ax, 1h
int 33h
popa
endp LoseScreen
;------------------------------------
proc delay
pusha
mov cx, 1h
mov dx, 10h   ;  [ballspeed]
mov al,0

mov ah,86h
int 15h
popa
ret
endp delay
;=============================
proc printHero
    pusha
    mov si, offset Hero
    mov cx, [h]
printCol:
    push cx
    push [x]
    mov cx, [w]
printRow:
    mov dl, [byte ptr si]
    mov [color], dl
    call one_dot
    inc [x]
    inc si
    loop printRow
    inc [y]
    pop [x]
    pop cx
    loop printCol
    popa
    ret
endp printHero
;------
proc printApple
    pusha
    mov si, offset apple
    mov cx, [appleh]
applePrintCol:
    push cx
    push [applex]
    mov cx, [applew]
applePrintRow:
    mov dl, [byte ptr si]
    mov [applecolor], dl
    call apple_dot
    inc [applex]
    inc si
    loop applePrintRow
    inc [appley]
    pop [applex]
    pop cx
    loop applePrintCol
    popa
    ret
endp printApple
;--------
proc printBlackApple
    pusha
    mov si, offset appleblack
    mov cx, [appleh]
blackapplePrintCol:
    push cx
    push [applex]
    mov cx, [applew]
blackapplePrintRow:
    mov dl, [byte ptr si]
    mov [blackcolor], dl
    call apple_dot
    inc [applex]
    inc si
    loop blackapplePrintRow
    inc [appley]
    pop [applex]
    pop cx
    loop blackapplePrintCol
    popa
    ret
endp printBlackApple
;--------
proc one_dot
    pusha
    mov bh,0h
    mov cx,[x]
    mov dx,[y]
    mov al,[color]
    mov ah,0ch
    int 10h
    popa
    ret
endp one_dot
;=====================
proc floor_rec
pusha
    mov cx,[floorh]  ; rectangle height
rectangle:

    push cx
    mov cx, [floorw]   ; rectangle width
    mov dx, [floorx0]   
    mov [floorx] , dx
    
    call one_line
    
    inc [floory]     
    pop cx
    loop rectangle
    popa
    ret 
    
;drawLine:
;   push cx
;   call floor_dot

endp floor_rec
;-------------------------------
proc floor_dot
pusha
    mov bh,0h
    mov cx,[floorx]
    mov dx,[floory]
    mov al,[floorcolor]
    mov ah,0ch
    int 10h
    popa
    ret
endp floor_dot
;-----------------------
proc one_line
    pusha
    Line:
    push cx
    call floor_dot
    inc [floorx] 
    pop cx
    loop Line
    popa
    ret
endp one_line
;===================
proc apple_rec
pusha
    mov cx,[appleh]  
applerec:

    push cx
    mov cx, [applew]   
    mov dx, [applex0]   
    mov [applex] , dx
    
    call apple_line
    
    inc [appley]    
    pop cx
    loop applerec
    popa
    ret 
endp apple_rec
;------------------------------
proc apple_dot
pusha
    mov bh,0h
    mov cx,[applex]
    mov dx,[appley]
    mov al,[applecolor]
    mov ah,0ch
    int 10h
    popa
    ret
endp apple_dot
;---------------------
proc apple_line
    pusha
    AppleLine:
    push cx
    call apple_dot
    inc [applex] 
    pop cx
    loop AppleLine
    popa
    ret
endp apple_line
;-------------------------
proc randomApplex
    pusha
    mov bx,100
    mov ax, 40h
    mov es, ax
    mov ax, [es: 6Ch]
    xor ax, [bx]
    and ax, 000Fh
    mov [applex],ax
    popa
ret
endP RandomApplex
;---------------------
;===================
;------------------------------
;==========================
;==========================
proc setUpMagicNumbers
    pusha
    call randomApplex
    popa
    ret
endp setUpMagicNumbers
;==========================
proc checkHit
    pusha
    mov cx,[applex]
    mov dx,[appley]
    add dx, 5
    ;
    mov bh,0h
    mov ah,0Dh
    int 10h
    cmp al,[floorcolor]
    je floorHit
    cmp al, 255
    je boardHit
    jmp noHit
floorHit:
    mov [appleHit], 2
    jmp noHit
boardHit:
    mov [appleHit], 1
    
noHit:
    popa
    ret
endp checkHit
;==========================
proc reactKeyboardInput
    pusha
    ; Wait for key press
    mov ah,01h
    int 16h
    
    cmp al,27 ; ESC
    je escPress
    mov [keyboardStatus], 0 ; esc wasnt pressed
    jmp escNPress
escPress:
    mov [keyboardStatus], 1 ; esc was pressed
escNPress:

    cmp ah, 75 ; Left
    jne skip1
    dec [x]
    
skip1:  
    cmp ah, 77 ; Right
    jne skip2
    inc [x]

skip2:
    push [y0]
    pop  [y] 

    xor ax, ax ;cleans the buffer if esc was pressed
    mov ah, 0ch
    xor al, al
    int 21h
    popa
    ret
endp reactKeyboardInput
;==========================
proc appleWasHit
    pusha
    mov ax, 10
    popa
    ret
endp appleWasHit
;==========================
proc lowerApple
    pusha
    mov ax, [appley]
    sub ax, [appleh]
    mov [appley], ax
    inc [appley]
    popa
    ret
endp lowerApple
;==========================
proc resetApple
pusha
mov [appley],5
call randomApplex
popa
ret
endp resetApple
;==========================
proc Lose
pusha
call clean
call LoseScreen
    mov ax,00
        int 33h
        mov ax,01
        int 33h
waitforpress2:
;call Esc_end
        mov ax, 3
        int 33h

        cmp cx, 418
        jb waitforpress2
        cmp cx, 622
        ja waitforpress2
        cmp dx, 23
        jb waitforpress2
        cmp dx, 121
        ja waitforpress2
        cmp bx, 1h
        je startt2
        jmp waitforpress2
        startt2:
        mov ax,02
        int 33h
        call clean
        call whatPress
popa
endp Lose
;=========================
proc MousePressChange
pusha
waitMS:
mov ax,3h
int 33h
cmp bx,01h
jne waitMS
popa
ret
endp MousePressChange
;===========
proc whatPress
pusha
    mov ax,00
        int 33h
        mov ax,01
        int 33h
waitforpress:
;call Esc_end
        mov ax, 3
        int 33h

        cmp cx, 112
        jb waitforpress
        cmp cx, 452
        ja waitforpress
        cmp dx, 81
        jb waitforpress
        cmp dx, 153
        ja waitforpress
        cmp bx, 1h
        je startt
        jmp waitforpress
        startt:
        mov ax,02
        int 33h
        call clean
        call GamePlay
endp whatPress
;============================
;================
proc GamePlay
pusha
    call setUpMagicNumbers
    call floor_rec
    call printHero
again:
    call reactKeyboardInput
    call printApple
    call lowerApple
    call printHero
    call delay
    call checkHit
    
    mov al, [appleHit]
    cmp al, 0
    je appleWasntHit
    cmp al, 1
    je appleHeroHit
    cmp al, 2
    je appleHitFloor
    
    appleWasntHit:
    jmp again
    appleHeroHit:
    call resetApple
    mov [appleHit],0
    jmp again
    appleHitFloor:
    call Lose
    popa
    endp GamePlay
START:
    mov ax, @data
    mov ds, ax
    ; Graphic mode
    mov ax, 13h
    int 10h
    ;===================
    call Startscreen
    call whatPress
        ;=================
        
        ;===========
    
; Return to text mode
    mov ah, 0
    mov al, 2
    int 10h
exit:
    mov ax, 4c00h
    int 21h
END start

一开始我只是调用了丢失屏幕,但它不起作用,然后我尝试将其放入进程中,但它仍然不起作用,我真的不知道为什么它同时显示两个屏幕。

assembly bitmap x86-16 bmp
1个回答
0
投票
proc Startscreen
pusha
...
popa
endp Startscreen
proc LoseScreen
pusha
...
popa
endp LoseScreen
proc delay
pusha
...
popa
ret
endp delay

endp
单独不会从过程中返回

您需要编写

ret
指令。因为 LoseScreen 直接跟随 StartScreen 过程,所以它会一起执行。即使 delay 过程也运行了,但因为它有一个
ret
,所以代码最终返回到主循环。

proc Startscreen
pusha
...
popa
ret                     <<<< add this
endp Startscreen
proc LoseScreen
pusha
...
popa
ret                     <<<< add this
endp LoseScreen
proc delay
pusha
...
popa
ret
endp delay
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.