простая кроссплатформенная консоль c ++ GUI - как? - PullRequest
0 голосов
/ 27 марта 2009

Я пишу игру и мне нужна консоль для простого ввода текста; имена файлов и простые значения.

Используя 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 и т. Д.)

1 Ответ

3 голосов
/ 27 марта 2009

Одно из предложений, которое я бы предложил, - это использовать операторы вместо переключателя в этом случае:

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;
}

Я взял некоторые вольности и включил в свой код некоторые символы, которых у вас не было, например, амперсанд, кавычки, скобки, скобки и т. Д. Если вам не нужны эти клавиши, вы можете добавить еще несколько Если заявления, чтобы разбить его немного больше.

Предполагается, что перечисление для ключей не сильно меняется. Если это сильно изменится, вам может быть лучше с тем, что у вас было.

...