想熟悉一下curses界面(以前没用过),所以上周末写了一个小蛇游戏。有一个单行状态 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
物品制成)有时会闪烁。蛇的运动没有重绘,只是头部的最后一个位置被替换为 aTAIL
并且蛇末端的尾部项目被替换为EMPTY
。
供您参考,整个项目都在 github 上,请参阅提出此问题时的修订。
对于输入,代码使用并且我已经通过仅在具有相同结果的字段getch()
窗口上使用来检查这不是问题(它不应该是,stdscr
在初始化时刷新并且再也不会被触及) 。wgetch()
此外,它使用pdcursesxterm
在旧版和 Windows 控制台中运行良好(无闪烁)。如果我用一些“普通”字符替换上面的代码片段,它就可以正常工作。rxvt
ACS_CKBOARD
所以,现在我想知道:我是否遇到了错误/缺点rxvt
?ACS_*
可能导致终端闪烁的字符有什么特别之处吗?我的方法有什么问题吗?