我想熟悉一下诅咒界面(之前从未使用过),所以上周末我写了一个小的snake游戏。有一行状态 WINDOW *
,屏幕的其余部分是字段 WINDOW *
。游戏逻辑调用中央绘图函数来放置项目,只有在必要时:
/* note: CP_* are just enum values to give my own color pairs names */
void
screen_putItem(Screen *self, int y, int x, Item item, int refresh)
{
switch (item)
{
case EMPTY:
mvwaddch(self->field, y, x, ' '|COLOR_PAIR(CP_WHITE));
break;
case HEAD:
#ifdef WIN32
/* 'smiley' character for windows console */
mvwaddch(self->field, y, x,
1|COLOR_PAIR(CP_YELLOW)|A_BOLD|A_ALTCHARSET);
#else
mvwaddch(self->field, y, x, '@'|COLOR_PAIR(CP_YELLOW)|A_BOLD);
#endif
break;
case TAIL:
mvwaddch(self->field, y, x, ACS_CKBOARD|COLOR_PAIR(CP_YELLOW));
break;
case FOOD:
mvwaddch(self->field, y, x, '#'|COLOR_PAIR(CP_GREEN)|A_BOLD);
break;
case FFOOD:
mvwaddch(self->field, y, x, '#'|COLOR_PAIR(CP_GREEN));
break;
case WALL:
mvwaddch(self->field, y, x,
' '|COLOR_PAIR(CP_RED)|A_REVERSE);
break;
}
if (refresh) wrefresh(self->field);
}
问题是:在rxvt
中,蛇的身体(由TAIL
物品制成)有时闪烁。不是重绘蛇的运动,只有头部的最后一个位置被TAIL
取代,蛇尾部的项目被EMPTY
取代。
供您参考,整个项目都在github上,请参阅询问此问题时的修订。
对于输入,代码使用getch()
,我已经检查过这不是问题(它不应该是,stdscr
在初始化时刷新,并且再也不会触及),通过在字段窗口上仅使用wgetch()
获得相同的结果。
此外,它在良好的旧xterm
和windows控制台中工作得很好(无闪烁),使用pdcurses。它在rxvt
中工作得很好。如果我将上面代码片段中的ACS_CKBOARD
替换为一些"普通"字符。
所以,现在我想知道:我在rxvt
遇到了一个错误/缺点吗?ACS_*
字符有什么特别的地方会导致终端闪烁吗?我的方法有什么问题吗?
跟踪显示,您的程序几乎所有的刷新都是从stdscr中完成的,但几乎所有的刷新都是针对创建的第二个窗口完成的(看起来第一个窗口只是一个状态行)。
ncurses的跟踪特性通常在调试库中;