5 bball(harib26d)
“bball”是笔者很喜欢的一个OSASK上的应用程序,这个名字是“beautiful ball”的缩写,通过绘制很多条直线,组成一个美丽的球形。程序本身很短也很简单,不过画出来的图形非常漂亮。我们把这个程序也移植到“纸娃娃系统”上来吧。
其实,笔者之所以在“纸娃娃系统”中编写了用来画直线的API,也正是为了在这里移植这个程序呢(笑)。
bball.c
#include "apilib.h"
void HariMain(void)
{
int win, i, j, dis;
char buf[216 * 237];
struct POINT {
int x, y;
};
static struct POINT table[16] = {
{ 204, 129 }, { 195, 90 }, { 172, 58 }, { 137, 38 }, { 98, 34 },
{ 61, 46 }, { 31, 73 }, { 15, 110 }, { 15, 148 }, { 31, 185 },
{ 61, 212 }, { 98, 224 }, { 137, 220 }, { 172, 200 }, { 195, 168 },
{ 204, 129 }
};
win = api_openwin(buf, 216, 237, -1, "bball");
api_boxfilwin(win, 8, 29, 207, 228, 0);
for (i = 0; i <= 14; i++) {
for (j = i + 1; j <= 15; j++) {
dis = j - i; /*两点间的距离*/
if (dis >= 8) {
dis = 15 - dis; /*逆向计数*/
}
if (dis != 0) {
api_linewin(win, table[i].x, table[i].y, table[j].x, table[j].y, 8 - dis);
}
}
}
for (;;) {
if (api_getkey(1) == 0x0a) {
break; /*按下回车键则break; */
}
}
api_end();
}
这种写法在结构数组声明部分直接赋予初始值,可能大家还是第一次见到。没关系,只要知道“嘿,原来还可以这样写啊”就可以啦。
■■■■■
好,我们来“make run”。啊,图形超出画面边界了,不过用VESA的人应该可以完全显示出来的哦。咦?显示的图形有问题啊……
有些线没有显示出来
唔,这貌似是操作系统的bug呢,因为画线的程序并没有什么问题。我们把窗口移动一下看看。哦,果然好了。也就是说,这是refresh失败导致的。
于是我们来修正一下操作系统的bug。
本次的console.c节选
int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax)
{
(中略)
} else if (edx == 13) {
sht = (struct SHEET *) (ebx & 0xfffffffe);
hrb_api_linewin(sht, eax, ecx, esi, edi, ebp);
if ((ebx & 1) == 0) { /*从此开始*/
if (eax > esi) {
i = eax;
eax = esi;
esi = i;
}
if (ecx > edi) {
i = ecx;
ecx = edi;
edi = i;
} /*到此结束*/
sheet_refresh(sht, eax, ecx, esi + 1, edi + 1);
}
} else if (edx == 14) {
(中略)
}
为了保证refresh范围指定正确的左上角和右下角坐标,我们将变量进行比较后做了替换。
再来“make run”一次看看……成功了!怎么样,很漂亮吧?这样一个应用程序只需要350字节哦,“纸娃娃系统”真是相当给力不是吗?
bball完成
不过图形超出画面范围看上去很不爽,我们用VESA模式再重新截一张图片下来。
这就是bball的完整版啦!