semplice console GUI cross-platform C ++ - come?
-
22-08-2019 - |
Domanda
Sto scrivendo un gioco e io sono liquidata in bisogno di una console per la semplice immissione di testo; nomi e valori semplici.
Utilizzando SDL, la mia console sembra la seguente al suo semplice:
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;
};
Questo sarebbe chiamato dal ciclo principale dell'applicazione, se la console è attiva e l'ultimo evento era pressione di un tasto, allora il risultato dell'ingresso viene elaborata in uno stato in cui è necessario.
Naturalmente, sembra incredibilmente imbarazzante ... Che cosa è un modo migliore per implementare un semplice console che può essere facilmente reso in finestra del mio gioco? (Non andare da nessuna parte vicino a soluzioni altamente portabili come dover reindirizzare std :: cout o la scrittura di codice per aprire una console di UNIX, ecc.)
Soluzione
Un suggerimento vorrei offrire è quello di utilizzare le dichiarazioni se al posto di un interruttore, in questo 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;
}
Ho preso alcune libertà e incluso alcuni personaggi che non avete avete nel vostro codice di cui sopra, come ad esempio la e commerciale, citazioni, parentesi tonde, quadre, ecc Se non si desidera che queste chiavi, è possibile aggiungere un paio di più se le dichiarazioni di rompere giù un po 'di più.
Questo presuppone che l'enum per le chiavi non cambia molto. Se lo fa cambiare un sacco si potrebbe essere meglio con quello che avevi.