显示窗口
前文鼠标移动还留下了一个BUG,其实只要在主函数和画面刷新函数,各加上对边界的判断就解决了。
接下来我们尝试制作窗口,和前面制作背景和鼠标一样,先准备一个图层,然后在图层缓冲区内描绘一个貌似窗口的图就行了。
这里的制作窗口的函数,我们只需对设置背景的函数稍加改造就可以得到的,而x按钮的功能可以通过修改鼠标初始化的函数得到啦!代码就不罗列了。
CPU:这个锅我不背!!!
之前我们用HLT指令让CPU有空就睡觉,估计现在已经失眠了呢,现在我们让它做点事情,就数绵羊吧(计数)。
运行一下发现,计数器窗口显示的内容一直在闪烁,看来是CPU不肯睡,一直在眨眼睛呀。(再调皮试试?)
CPU:这个锅我不背!!!你之前写刷新图层的时候,就是先刷背景图层再刷窗口图层的。你这么写我也很绝望呀!!
鼠标指针:哈?
窗口图层刷新是因为窗口内容有变化,所以要显示变化后的内容。既然如此,图层内容没有变化也进行刷新就太浪费了。如果是窗口变了,背景也可以不用刷新。而且假如鼠标指针在上面的话,因为会覆盖鼠标指针的一部分区域,还要进一步刷新。在移动目标处,比新移来的图层位置低的图层没有变化,所以只需刷新移动的图层。
测试一下~
鼠标指针:你的数字好像不闪烁啦!
计数器窗口:是呀,但是鼠标你怎么在闪烁呀?
鼠标指针:哈?
鼠标指针的闪烁是由于计数器的数字不断变化,鼠标一会儿描绘一会儿消除造成的。所以我们就要在刷新窗口时避开鼠标所在的地方对VRAM进行写入处理。
这里我们采用这种方法:先开辟一块和VRAM一样大的内存,姑且称之为map。这块内存用来表示画面上的点事哪个图层的像素,所以他就相当于图层的地图。
当刷新图层1的时候,一边看着这个map一边刷新,妈妈再也不用担心图层1和图层2重叠的部分被覆盖了!!