Среда, 21 Апреля 2021, 14:37

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Цвет текста
Цвет текста
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;
}

мне нужно игрока перекрасить в синий, стены в красный, а "останки" от стен коричневым smile

Добавлено (18.05.2013, 13:42)
---------------------------------------------
и ещё один вопрос: а как убрать "мигание" при каждом ходе? Я понимаю почему оно происходит, но не знаю что делать. Очень напрягает оно глаза sad

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;  
}
Форум игроделов » Программирование » C/C++ » Цвет текста
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2021 Рейтинг