在8086汇编器中获取图片的位置
Getting the position of a picture in 8086 assembler
有没有办法在8086汇编器中获取图片的位置?
(在图形模式下)
背景:
我想做的是一个箭头围绕图片(玩家)旋转的游戏,当用户按下 space 时图片移动(在同一方向箭头指向),当用户再次输入 space 时将停止,依此类推。
但我卡住了。图片从初始位置移动后,我不知道如何绘制箭头...
谢谢。
Is there a way to get the position of a picture in 8086 assembler? (In graphics mode)
当然可以,读取记录图片位置的关联变量即可
PositionX dw 0
PositionY dw 0
您还需要跟踪箭头的位置(您肯定已经这样做了!):
ArrowX dw 0
ArrowY dw 0
它是如何工作的。
在第一个 space 到达时,您将这些位置值复制到一些 Temp 位置
mov ax, [PositionX]
mov [TempX], ax
mov ax, [PositionY]
mov [TempY], ax
现在您让游戏(自动)按照箭头所指的方向移动图片。每次游戏重新绘制图片时,它也会更新关联的变量PositionX和PositionY。你只是坐着看图片移动。
在第二个 space 到达时,您计算两组变量之间的差异。
如果箭头指向上方,您 知道 PositionY 将小于 TempY(因为这就是Y 坐标在屏幕上有效)并且 PositionX 将等于 TempX。这意味着:
mov ax, [PositionY]
sub ax, [TempY]
mov [DeltaY], ax ;With UP, this will be a negative number
mov [DeltaX], 0
想想这个逻辑对于其他 3 个可能的方向有何不同。
现在真正的美妙之处在于,您甚至不需要考虑这些不同方向的可能结果!只需使用以下内容:
mov ax, [PositionX]
sub ax, [TempX]
mov [DeltaX], ax
mov ax, [PositionY]
sub ax, [TempY]
mov [DeltaY], ax
最后要在新位置绘制箭头,首先将其从当前位置擦除(使用 ArrowX 和 ArrowY[ 的当前内容=53=] 变量),然后通过将 DeltaX 和 DeltaY 变量添加到加工 ArrowX 来在新位置重新绘制它 和 ArrowY 变量:
mov [Color], 0 ;Black
call DrawArrow ;Erase arrow
mov ax, [DeltaX]
add [ArrowX], ax
mov ax, [DeltaY]
add [ArrowY], ax
mov [Color], 15 ;White
call DrawArrow ;Show arrow
有没有办法在8086汇编器中获取图片的位置? (在图形模式下)
背景:
我想做的是一个箭头围绕图片(玩家)旋转的游戏,当用户按下 space 时图片移动(在同一方向箭头指向),当用户再次输入 space 时将停止,依此类推。
但我卡住了。图片从初始位置移动后,我不知道如何绘制箭头...
谢谢。
Is there a way to get the position of a picture in 8086 assembler? (In graphics mode)
当然可以,读取记录图片位置的关联变量即可
PositionX dw 0
PositionY dw 0
您还需要跟踪箭头的位置(您肯定已经这样做了!):
ArrowX dw 0
ArrowY dw 0
它是如何工作的。
在第一个 space 到达时,您将这些位置值复制到一些 Temp 位置
mov ax, [PositionX]
mov [TempX], ax
mov ax, [PositionY]
mov [TempY], ax
现在您让游戏(自动)按照箭头所指的方向移动图片。每次游戏重新绘制图片时,它也会更新关联的变量PositionX和PositionY。你只是坐着看图片移动。
在第二个 space 到达时,您计算两组变量之间的差异。
如果箭头指向上方,您 知道 PositionY 将小于 TempY(因为这就是Y 坐标在屏幕上有效)并且 PositionX 将等于 TempX。这意味着:
mov ax, [PositionY]
sub ax, [TempY]
mov [DeltaY], ax ;With UP, this will be a negative number
mov [DeltaX], 0
想想这个逻辑对于其他 3 个可能的方向有何不同。
现在真正的美妙之处在于,您甚至不需要考虑这些不同方向的可能结果!只需使用以下内容:
mov ax, [PositionX]
sub ax, [TempX]
mov [DeltaX], ax
mov ax, [PositionY]
sub ax, [TempY]
mov [DeltaY], ax
最后要在新位置绘制箭头,首先将其从当前位置擦除(使用 ArrowX 和 ArrowY[ 的当前内容=53=] 变量),然后通过将 DeltaX 和 DeltaY 变量添加到加工 ArrowX 来在新位置重新绘制它 和 ArrowY 变量:
mov [Color], 0 ;Black
call DrawArrow ;Erase arrow
mov ax, [DeltaX]
add [ArrowX], ax
mov ax, [DeltaY]
add [ArrowY], ax
mov [Color], 15 ;White
call DrawArrow ;Show arrow