c -闪烁ACS_CKBOARD在rxvt中使用ncurs



我想熟悉一下诅咒界面(之前从未使用过),所以上周末我写了一个小的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的跟踪特性通常在调试库中;

相关内容

  • 没有找到相关文章

最新更新