Z80汇编双字符精灵右移仅上半部分移动问题咨询
问题根源分析
你的猜测方向是对的,问题本质是两个核心逻辑没有同步处理精灵上下两部分的属性:
你定义的PLAYER段是两行ZX Spectrum的PRINT AT控制序列,每行固定4字节:控制码22, Y坐标, X坐标, 字符码,结构如下:
PLAYER DEFB 22, 12, 15, 144 ; 上半部分:偏移2存X坐标,偏移3存字符码 DEFB 22, 13, 15, 145 ; 下半部分:偏移6存X坐标,偏移7存字符码
1. 右移逻辑只更新了上半部分X坐标
你当前的GORIGHT逻辑只修改了PLAYER+2(上半部分的X坐标存储地址),下半部分的X坐标存储在PLAYER+6的位置,完全没有被修改,所以下半部分永远停留在初始的X=15位置。
2. 擦除逻辑只处理了上半部分字符
你当前的UNDRAW逻辑只把PLAYER+3(上半部分的字符码)改为空格,下半部分的字符码存储在PLAYER+7的位置,擦除时还是保留原UDG字符145,所以旧位置的下半部分不会被清空。
你之前的
LD BC, EOPLAYR-PLAYER长度设置是完全正确的,确实覆盖了两行共8字节的打印内容,问题出在待打印的内容本身的坐标、字符值没有同步修改,和打印长度无关。
修复方案
修复右移逻辑
GORIGHT LD A, (PLAYER+2) ; 用上半部分X坐标做边界判断 CP 31 JR Z, MAINLP CALL UNDRAW LD A, (PLAYER+2) ; 上半部分X坐标+1 INC A LD (PLAYER+2), A LD (PLAYER+6), A ; 新增:同步把下半部分X坐标也+1 JR MAINLP
修复擦除逻辑
UNDRAW LD A, " " LD (PLAYER+3), A ; 上半部分字符改为空格 LD (PLAYER+7), A ; 新增:下半部分字符也改为空格 CALL PRTPLAY ; 擦除所有旧位置残留 LD A, 144 LD (PLAYER+3), A ; 恢复上半部分UDG字符 LD A, 145 LD (PLAYER+7), A ; 新增:恢复下半部分UDG字符 RET
内容的提问来源于stack exchange,提问作者Ghoul Fool
相关产品推荐
相关产品推荐

