사용자가 입력하는 메시지 (채팅 상자)가 포함될 표면 벡터를 생성하려고합니다. 그러나 벡터에 새 서페이스를 추가하고 표시 할 때마다 다른 서페이스가 서페이스 벡터에 표시됩니다. 나는 이것이 왜 있는지 모른다. 벡터가 .push_Back();
으로 크기가 계속 유지되고 컴퓨터가 다른 서페이스가 이동하기 전에이 작업을 수행하지 않아서 "중간에 들러 붙어"서페이스 대신 표시됩니다. 하지만 그걸 확인했을 때, 전혀 추가하지 않았습니다! 나는 심지어 .reserve(myVect.size() + 1);
을 시험해 보았지만 나에게도 똑같은 문제 만 주었다.SDL_Surface Vectors
이 문제는 handle_input();
과 메시지가 어떻게 표시되는지에 달려 있습니다. 이 문제에 대해서는 웹 어디에서나 찾을 수 없습니다!
ofstream logFile;
SDL_Surface *text = NULL;
void apply_surface (int x, int y, SDL_Surface *source, SDL_Surface *destination, SDL_Rect *clip = NULL) {
SDL_Rect offset;
offset.x = x;
offset.y = y;
SDL_BlitSurface(source, clip, screen, &offset);
}
vector <SDL_Surface*> surface_vect;
bool handle_input() {
if (event.type == SDL_KEYDOWN) {
std::string temp = str;
if (str.length() <= 48) {
logFile << "str's length is <=48.\n";
if (event.key.keysym.unicode == (Uint16) ' ') {
str += (char)event.key.keysym.unicode;
logFile << "Space bar was pressed.\n";
charcount += 1;
}
else if ((event.key.keysym.unicode >= (Uint16)'0') && (event.key.keysym.unicode <= (Uint16) '9')) //Finally works!
{
charcount += 1;
str += (char)event.key.keysym.unicode;
logFile << "Number key: " <<(char)event.key.keysym.unicode << " pressed, and added to str.\n";
}
else if ((event.key.keysym.unicode >= (Uint16)'A')&& (event.key.keysym.unicode <= (Uint16) 'Z'))
{
charcount += 1;
str += (char)event.key.keysym.unicode;
logFile << "Number key: " <<(char)event.key.keysym.unicode << " pressed, and added to str.\n";
}
else if ((event.key.keysym.unicode >= (Uint16)'a')&& (event.key.keysym.unicode <= (Uint16) 'z'))
{
charcount += 1;
str += (char)event.key.keysym.unicode;
logFile << "Number key: " <<(char)event.key.keysym.unicode << " pressed, and added to str.\n";
}
else if ((event.key.keysym.unicode == SDLK_RETURN))
{
str = "";
surface_vect.reserve (surface_vect.size() + 1);
if (surface_vect.size() < surface_vect.capacity()) { //PREVENTS AN ACCESS READING VIOLATION ERROR! THE ELEMENTS IN THE VECTOR WERE BECOMING TOO LARGE FOR THE VECTOR!!
surf_count += 1;
surface_vect.push_back (text);
logFile << "surface_vect has: " << surf_count << " surfaces!";
}
}
if (event.key.keysym.unicode == SDLK_BACKSPACE && str.length() != 0) {
charcount -= 1;
str.erase(str.length() - 1);
logFile << "Backspace was pressed.\n";
}
if (str != temp) {
SDL_FreeSurface (text); //This frees up the text surface whenever the str changes.
text = TTF_RenderText_Solid(font, str.c_str(), textcolor); //Renders the text whenever that change occurs.
logFile << "Full text rendered: " << str.c_str() << " Number of surfaces in existence: " << c << " Number of characters in current surface: " << charcount << "\n";
}
//OK SO: the program separates the surfaces! Now to just make each surface different for each different message! To do this, we will put the "text" surface into the top of surface_vect, because that vector will be our messages body. Text will display all messages being typed, only when return is pressed is it added to the message surfaces body!
}
}
return true;
}
int main (int argc, char* args[])
{
time(¤tTime);
int count = 0;
text = TTF_RenderText_Solid(font, "First surface message!", textcolor);
surface_vect.push_back(text);
Timer myTime;
Timer fps;
if (init() == false) {
return false;
}
logFile << "Everything initialized fine. \n" ;
if (load_files() == false) {
return false;
}
logFile << "All files loaded successfully.\n";
myTime.start(); //The time the loop started. Keeps track of the time.
while (quit == false)
{
fps.start(); //Frame timer.
std::stringstream time; //Something to convert the time into a string, along with a message.
while (SDL_PollEvent(&event)) {
count += 1;
if (handle_input() == false) {
logFile << "Handle_input() returned false on the: " << count << "th run through the while loop!";
return false;
}
if (event.type == SDL_QUIT) {
fps.stop();
myTime.stop();
quit = true; //Duh.
}
}
apply_surface(0,0, background, screen);
apply_surface (25, 435, text, screen); //Render the text surface because its separate from the other surfaces! It needs its own render command.
for (int c = 0; c <= surface_vect.size() - 1; c+=1) {
apply_surface(25, newY - (13 * c), surface_vect.at(c), screen);
}
if (SDL_Flip (screen) == - 1) {
return false;
}
frame += 1; //Frame counter. Used to
if(fps.get_ticks() < 1000/FRAMES_PER_SECOND)
{
SDL_Delay((1000/FRAMES_PER_SECOND) - fps.get_ticks());
}
}
clean_up();
return 0;
}
이 작업을 수행 할 수있는 더 나은 방법이 있나요 :
여기 내 소스입니까? 사용자 텍스트를 가져 와서 서페이스의 벡터에 넣고 위에 표시해야합니다.