2009-03-27 6 views
0

저는 게임을 쓰고 있습니다. 간단한 텍스트 입력을 위해 콘솔이 필요합니다. 파일 이름과 간단한 값. 다음, 결과 콘솔이 활성화되고 마지막 이벤트가 키 누르기 인 경우,간단한 크로스 플랫폼 C++ GUI 콘솔 - 방법?

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

이이 응용 프로그램의 메인 이벤트 루프에서 호출 할 것이다 : 그것은 간단한의에서 SDL을 사용

, 내 콘솔은 다음과 같습니다 는 입력이 필요한 상태에서 처리됩니다.

당연히, 그것은 매우 어색해 보입니다 ... 내 게임의 윈도우에서 쉽게 렌더링 할 수있는 간단한 콘솔을 구현하는 더 좋은 방법은 무엇입니까? (std :: cout을 재 라우팅하거나 코드를 작성하여 UNIX 콘솔 등을 불러오는 것과 같이 매우 이포 할 수없는 솔루션에 가까이 가지 말것)

답변

3

이 경우 스위치 대신 if 문을 사용하는 것이 좋습니다. :

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

난 당신이 몇 가지 자유를 가지고 가고 당신이 그 키를 원하지 않는 경우 등 앰퍼샌드, 따옴표, 괄호, 괄호 등 위의 코드에서하지 않은 일부 문자를 포함 if 문을 몇 개 추가하여 좀 더 자세히 설명 할 수 있습니다.

이것은 키의 열거 형이 많이 변경되지 않는다고 가정합니다. 그것이 많이 바뀌면 당신이 가진 것과 함께 더 나을 수도 있습니다.

관련 문제