0

ゲームを作成していて、単純なテキスト入力用のコンソールが必要になりました。ファイル名と単純な値。

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 コンソールを起動するためのコードの作成など、非常に移植性の低いソリューションには近づかないでください。)

4

1 に答える 1

3

この場合、switch の代わりに 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 ステートメントを追加できますもう少し分解してください。

これは、キーの列挙型があまり変化しないことを前提としています。それが大きく変化する場合は、以前のものでより良くなる可能性があります。

于 2009-03-27T16:33:28.597 に答える