Options.input_nonblocking выставил? Ато может получиться схематично:warchief писал(а):2) У меня такой ввод
Код: Выделить всё
do
блокирующее чтение
while (неблокирующая проверка наличия)
Модератор: Apromix
Options.input_nonblocking выставил? Ато может получиться схематично:warchief писал(а):2) У меня такой ввод
Код: Выделить всё
do
блокирующее чтение
while (неблокирующая проверка наличия)
Боюсь чтение текста так не работает. Даже для простой латиницы 'a' -- это одна клавиша (и одно событие ввода), а вот 'A' -- уже две. Для того, чтобы набрать á на немецкой клавиатуре, надо отдельно сначала нажать т. н. мертвую клавишу [´], затем a. Причем это не единственный способ составлять символы, но главное что комбинации совершенно разнообразные. Если этого мало, есть и восточные языки (поддержки которых в терминале пока нет, но не будем дискриминировать).warchief писал(а):1) как узнать, какая клавиша была отжата?
3) В этом коде есть момент, через terminal_read_char() я получаю символ нажатой кнопки, а как теперь правильно узнать код этой кнопки? Звать terminal_read()()?
Помимо варианта с проверкой terminal_has_input есть еще неблокирующий ввод:warchief писал(а):Как научить terminal_read_char() не ждать нажатия кнопки? А то из-за нее у меня не получается сделать реалтайм.
Код: Выделить всё
terminal_set("input.nonblocking=true");
В движке буфер даже более чем двойной =) мерцания быть не должно, возможно ты где-то делаешь лишний terminal_refresh?warchief писал(а):Возникла другая проблема - мерцание текста, как лечить, надеюсь в движке есть двойной буфер? Собственно эта проблема у меня была и не в реалтайме.
Ага, мой косяк, я когда делал не реалтаймовое, засунул рефреш там где текст печатал.мерцания быть не должно, возможно ты где-то делаешь лишний terminal_refresh?
Можно примером показать? А то у меня так:Паттерн использования следующий: на каждую операцию ввода вызовом terminal_read_char проверяем наличие текстового символа, если такого нет, читаем привычным terminal_read.
Код: Выделить всё
while (terminal_has_input())
{
int key = terminal_read_char();
wchar wc = L' ';
if (key == TK_INPUT_CALL_AGAIN)
{
key = terminal_read();
if (key == TK_CLOSE)
return false;
}
else if (key > 0)
{
wc = key;
}
// нажатие кнопки
for (auto it = m_inputlistener.begin(); it != m_inputlistener.end(); ++it)
{
if ((*it)->KeyPressed(KeyEvent(wc, key)) == true)
break;
}
}
Код: Выделить всё
bool HeroCreateModule::KeyPressed(const KeyEvent &arg)
{
if (arg.code == TK_R)
newgentate = true;
return false;
}
А то сейчас terminal_read_char() возвращает для большой буквы один код, для маленькой другой, в другой раскладке третий - и как вообще тогда делать? Зафигачить везде terminal_read? А если мне надо чтобы игрок что-то вводил на экран на родном русском языке? делать отдельный костыль?int key = terminal_read(); // Получаем код нажатой кнопки, при этом пофиг какая раскладка, и какие вспомогательные клавиши нажаты
wchar_t с = terminal_getkey(key);// по полученному коду получаем символ
Не вижу ничего плохого. Думаю для разных ситуаций будет весьма разный код. terminal_read_char -- это достаточно узкоспециализированная штука для конкретного применения.warchief писал(а):Можно примером показать? А то у меня так:
warchief писал(а):Событие возникает только тогда, когда я ввожу 'R' зажимая шифт или с влкюченным капслоком. То есть проверка успешна только когда я ввожу большую букву R. А мне надо чтобы и с маленькой работало, а то бред получается:) И здесь конечно же мне надо знать именно код
warchief писал(а):Вообщем тестовым путем выяснил что мой код при нажатии маленькой 'r' возвращает код 114, а при нажатии большой - 82.
Нажатие определенной клавиши и ввод некоторого символа -- это две большие разницы. Давайте определимся:warchief писал(а):А то сейчас terminal_read_char() возвращает для большой буквы один код, для маленькой другой, в другой раскладке третий - и как вообще тогда делать? Зафигачить везде terminal_read? А если мне надо чтобы игрок что-то вводил на экран на родном русском языке? делать отдельный костыль?
Ты не понял. Я нажал кнопку, и хочу получить с нее И КОД И СИМВОЛ одновременно.warchief жжот.
read_char возвращает введённый символ, а не кнопку. Если тебе нужно получить нажатую клавишу, используй terminal_read.
Вполне логично что у большой и маленькой буквы разные коды.
Я хочу отделить терминал от логики игры. У меня есть функция OnKeyDown(), и теперь мне придется еще писать OnChar()? Вообще опять костыли. Проблема в том, что я не жду факта нажатия клавиши, я проверяю текущее нажатие. Поэтому сложно - игрок нажал клавишу, а как понять коду что сейчас надо - символ или код? Придется где-то писать отдельный стейт, в котором сообщать что вот сейчас игрок будет писать текст, а вот сейчас он играет - кривоСамым простым выходом из ситуации, когда надо, чтобы игрок что-то вводил на родном русском, будет просто разделить ввод на:
На WinAPI:Задача проверить, является ли один символ строчной версией другого, нетривиальна и универсального решения не имеет
Код: Выделить всё
eKeyCodes KeyIndex;
wchar_t buffer[1];
BYTE lpKeyState[256];
KeyIndex = static_cast<eKeyCodes>(wParam);
GetKeyboardState(lpKeyState);
ToUnicode(wParam, HIWORD(lParam)&0xFF, lpKeyState, buffer, 1, 0);
Код: Выделить всё
for (auto it = m_inputlistener.begin(); it != m_inputlistener.end(); ++it)
{
if ((*it)->KeyPressed(KeyEvent(wc, key)) == true) break;
}
Код: Выделить всё
bool Title::DoInit()
{
m_eng->InitImg(IMAGE_0, "media/menu_title.png", true);
return true;
}
bool Title::DoRun()
{
m_eng->DrawImg(0, 0, IMAGE_0);
return true;
}
void Title::DoClose()
{
m_eng->CloseImg(IMAGE_0);
}
bool Title::KeyPressed(const KeyEvent &arg)
{
// переходим в главное меню
if (arg.code == TK_ESCAPE)
m_mgr->SetActiveModule(MainMenuScene);
return false;
}
warchief писал(а):Я нажал кнопку, и хочу получить с нее И КОД И СИМВОЛ одновременно.
Боюсь тебе в любом случае придется как-то дать коду понять, ввод текста сейчас или иная обработка. Потому что это больно разные ситуации, одни и те же клавиши могут иметь совершенно разное значение. По-моему, если сделать чтение, но не делать обработку прочитанного (так как нет отдельного стейта), а делать обработку уровнем выше, то получится просто лишний враппер из одной очереди ввода в другую. Ок, в следующем сообщении ты приводишь контраргумент.warchief писал(а):Поэтому сложно - игрок нажал клавишу, а как понять коду что сейчас надо - символ или код? Придется где-то писать отдельный стейт, в котором сообщать что вот сейчас игрок будет писать текст, а вот сейчас он играет - криво
Неа, он возвращает по виртуальному коду клавиши (первый аргумент), по ее аппаратному коду (второй) и полному состоянию клавиатуры (третий). И то, это не гарантирует верной трансляции, не зря WM_UNICHAR придумали. Восстановить же символ строго по коду или код строго по символу невозможно. Впрочем, ранее я немного иное имел в виду, не пары код-символ, а пары символ-символ ('a' и 'A' -- это формы одной буквы?).warchief писал(а):Обрати внимание, ToUnicode() как раз возвращает символ по коду нажатой клавиши, о чем я выше и писал, как я хотел бы это видеть
Навскидку (я не утверждаю, что это лучшее решение) должного эффекта возможно добиться переделав функцию terminal_read_char в terminal_peek_char, которая возвращает символ не вычитывая его клавишу из очереди. Ну или не возвращает, если нет символа:warchief писал(а):получить с нее И КОД И СИМВОЛ одновременно
Код: Выделить всё
while (terminal_has_input())
{
wchar_t symbol = terminal_peek_char(); // Unicode или нейтральный 0.
int code = terminal_read();
if (code == TK_CLOSE) std::terminate();
ReportInput(code, symbol);
}
1. Если развернуть экран так, чтобы количество знакомест само пересчитывалось, то все равно придется рассматривать под микроскопом =) Это на самом деле можно сделать, я разве что не очень понимаю что делать с краями экрана, где останется немного пустого места. Сетка ячеек скорее всего ровно все экранное пространство не заполнит.warchief писал(а):Что я еще спрашивал, но не помню, получил ли ответ - масштабирование окна будет делаться? Ну то есть например создаю окно 80х25 и размером шрифта в 10. А у меня экран 1900х1200. Игру придется рассматривать под микроскопом. В идеале хотелось бы две возможности:
1) развернуть окно на весь экран так, чтобы количество символов само пересчитывалось в зависимости от размера
2) увеличивать окно на определенный коэффициент, то есть количество символов остается прежним, а вот размер шрифта увеличивается, понятно что здесь не получится сделать полный экран, но и не надо - будет олдскульный 80х25, но при этом окно будет занимать как можно больше размера (как в старые добрые времена мониторов в 640х480 когда стандартная консоль как раз почти весь экран и занимала). А так как в терминале TTF, то даже качество не пострадает
Конечно это можно сделать в ручную, но хотелось бы автоматики
Код: Выделить всё
terminal_set("font: smth.ttf, size=10x16");
О, а я как раз о таком тоже подумал, то есть сначала опознать символ, но не извлекать его из очереди, а распознать код и с этим извлечь... Так значит можно? Ну вообщем-то тогда тоже приемлемое решениев terminal_peek_char, которая возвращает символ не вычитывая его клавишу из очереди. Ну или не возвращает, если нет символа:
Делать бордюр, я когда-то так делалгде останется немного пустого места.
Их конечно можно увеличить, это просто нужно чтобы занять все окно. dwarf fortress так делает - я увеличиваю окно, игра увеличивает игровую область.1. Если развернуть экран так, чтобы количество знакомест само пересчитывалось, то все равно придется рассматривать под микроскопом =)
/Пристально смотрит/ готовый виджет захотел?warchief писал(а):Вот такую вещь я хочу и у себя
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 19 гостей