Цвет текста
| |
Deswing | Дата: Суббота, 18 Мая 2013, 13:42 | Сообщение # 1 |
заслуженный участник
Сейчас нет на сайте
| Как писать цветным текстом? Имеется ввиду НЕ ВЕСЬ ТЕКСТ, а определенный. Пишу консольную игру, очень понадобилось: Код #include <iostream> #include <conio.h> #include <Windows.h> #include <ctime> using namespace std;
bool player_turn = true; int m_x = 79, m_y = 23; char map[79][23]; char key; bool bomb = true;
class Player { public: int x; int y; Player() { //rand()%(RAND_MAX - RAND_MIN - 1) + RAND_MIN// srand(time(NULL)); x = rand()%(m_x - 1); y = rand()%(m_x - 1); map[x][y] = 'P'; } ~Player() { map[x][y] = '\0'; } void Move_Up() { map[x][y] = '\0'; y--; map[x][y] = 'P'; } void Move_Down() { map[x][y] = '\0'; y++; map[x][y] = 'P'; } void Move_Left() { map[x][y] = '\0'; x--; if(x < 0) { x = 78; } map[x][y] = 'P'; } void Move_Right() { map[x][y] = '\0'; x++; if(x > 78) { x = 0; } map[x][y] = 'P'; } void Left_Wall() { map[x-1][y] = '#'; } void Right_Wall() { map[x+1][y] = '#'; } void Up_Wall() { map[x][y-1] = '#'; } void Down_Wall() { map[x][y+1] = '#'; } };
int main(void) { for(int y = 0; y < m_y; ++y) { for(int x = 0; x < m_x; ++x) { map[x][y] = '\0'; } } Player *p = new Player; while(true) { player_turn = true; system("cls"); for(int y = 0; y < m_y; ++y) { for(int x = 0; x < m_x; ++x) { cout<<map[x][y]; } cout<<'\n'; } cout<<"player("<<p->x<<";"<<p->y<<");"<<'\n'; while(player_turn) { key = getch(); if(key == 75) { if(map[p->x-1][p->y] != '#') { p->Move_Left(); player_turn = false; } } if(key == 77) { if(map[p->x+1][p->y] != '#') { p->Move_Right(); player_turn = false; } } if(key == 80) { if(map[p->x][p->y+1] != '#') { p->Move_Down(); player_turn = false; } } if(key == 72) { if(map[p->x][p->y-1] != '#') { p->Move_Up(); player_turn = false; } } if((key == 'W')||(key == 'w')) { p->Up_Wall(); system("cls"); for(int y = 0; y < m_y; ++y) { for(int x = 0; x < m_x; ++x) { cout<<map[x][y]; } cout<<'\n'; } } if((key == 'S')||(key == 's')) { p->Down_Wall(); system("cls"); for(int y = 0; y < m_y; ++y) { for(int x = 0; x < m_x; ++x) { cout<<map[x][y]; } cout<<'\n'; } } if((key == 'A')||(key == 'a')) { p->Left_Wall(); system("cls"); for(int y = 0; y < m_y; ++y) { for(int x = 0; x < m_x; ++x) { cout<<map[x][y]; } cout<<'\n'; } } if((key == 'D')||(key == 'd')) { p->Right_Wall(); system("cls"); for(int y = 0; y < m_y; ++y) { for(int x = 0; x < m_x; ++x) { cout<<map[x][y]; } cout<<'\n'; } } if(((key == 'B')||(key == 'b'))&&(bomb==true)) { map[p->x-1][p->y] = 'X'; map[p->x+1][p->y] = 'X'; map[p->x][p->y-1] = 'X'; map[p->x][p->y+1] = 'X'; bomb = false; player_turn = false; } } } return 0; } мне нужно игрока перекрасить в синий, стены в красный, а "останки" от стен коричневым Добавлено (18.05.2013, 13:42) --------------------------------------------- и ещё один вопрос: а как убрать "мигание" при каждом ходе? Я понимаю почему оно происходит, но не знаю что делать. Очень напрягает оно глаза
|
|
| |
Apati | Дата: Суббота, 18 Мая 2013, 14:34 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Ищи тут: http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms682010(v=vs.85).aspx
|
|
| |
Deswing | Дата: Суббота, 18 Мая 2013, 15:10 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| Цитата (Apati) Ищи тут: http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms682010(v=vs.85).aspx Пока что ничего конкретно по данной теме не нашёл
|
|
| |
YellowAfterlife | Дата: Воскресенье, 19 Мая 2013, 05:58 | Сообщение # 4 |
Сейчас нет на сайте
| Пример: Код int main(int argc, char* argv[]) { // получаем дескриптор вывода консоли HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); // обычный темный зеленый текст: SetConsoleTextAttribute(hStdOut, FOREGROUND_GREEN); printf("Green\n"); // яркий зеленый текст: SetConsoleTextAttribute(hStdOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY); printf("Bright green\n"); // константы можно совмещать для смешивания цветов: SetConsoleTextAttribute(hStdOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); printf("Yellow\n"); // есть константы и для фонов: SetConsoleTextAttribute(hStdOut, BACKGROUND_BLUE | BACKGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); printf("White on blue"); // если \n записан с фоном, остаток строки будет с // цветом этого фона, что может и не быть желанным SetConsoleTextAttribute(hStdOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); printf("\nNormal.\n"); char s[1]; gets(s); return 0; } Возможно сделаю сегодня более детальную запись на блоге по этому поводу.
Обновлено: и, запись - http://ru.yal.cc/cpp-colored-text-via-winapi/
Сообщение отредактировал YellowAfterlife - Воскресенье, 19 Мая 2013, 23:18 |
|
| |
Deswing | Дата: Воскресенье, 19 Мая 2013, 15:02 | Сообщение # 5 |
заслуженный участник
Сейчас нет на сайте
| А как быть с мерцанием?
|
|
| |
YellowAfterlife | Дата: Воскресенье, 19 Мая 2013, 15:57 | Сообщение # 6 |
Сейчас нет на сайте
| Цитата (Deswing) А как быть с мерцанием? От мерцания можно избавиться лишь если перерисовывать только те ячейки, что изменились с прошлого кадра (например, игрок передвинулся - стираем "Р" из прошлой ячейки на экране и записываем в новую). В этом поможет SetConsoleCursorPosition ~ http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms686025(v=vs.85).aspx (кто-нибудь скажите мне, почему ссылки на MSDN невозможно сделать "кликабельными")
Собственно, обещанная запись о цветах - http://ru.yal.cc/cpp-colored-text-via-winapi/
Сообщение отредактировал YellowAfterlife - Воскресенье, 19 Мая 2013, 23:20 |
|
| |
Apati | Дата: Вторник, 21 Мая 2013, 17:32 | Сообщение # 7 |
заслуженный участник
Сейчас нет на сайте
| От мерцания хорошо спасает функция WriteConsoleOutput. Вот пример: Код #include <iostream> #include <windows.h> #include <math.h>
#define X 80 #define Y 25
char Get(float x, float y, float angle, float scale) { static const char image[27*9] = { 0,0,1,1,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,1,0,1,1,1,1,1,0, 0,1,0,0,1,1,0,0,1,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0,0,0,1, 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,1, 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,1, 1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,1,1,1,1,0, 1,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0, 1,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0, 0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0, 0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0,0,0 };
x-=X/2; y-=Y/2; x/=scale; y/=scale; int x2 = (int)(x*cos(angle) - y*sin(angle)); int y2 = (int)(x*sin(angle) + y*cos(angle)); if (x2>=-14 && x2<27-14 && y2>=-4 && y2<9-4) return image[x2+14+(y2+4)*27]; else return 0; }
int main(int argc, char* argv[]) { HANDLE hStd = GetStdHandle(STD_OUTPUT_HANDLE); SMALL_RECT writeTo = {0,0,X,Y}; COORD srcBufferSize = {X,Y}; COORD srcBufferCoord = {0,0}; CHAR_INFO charArray[X*Y];
for (int i=0; i<X; ++i) for (int j=0; j<Y; ++j) charArray[i+X*j].Char.UnicodeChar = ' '; float scale=1.0f, scale_d=0.03f; float angle=0.0f, angle_d=0.02f; DWORD startTime = GetTickCount(); while(GetTickCount() - startTime < 10000) { for (int i=0; i<X; ++i) for (int j=0; j<Y; ++j) if (Get((float)i,(float)j, angle, scale)) charArray[i+X*j].Attributes = BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_INTENSITY ; else charArray[i+X*j].Attributes = 0;
WriteConsoleOutput(hStd,charArray,srcBufferSize,srcBufferCoord,&writeTo); Sleep(20);
scale+=scale_d; if (scale <= 1.0f || scale > 2.0f) scale_d =- scale_d; angle+=angle_d; if (angle < -1.0f || angle > 1.0f) angle_d =- angle_d; } return 0; }
|
|
| |
|