Вопросы о переносе Змейки aka Череп на Linux

Здравствуйте.

Здесь я решил задавать вопросы по реализации змейки от Черепа на Linux, коих, я думаю будет много.

Первый вопрос:

Что делать с :

void CScreen::text_attr(WORD attr) {
    SetConsoleTextAttribute(hConsoleOutput, attr);
}

???

Насколько я понимаю, данная функция может менять два параметра: цвет символа и цвет фона сивола. Но эта функция сугубо виндовая, в результате возникает проблема: как её реализовать так, чтобы остальной код ничего не заметил?

Как я понял, функция используется всего один раз. Может убрать её, и заменить на:

textcolor(GREEN);
textbackground(BLACK);

?

void CScreen::text_attr(WORD attr)

Насколько я понимаю, данная функция может менять два параметра: цвет символа и цвет фона сивола. Но эта функция сугубо виндовая

Понимаешь правильно. Но вот на счёт виндовости — ошибаешься. Функция SetConsoleTextAttribute() — а вот она именно виндовая — специально обёрнута в метод класса, для упрощения портирования.

void CScreen::text_attr(WORD attr) {
    int text_color = attr & 0x0f;       // типы переменных должны соответствовать
    int bg_color = (attr & 0xf0) >> 4;  // типу параметров функций установки цвета
    textcolor(text_color);
    textbackground(bg_color);
}

PS. aka — сокращение от «as known as» — «также известный как». Поэтому название темы выглядит... странно.

В linux используются специальные escape-последовательности для определения цвета.

Пример вывода цветного текста (взял на StackOverflow).

#include <stdio.h>

#define KNRM  "\x1B[0m"
#define KRED  "\x1B[31m"
#define KGRN  "\x1B[32m"
#define KYEL  "\x1B[33m"
#define KBLU  "\x1B[34m"
#define KMAG  "\x1B[35m"
#define KCYN  "\x1B[36m"
#define KWHT  "\x1B[37m"

int main()
{
    printf("%sred\n", KRED);
    printf("%sgreen\n", KGRN);
    printf("%syellow\n", KYEL);
    printf("%sblue\n", KBLU);
    printf("%smagenta\n", KMAG);
    printf("%scyan\n", KCYN);
    printf("%swhite\n", KWHT);
    printf("%snormal\n", KNRM);

    return 0;
}

Можно и через escape-последовательности. Вопрос производительности. Если бы я писал этот модуль под DOS на 286-й машине, я бы писал символы и атрибуты непосредственно в видеопамять.

Кстати, под виндой такой финт тоже возможен. Только для этого в память перед запуском игры надо загружать специального резидента типа ANSIcon. Что совершенно «не ice».

porshe, на сколько я понял, тебе таки удалось портировать «Змейку» на Линукс.

А опубликовать результаты ты забыл? Особо интересует как стал выглядеть класс CScreen.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

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

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.