使用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
相关产品推荐
相关产品推荐

