простая кроссплатформенная консоль с графическим интерфейсом C++ — как это сделать?
-
22-08-2019 - |
Вопрос
Я пишу игру, и мне нужна консоль для простого ввода текста;имена файлов и простые значения.
Используя SDL, моя консоль выглядит в простейшем виде следующим образом:
class Console
{
public:
typedef std::list<String> InputList;
enum Result
{
NOTHING = 0,
ENTERED,
ESCAPED
};
static const String& GetInput() { return input; }
static Result Query(SDLKey lastKey)
{
if(lastResult == ENTERED || lastResult == ESCAPED)
{
input.clear();
}
switch (lastKey)
{
case SDLK_a:
case SDLK_b:
case SDLK_c:
case SDLK_d:
case SDLK_e:
case SDLK_f:
case SDLK_g:
case SDLK_h:
case SDLK_i:
case SDLK_j:
case SDLK_k:
case SDLK_l:
case SDLK_m:
case SDLK_n:
case SDLK_o:
case SDLK_p:
case SDLK_q:
case SDLK_r:
case SDLK_s:
case SDLK_t:
case SDLK_u:
case SDLK_v:
case SDLK_w:
case SDLK_x:
case SDLK_y:
case SDLK_z:
case SDLK_0:
case SDLK_1:
case SDLK_2:
case SDLK_3:
case SDLK_4:
case SDLK_5:
case SDLK_6:
case SDLK_7:
case SDLK_8:
case SDLK_9:
case SDLK_SLASH:
case SDLK_BACKSLASH:
case SDLK_PERIOD:
case SDLK_COMMA:
case SDLK_SPACE:
case SDLK_UNDERSCORE:
case SDLK_MINUS:
input += static_cast<char> (lastKey);
lastResult = NOTHING;
break;
case SDLK_RETURN:
lastResult = ENTERED;
break;
case SDLK_ESCAPE:
lastResult = ESCAPED;
break;
}
return lastResult;
}
protected:
static Result lastResult;
static String input;
};
Это будет вызываться из основного цикла событий приложения. Если консоль активна и последним событием было нажатие клавиши, то результат ввода обрабатывается в состоянии, когда это необходимо.
Конечно, это выглядит невероятно неловко...Какой лучший способ реализовать простую консоль, которую можно легко отобразить в окне игры?(Не приближайтесь к крайне непереносимым решениям, таким как необходимость перенаправления std::cout или написания кода для вызова консоли UNIX и т. д.)
Решение
Я бы предложил использовать в этом случае операторы if вместо переключателя:
if(lastKey == SDLK_RETURN)
lastResult = ENTERED;
else if(lastKey == SDLK_ESCAPE)
lastResult = ESCAPED;
else if(lastKey >= SDLK_SPACE && lastKey <= SDLK_z)
{
input += static_cast<char> (lastKey);
lastResult = NOTHING;
}
Я позволил себе некоторую вольность и включил некоторые символы, которых не было в приведенном выше коде, например амперсанд, кавычки, круглые скобки, квадратные скобки и т. д.Если вам не нужны эти ключи, вы можете добавить еще несколько операторов if, чтобы еще больше разбить его.
Это предполагает, что перечисление ключей не сильно изменится.Если что-то изменится, возможно, вам будет лучше с тем, что у вас было.