Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2013, 23:11   #1
gtament
Новичок
Джуниор
 
Регистрация: 28.04.2013
Сообщений: 3
Лампочка Пишу текстовую игру на Си

У меня такой вопрос. Как рисовать анимацию и не прохлопать нажатия клавиш? Есть ли Сях какие-то аналоги таймеров и прерываний? Заранее благодарен)
gtament вне форума Ответить с цитированием
Старый 29.04.2013, 02:01   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Нету тама нефига.

Зато есть 100500 всяких разных библиотек, которые реализуют все, что нынче нужно игроделу, в том числе текстовых игр. А так - все ручками.

Так а ты что, текстовую анимацию хочешь сделать?
_Bers вне форума Ответить с цитированием
Старый 29.04.2013, 10:37   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

В Сях нет ни таймеров, ни прерываний. Они есть в какойто определнной операционной системе. Уточните платформу, возможно получите ответ. Если нужно под разные платформы, тогда ищите сторонние библиотеки, которые реализуют нужный функционал под разными платформами.
waleri вне форума Ответить с цитированием
Старый 29.04.2013, 21:50   #4
gtament
Новичок
Джуниор
 
Регистрация: 28.04.2013
Сообщений: 3
По умолчанию

Под Вин пишу) Принял решение присобачить потоки. Теперь такой вопрос: как считать символ из экранного буфера консоли? Гуглил долго и нашел только функцию ReadConsoleOutputCharacter, но там траблы с согласованием Unicode и Ansi. Есть ли способ по-проще? Есть еще идея завести массив чаров размером с буфер консоли и печатать и в массив, и в поток одновременно.
gtament вне форума Ответить с цитированием
Старый 29.04.2013, 23:04   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от gtament Посмотреть сообщение
Под Вин пишу) Принял решение присобачить потоки. Теперь такой вопрос: как считать символ из экранного буфера консоли? Гуглил долго и нашел только функцию ReadConsoleOutputCharacter, но там траблы с согласованием Unicode и Ansi. Есть ли способ по-проще? Есть еще идея завести массив чаров размером с буфер консоли и печатать и в массив, и в поток одновременно.
Примерно как то так:

Код:
typedef KEY_EVENT_RECORD                       SCaptionKey;
typedef std::vector<MOUSE_EVENT_RECORD>        MouseData_t;
typedef std::vector<WINDOW_BUFFER_SIZE_RECORD> WndSizeData_t;
typedef std::vector<SCaptionKey>               KeyData_t;

class CWinInputEvents
{
public:
    CWinInputEvents()
    {
        hStdin = GetStdHandle(STD_INPUT_HANDLE);   
        if (hStdin == INVALID_HANDLE_VALUE) {  /*MyErrorExit("GetStdHandle");*/ }

        // Сохраним текущий режим ввода для будущего восстановления при выходе из программы.
        if (! GetConsoleMode(hStdin, &fdwSaveOldMode) ) {  /*MyErrorExit("GetConsoleMode");*/ } 

        // Включим события ввода от мыши и окна.
        DWORD fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; 
        if (! SetConsoleMode(hStdin, fdwMode) ){/* MyErrorExit("SetConsoleMode");*/ }
    }

    ~CWinInputEvents()
    {
        //вернём все как было.
        BOOL fsuccess= SetConsoleMode(hStdin, fdwSaveOldMode); 
        if( fsuccess==FALSE ) { /*ошибка*/}
    }

    //читает события из буфера ввода
    void GetInputEvents()     
    {
        DWORD cNumRead;
        if(  GetNumberOfConsoleInputEvents(hStdin,&cNumRead) == 0 )  {  /*ошибка*/}
        if(cNumRead==0) { return; }
        

        // Ожидание событий.
        if (!ReadConsoleInput(hStdin, irInBuf, MaxRec, &cNumRead) ) 
        {
            /*MyErrorExit("ReadConsoleInput");*/ 
        } 

        // Направляем события соответствующим обработчикам.
        for (size_t i = 0; i < cNumRead; i++)         
        {
            switch(irInBuf[i].EventType)
            { 
                // ввод с клавиатуры    
                case KEY_EVENT:                
                    {
                        myKeyRec.push_back(irInBuf[i].Event.KeyEvent); 
                        break; 
                    } 
                    
                
                //временно отключенны
                //case MOUSE_EVENT:              { myMouseRec.push_back(irInBuf[i].Event.MouseEvent);                break; } // ввод от мыши    
                //case WINDOW_BUFFER_SIZE_EVENT: { myWindowSizeRec.push_back(irInBuf[i].Event.WindowBufferSizeEvent);break; } // изменение размера экранного буфера   
                default:                       { /*MyErrorExit("unknown event type");*/ break; }
            }
        }
    }

    KeyData_t& GetKeyEvents()            { GetInputEvents(); return myKeyRec;        }
    MouseData_t& GetMouseEvents()        { GetInputEvents(); return myMouseRec;      }
    WndSizeData_t& GetWindowSizeEvents() { GetInputEvents(); return myWindowSizeRec; }

    void Flush_KeyEvents()        { myKeyRec.clear();        }
    void Flush_MouseEvents()      { myMouseRec.clear();      }
    void Flush_WindowSizeEvents() { myWindowSizeRec.clear(); }

private:
    HANDLE hStdin;

    //При каждой попытке чтения из буфера ввода консоли, 
    //хранилища скапливают данные от буфера ввода
    MouseData_t   myMouseRec;      
    WndSizeData_t myWindowSizeRec;
    KeyData_t     myKeyRec;
    
    //старый режим консоли. Нужен для восстановления при уничтожении
    DWORD fdwSaveOldMode;             
    
    //количество записей, которое за раз может быть прочитано из буфера ввода
    static const size_t MaxRec = 128; 
    
    //хранилище событий, приходящих из буфера ввода
    INPUT_RECORD irInBuf[MaxRec];     
};



#endif
Это вырванный из контекста класс. Вообще вот здесь есть все материалы нужные для работы:

http://vsokovikov.narod.ru/New_MSDN_...ole/con_fn.htm
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пишу игру на паскале. Deniska_777 Помощь студентам 3 01.03.2011 19:59
Написать элементарную браузерную текстовую игру Canku Фриланс 1 03.02.2011 15:14
Я написал текстовую игру... saggy Софт 11 05.06.2010 22:32
Пишу 2д игру. Помогите плиз Xzen Gamedev - cоздание игр: Unity, OpenGL, DirectX 95 21.12.2009 12:08