You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Irvine32库开发乒乓游戏:如何在等待输入时让球持续移动

解决Irvine32库下乒乓游戏的非阻塞输入问题

方案一:非阻塞按键检测(新手友好)

Irvine32库自带的CheckKey函数是非阻塞的,专门用来检查是否有按键输入:

  • 有按键按下时,AL会存入按键的ASCII码,AH存扫描码,且AX返回非零值
  • 无按键时,AX置0,程序直接跳过输入处理,继续执行后续逻辑

把你的阻塞式ReadChar替换成CheckKey的判断逻辑,就能实现「等待输入同时球持续移动」的效果,修改后的核心代码如下:

.code
main PROC
    
    call DrawPlayGround
    call DrawPlayer
    call DrawBall

    gameLoop:
        ; 优先处理球的移动逻辑——不管有没有输入,球都会动
        call UpdateBallPosition  ; 自行实现球的位置更新、碰撞检测逻辑
        call DrawBall

        ; 非阻塞检查按键
        call CheckKey
        jz noInput  ; AX=0表示无按键,跳过输入处理

        mov inputChar, al
        ; 按x退出游戏
        cmp inputChar,"x"
        je exitGame

        cmp inputChar,"w"
        je moveUp

        cmp inputChar,"s"
        je moveDown

        jmp noInput  ; 非有效按键,直接跳过

    moveUp:
        call UpdatePlayerUP
        dec yPosPlayer
        call DrawPlayer
        jmp noInput
    
    moveDown:
        call UpdatePlayerDOWN
        inc yPosPlayer
        call DrawPlayer
        jmp noInput
    
    noInput:
        ; 添加短延迟,避免游戏运行过快
        mov eax, 10
        call Delay  ; 延迟10毫秒,可根据需求调整数值
        jmp gameLoop

    exitGame:
    exit
main ENDP

方案二:输入超时机制(进阶)

Irvine32库没有直接提供带超时的ReadChar,如果一定要用超时等待,需要调用Windows原生API(比如ReadConsoleInput)配合超时逻辑,但这对汇编新手来说复杂度较高,因此更推荐方案一。

核心注意事项

  • 循环顺序:必须先处理球的移动,再检查输入,确保球的运动不被输入阻塞
  • 速度控制:Delay函数用来限制循环频率,避免球移动速度过快
  • 输入过滤:只处理有效按键(w/s/x),其他按键直接跳过,避免无效操作干扰游戏

内容的提问来源于stack exchange,提问作者Krithin Kishor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:41:27