Pregunta

Estoy escribiendo un juego y estoy enrollado en la necesidad de una consola para la entrada de texto simple; los nombres de archivo y los valores simples.

El uso de SDL, mi consola se ve lo siguiente en él es el más simple:

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

Esto sería llamado de bucle de eventos principal de la aplicación, si la consola está activo y el último evento fue una pulsación de tecla, entonces el resultado de la entrada es procesado en un estado en el que es necesario.

Por supuesto, se ve muy incómoda ... ¿Cuál es una mejor manera de poner en práctica una consola simple que puede ser fácilmente generado en la ventana de mi juego? (No va a ninguna parte cerca de soluciones altamente no portables como tener que desviar std :: cout o escribir código para que aparezca una consola UNIX, etc.)

¿Fue útil?

Solución

Una sugerencia que iba a ofrecer es el uso de sentencias if en lugar de un interruptor en este caso:

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

Me tomó algunas libertades e incluyó algunos caracteres que usted no tiene en su código de seguridad, como el símbolo de unión, citas, paréntesis, corchetes, etc. Si no desea que esas llaves, se puede añadir un poco más if para descomponerlo un poco más.

Esto supone que la enumeración de las teclas no cambia mucho. Si lo hace cambiar muchas cosas que usted puede ser mejor con lo que tenía.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top