AP2用户进程的代码为task2.asm。
该用户进程将在界面上显示一个移动的弹球。一旦在界面上点击鼠标左键,弹球就会直接从鼠标点击处重新出现并继续移动。
如何在界面上显示出一个持续移动的小球?
计算小球将移动到的区域1->保留该区域中将被小球覆盖的点->将小球的点写入区域1->计算小球将移动到的区域2->将原区域1中被小球覆盖的点复原->保留区域2中将被小球覆盖的点->将小球的点写入区域2->…
代码解释如下:
主循环中,每一次循环都先等待30ms。
将原被小球覆盖的点复原。之后,将获取小球出现在新位置的坐标。然后先保存新位置处将被覆盖的点,再显示小球。
调用0x83系统中断,获取鼠标在界面上点击处的X、Z轴。同时判断,鼠标点击处的X坐标不能小于4,也不能超过1142;同时,点击处的Y轴也不能小于82,或者超过810。(如果并没有鼠标没有点击界面,获得的X、Y轴的值将都为0)
如果获取到的X、Y坐标满足条件,则小球下一次出现的地方将被更新为鼠标点击的位置。
小球新出现的位置的X轴和Y轴数据保存在x_axle和y_axle中,先用保存新坐标的值。
将新位置处将被小球覆盖的点都保存起来。
在新位置显示小球。
改变小球下一次显示时的颜色。
之后计算下一次小球出现的位置。先计算X轴的值。
x_nxt_step中保存了小球在X轴上移动的步长,为1时,每次向右移动一步;为-1时,每次向左移动一步。
先用x_nxt_step中保存的步长与小球当前位置的X轴的值相加,然后通过x_nxt_step的值来判断小球移动的方向。
如果x_nxt_step的值大于0,小球向右移动。此时判断小球移动后的X轴位置是否大于1142,如果大于,则将步长x_nxt_step设置为-1,下次往左移动。
如果小球本身向左移动,就判断小球移动后的X轴是否小于4,如果小于,则将步长x_nxt_step设置为1,下次往右移动。
之后计算Y轴的值。与X轴的计算相同,通过步长y_nxt_step来判断小球正在往上还是往下移动。往下移动时,判断Y轴是否已经到810处,如果是,则步长改为-1,下一次开始向上移动;如果小球往上移动,则判断Y轴是否已经到82处,如果是,步长改为1,下次开始向下移动。
至于_fill_old、_save_old、_fill_new这几个函数,很简单,不再解释。
task2.asm源代码地址:https://download.csdn.net/download/hanspruce_bird/87502151