-1

想熟悉一下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

所以,现在我想知道:我是否遇到了错误/缺点rxvtACS_*可能导致终端闪烁的字符有什么特别之处吗?我的方法有什么问题吗?

4

1 回答 1

1

跟踪显示您的程序几乎从 stdscr 执行所有wgetch,但几乎所有refresh都是针对创建的第二个窗口完成的(看起来第一个只是一个状态行)。

ncurses 的跟踪功能通常在调试库中;我为自己编译的副本已正常编译。

于 2015-07-20T22:06:18.100 回答