简单的跨平台c ++ GUI控制台 - 如何?

时间:2009-03-27 14:23:32

标签: c++ user-interface console cross-platform sdl

我正在写一个游戏,我需要一个简单的文本输入控制台;文件名和简单值。

使用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 个答案:

答案 0 :(得分:3)

我提供的一个建议是在这种情况下使用if语句而不是switch:

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语句将其分解一点。

这假设键的枚举不会发生很大变化。如果它确实发生了很大变化,那么你可能会对自己拥有的东西感觉更好。