2009-03-27 13 views
0

Ich schreibe ein Spiel und ich brauche eine Konsole für einfache Texteingabe; Dateinamen und einfache Werte.einfache plattformübergreifende C++ - GUI-Konsole - wie?

Mit SDL, meine Konsole sieht Folgendes an es am einfachsten ist:

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

Dies würde von der Anwendung des Hauptereignisschleife aufgerufen werden, wenn die Konsole aktiv ist und das letzte Ereignis war ein keypress, dann ist das Ergebnis der Eingang wird in einem Zustand verarbeitet, in dem es notwendig ist.

Natürlich sieht es unglaublich peinlich aus ... Was ist eine bessere Möglichkeit, eine einfache Konsole zu implementieren, die einfach in meinem Spielfenster gerendert werden kann? (Nicht in die Nähe von sehr unportablen Lösungen wie Umleitung von std :: cout oder Schreiben von Code, um eine UNIX-Konsole usw. zu bringen)

Antwort

3

Ein Vorschlag, den ich anbieten würde, ist, in diesem Fall if Anweisungen anstelle eines Schalters zu verwenden :

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

nahm ich einige Freiheiten und einige Zeichen enthalten, die Sie nicht oben in Ihrem Code hatte, wie die Ampersand, Zitate, Klammern, Klammern, usw. Wenn Sie nicht diese Schlüssel möchten, können Sie kann ein paar mehr hinzufügen, wenn Sie etwas mehr brechen.

Dies setzt voraus, dass sich die Aufzählung für die Schlüssel nicht viel ändert. Wenn es viel ändert, sind Sie vielleicht besser dran mit dem, was Sie hatten.

Verwandte Themen