Assembly 如何根据坐标读取控制台上已经存在的位置?组件8086
我正在制作一个吃豆人游戏,我需要检查我角色前面的坐标中有什么,这样我就可以看到吃豆人是否有可能移动到这些坐标中。我已经搜索了很多次了,但我不确定如何准确地将这个问题转化为谷歌搜索的术语,而且运气不好 我想做的事情的伪代码: CheckNext PROC go to coordinate position (champ_xnew,champ_ynew) take what is in that position, store into next (next BYTE ?) 检查下一个进程 转到坐标位置(champ_xnew,champ_ynew) 获取该位置的内容,存储到下一个(下一个字节?) 上面的部分(从记忆中阅读)是我需要帮助的 cmp next, '#' ;# is what I am using for walls je NoMove jne Move Move: champ_x = champ_xnew champ_y = champ_ynew NoMove: return without changing champ_x/y CheckNext ENDP cmp下一步,###这是我用来做墙壁的 我不喜欢 jne移动 移动: champ_x=champ_x新 champ_y=champ_ynew NoMove: 返回而不更改champ_x/y 检查下一个端点Assembly 如何根据坐标读取控制台上已经存在的位置?组件8086,assembly,x86,x86-16,Assembly,X86,X86 16,我正在制作一个吃豆人游戏,我需要检查我角色前面的坐标中有什么,这样我就可以看到吃豆人是否有可能移动到这些坐标中。我已经搜索了很多次了,但我不确定如何准确地将这个问题转化为谷歌搜索的术语,而且运气不好 我想做的事情的伪代码: CheckNext PROC go to coordinate position (champ_xnew,champ_ynew) take what is in that position, store into next (next BYTE ?) 检查下一个进程 转到
只要屏幕处于文本模式(而不是图形模式),您可以简单地从(分段)地址0xB800:0x0000读回屏幕数据。假设您使用的是彩色文本模式,那么您的屏幕从B800:0000开始,您使用的是8086操作码,即在有效地址计算中不进行缩放。一行有160个字节(每个字符单元填充两个字节:一个用于字符本身,另一个用于颜色)
要读取屏幕上特定坐标上的字符和颜色,有两种方法:
al包含字符屏幕不是信息的存储器,而是一个输出设备。虽然可以从视频存储器中读取字符/像素,但这是不可取的。将级别的结构存储在内存中。然后随意读(写)@SevaAlekseyev如果我没记错的话,至少在某些VGA模式下,视频内存可以用来保存由几个位平面组成的精灵,以便以后复制到视频内存的可见区域,这是迈克尔·艾布拉什在《图形编程之禅》第二版中提到的一种技术。无论如何,我同意你的观点,一般来说,屏幕或视频存储器不应该被程序读取,只能直接或间接地写入。这不是OP的目的。所述技术用于图形性能,而不是(mis)使用视频存储器进行状态存储。不管怎样,它的效率非常低,有位平面之类的。
mov al,[x]
mov bl,160
mul bl ;AX = x*80*2
xor bx,bx
mov bl,[y]
add bx,bx ;BX = y*2
add ax,bx ;AX = x*160 + y*2
mov si,ax
mov ax,0b800h
mov es,ax ;ES:SI points to the character at coordinates X,Y
mov al,es:[si] ;AL has the ASCII code of character at coordinates X,Y