2014-04-18 3 views
2

문자열을 서식 지정하는 데 사용할 수있는 문자열 및 벡터 벡터를 허용하는 도우미 함수가 있는데 바로 지금 내 솔루션은 수동으로 색상 벡터의 크기를 확인하고 같은 양의 색상으로 콘솔 인쇄를 호출하는 것입니다. . ,Libtcod를 사용하여, 어떻게 콘솔에서 -> 동적 인 색상의 문자열을 출력합니까?

void helper_func(TCODConsole* con, std::string msg_str, std::vector<TCOD_colctrl_t> color_vector) 
{ 
    char* message = msg_str.c_str(); 
    //this is repeated 1 through 16, adding another color_vector.at(n) for each. 
    ... 
    else if (color_vector.size() == 2) 
    //message might be "%cHello%c was in red" 
    console->print(x, y, message, color_vector.at(0), color_vector.at(1)) 
    ... 
    else if (color_vector.size() == 4) 
    //message might be "%cThe octopus%c shimmers at %cnight%c" 
    console->print(x, y, message, color_vector.at(0), color_vector.at(1), color_vector.at(2), color_vector.at(3)) 
    ... 
} 

이 작동하지만, 그것은 끔찍한 내가 그것을 당기의 다른 방법으로보고 있었다 :

코드에서 같은 일을 할 거라고, 나는 4 색 벡터를 가지고 말 16 색 이상을 허용합니다.

벡터의 각 색상에 대해 sprintf을 시도하고 out_string에 추가 한 다음 반복합니다. 나는 ostringstream과 같은 일을 시도했습니다. "%c"에 msg_str을 분할 한 다음 각각에 색상을 추가하면 결과 문자열에 합류하려고했습니다. 처음 색을 사용한 다음 그 색 대신 무작위 문자를 사용하여 항상 효과적이었습니다.

단순히 sprintf(out_char, format_msg, TCOD_COLCTRL_1)이 (console->print(out_char)을 사용하여) 콘솔에 인쇄하기 때문에 위의 작업이 효과가 있기를 기대했습니다.

내 질문은 : 콘솔 -> 인쇄 기능에 다양한 수의 색상을 전달하고 코드 중복을 심각하게하지 않고 색상을 정확하게 표시하는 좋은 방법이 있습니까?


대체로서, 나는 그것의 크기를 계산, 최초의 컬러까지 문자열의 섹션을 인쇄 할 수있는 그만큼 이상 x를 이동하고 다음 섹션을 인쇄,하지만 그 이상이 아니다.

나는이 질문이 일반 문자 printf에 대해 같은 것을 묻는 것으로 일반화 될 수 있다고 생각한다.

+0

나는 찾고있는 제목이 "벡터를 사용하여 가변 인자 함수를 호출하는 방법"과 유사하다고 생각합니다. – user2864740

+0

예 : ref http://stackoverflow.com/questions/21330153/c-vector-wrapper-around-variadic-function, http://stackoverflow.com/questions/17974209/c11-calling-a-variadic-function-with-the -elements-of-a-vector, http://stackoverflow.com/questions/9276902/passing-stdvectorint-items-to-variadic-function – user2864740

+0

감사합니다. 그 개념과 일치하는 몇 가지 다른 질문이있는 것 같습니다. 내가 한번 볼게. – TankorSmash

답변

2

variadic 함수 대신 "% c"에 msg_str을 구문 분석하고 color_vector에 따라 문자열의 각 세그먼트를 올바른 색상으로 반복적으로 인쇄 할 수 있습니다. 이 코드가 컴파일 될지 잘 모르겠습니다. 메모장에서 작성 했으므로 작업이 필요할 수도 있습니다. 바라건대 당신이 내가 제안하고있는 것의 요지를 얻을 수 있기를 바랍니다.

void helper_func(TCODConsole* con, std::string msg_str, std::vector<TCOD_colctrl_t> color_vector) 
{ 
    std::string str2; 
    std::size_t pos; 
    std::size_t pos2; 

    pos = msg_str.find("%c"); 
    if (pos != std::string::npos) 
     str2 = msg_str.substr(0,pos); 
    else 
     str2 = msg_str; 
    console->print(x, y, str2.c_str()); 
    int n = 0; 
    while (pos != std::string::npos) { 
     pos2 = msg_str.find("%c",pos+1); 
     if (pos2 != std::string::npos) 
      str2 = msg_str.substr(pos+2,pos2); 
     else 
      str2 = msg_str.substr(pos2+2,msg_str.length()-pos2+2); 
     console->print(x, y, str2.c_str(),color_vector.at(n)); 
     pos = pos2; 
     n++; 
    } 
} 

제 코드에는 문제가 있습니다. 두 번째 print 문의 x 값은 xpos2의 함수로 변경되기 때문에 while 루프를 통해 매번 계산해야합니다. 그렇지 않으면 모든 것이 동일한 위치에 인쇄됩니다. :) 쉬운 변화가되어야합니다 ...