sencilla consola de GUI multiplataforma C ++ - cómo?
-
22-08-2019 - |
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.)
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.