2009-03-27 4 views
0

J'écris un jeu et j'ai besoin d'une console pour la saisie de texte simple; noms de fichiers et valeurs simples.console GUI simple interface multiplate-forme - comment?

SDL, ma console regarde ce qui suit à c'est plus 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; 
}; 

Ce serait appelé à partir de la boucle principale de l'événement de l'application, si la console est active et le dernier événement a été un keypress, le résultat de l'entrée est traitée dans un état où c'est nécessaire.

Bien sûr, cela semble incroyablement bizarre ... Quelle est la meilleure façon d'implémenter une console simple qui peut être facilement rendue dans la fenêtre de mon jeu? (Ne pas s'approcher des solutions hautement non portables comme devoir rediriger std :: cout ou écrire du code pour faire apparaître une console UNIX, etc.)

Répondre

3

Une suggestion que je vous proposerais est d'utiliser si des instructions au lieu d'un commutateur dans ce cas :

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

j'ai pris quelques libertés et inclus quelques personnages que vous n'avez pas dans votre code ci-dessus, tels que les esperluette, citations, entre parenthèses, crochets, etc. Si vous ne voulez pas ces clés, vous peut ajouter un peu plus si les déclarations pour le décomposer un peu plus.

Ceci suppose que l'énumération des clés ne change pas beaucoup. Si cela change beaucoup, vous serez peut-être mieux avec ce que vous avez eu.

Questions connexes