-1

curses インターフェイス (これまで使用したことがありませんでした) に慣れたかったので、先週末、ちょっとしたスネークゲームを書きました。1 行のステータス 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()

また、 pdcursesxtermを使用して、古き良き Windows コンソールで(ちらつきのない)正常に動作します。上記のスニペットの を「通常の」文字に置き換えれば、問題なく動作します。rxvt ACS_CKBOARD

だから、今私は知りたい: でバグ/欠点に遭遇しましたrxvtか? ACS_*端末がちらつく可能性のある文字に何か特別なことがありますか? 私のアプローチに何か問題がありますか?

4

1 に答える 1