LINUX.ORG.RU

Некорректно выводятся символы с атрибутами (ncurses)


0

1

Здравствуйте. Писал с ncurses «морской бой», появилась небольшая проблема. Для нормального отображения символов на экране мне потребовалось использовать атрибуты символов ncurses, но выводить каждый символ, используя различные атрибуты, у меня не вышло. Хотя я могу применить их через attr_on.

...
chtype CellStatus(int );
start_color();
init_pair(1, COLOR_RED, COLOR_BLACK);
...
printw("%c ",CellStatus(Field[x][currRow][0]));
...
//Так как может быть всего 4 состояния корабля, то я обошелся switch:
chtype CellStatus (int cell)
{
	chtype symbol;
	switch (cell)
		{
		case (-1):
			symbol = 'X';
			break;
		case (0):
			symbol = '0';
			break;
		case (1):
			symbol = '#' | COLOR_PAIR(1);
			break;
		case (2):
			symbol = '-';
			break;
		default:
			printw ("Incorrect state!");
			break;
		}
	return symbol;
}

На выходе я получаю символ без каких-либо атрибутов. А если сделать так:

...
attron(COLOR_PAIR(1));
printw("%c ",CellStatus(Field[x][currRow][0]));
attroff(COLOR_PAIR(1));
...

В этом случае символ выводится с нужным мне атрибутом, но в цикле весь блок текста с ним выводится, а я пытаюсь это сделать лишь для некоторых символов.

Ответ на: addch/mvaddch от schizoid

Я это читал и знаю, но хочу сохранить читабельность. Что-нибудь по теме посоветуете?

ms-dos32
() автор топика
Ответ на: комментарий от ms-dos32

Ты пытаешься выводить int (chtype) как char (%c).

enum { MAX_CELLSTATE = 4 };
const chtype CELLSTATE[MAX_CELLSTATE] = {'X', '0', '#' | COLOR_PAIR(1), '-'};
...

unsigned cell = Field[x][currRow][0]
assert(cell < MAX_CELLSTATE); // Можно и нужно обойтись без этого здесь.
mvaddch(currRow, x, CELLSTATE[cell]);
schizoid ★★★
()
Ответ на: комментарий от schizoid

Мне тогда пробелы придется отдельно вставлять между символами? Я их ставлю для нормального вида поля

ms-dos32
() автор топика
Ответ на: комментарий от ms-dos32

То есть, при работе в цикле mvaddch будет перескакивать через символ, я правильно понял?

Да. Будет вывод на каждую вторую позицию (т.е. чётные с пропуском нечётных). Если x*3, то каждую третью и т.д.

schizoid ★★★
()
Ответ на: комментарий от schizoid

Спасибо, сам, может быть, и не додумался бы.

ms-dos32
() автор топика
Ответ на: комментарий от schizoid

Пока что оставлю просто addch, так как необходимо устанавливать курсор в захардкоженную позицию. Но теперь chtype выводится правильно.

ms-dos32
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.