rxvt中使用ncurses的闪烁ACS电路板
我想熟悉诅咒界面(以前从未使用过),所以上周末我写了一个小蛇游戏。有一个单行状态rxvt中使用ncurses的闪烁ACS电路板,c,linux,ncurses,rxvt,C,Linux,Ncurses,Rxvt,我想熟悉诅咒界面(以前从未使用过),所以上周末我写了一个小蛇游戏。有一个单行状态窗口*,屏幕的其余部分是字段窗口*游戏逻辑调用一个中央绘图函数来放置一个项目,只有在必要时: /* 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)
窗口*
,屏幕的其余部分是字段窗口*
游戏逻辑调用一个中央绘图函数来放置一个项目,只有在必要时:
/* 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
中,蛇的身体(由尾巴
物品制成)有时会闪烁。蛇移动时,不重绘,只有头部的最后位置被尾巴
替换,蛇末端的尾巴项目被空
替换
供您参考,整个项目是,请参阅
对于输入,代码使用了getch()
,我已经检查过这不是问题所在(应该不是,stdscr
在init时刷新,并且再也没有接触过),只在字段窗口上使用wgetch()
,结果相同
此外,它在良好的旧xterm
和windows控制台中使用pdcurses工作良好(无闪烁)。它在rxvt
iff中运行良好。我将上面代码段中的ACS\u电路板
替换为一些“普通”字符
所以,现在我想知道:我是否在rxvt
中遇到了错误/缺点?ACS.*
字符有什么特别的地方会导致终端闪烁吗?我的方法有什么问题吗?告诉我,您的程序几乎都是从stdscr执行的,但几乎所有的操作都是针对创建的第二个窗口执行的(看起来第一个窗口只是一个状态行)
ncurses的跟踪功能通常位于调试库中;我为自己编译的副本已正常编译。Hi@Thomas,非常感谢您的输入!这看起来是一个有趣的调试功能。不幸的是,我已经尝试了只在第二个窗口(代码中的命名字段)上执行
wgetch()
的版本,并且rxvt
中的结果是相同的。。。所以我直接将这个变更集删除为/dev/null。。。如果它有助于调试,我可以重新创建它,但我不认为这是这里的问题。尽管如此,对于一些我不知道的调试工具,+1,谢谢!