e215158662ed5306bbeaac213bbddce4e6e9b746.svn-base (3867B)
1 #include "Dialogue.h" 2 3 Dialogue::Dialogue(SDL_Rect pos, SDL_Renderer* ren, char* font, char* text_box, SDL_Color fore, EventReceiver* player) : Widget(ren, pos), mText_Color(fore) 4 { 5 mPlayer = player; 6 7 mDisplay = false; //In the case of the Dialogue widget mDisplay also tells if a dialogue is open. 8 mFont = LoadFont(font, 20); 9 10 mLines_To_Print.reserve(2); 11 12 mText_box.img = SDL_CreateTextureFromSurface(ren, LoadSurfaceBMP(text_box)); 13 SDL_QueryTexture(mText_box.img, NULL, NULL, &mPos.w, &mPos.h); 14 mText_box.pos = mPos; 15 16 //TextWrap(390, "These Are Some Words. Here have a few more. Just Can't get enough little wordlings, seriously."); 17 18 mline1 = 0; 19 mline2 = 1; 20 } 21 22 bool Dialogue::TextWrap(int text_pix_max, char* str) 23 { 24 int text_pix = -1; 25 26 int size = strlen(str); 27 char* text = (char*)malloc(size + 1); 28 strcpy(text, str); 29 text[size] = '\0'; 30 31 char* line = (char*)malloc(size + 1); 32 memset(line, 0, sizeof(line)); 33 char* last_fit = (char*)malloc(size + 1); 34 memset(last_fit, NULL, sizeof(last_fit)); 35 36 char* tok; 37 tok = strtok(text, " "); 38 while (tok != NULL) 39 { 40 strcat(line, tok); 41 42 int h; 43 TTF_SizeText(mFont, line, &text_pix, &h); 44 if (text_pix >= text_pix_max) 45 { 46 if (last_fit == NULL) 47 { 48 return false; 49 } 50 51 DialogueLine* dline = new DialogueLine; 52 SDL_Surface* sur = TTF_RenderText_Blended(mFont, last_fit, mText_Color); 53 dline->LineTex = SDL_CreateTextureFromSurface(mren, sur); 54 SDL_FreeSurface(sur); 55 mLines_To_Print.push_back(dline); 56 57 memset(line, 0, sizeof(line)); 58 strcat(line, tok); 59 strcat(line, " "); 60 } 61 else 62 { 63 strcpy(last_fit, line); 64 strcat(line, " "); 65 } 66 tok = strtok(NULL, " "); 67 } 68 69 DialogueLine* dline = new DialogueLine; 70 SDL_Surface* sur = TTF_RenderText_Blended(mFont, last_fit, mText_Color); 71 dline->LineTex = SDL_CreateTextureFromSurface(mren, sur); 72 SDL_FreeSurface(sur); 73 mLines_To_Print.push_back(dline); 74 75 if (IsEven((int)mLines_To_Print.size()) == false) 76 { 77 DialogueLine* blank = new DialogueLine; 78 blank->Displayed = false; 79 SDL_Surface* blank_sur = TTF_RenderText_Blended(mFont, " ", mText_Color); 80 blank->LineTex = SDL_CreateTextureFromSurface(mren, blank_sur); 81 SDL_FreeSurface(blank_sur); 82 mLines_To_Print.push_back(blank); 83 } 84 return true; 85 } 86 87 bool Dialogue::DialoguePrint() 88 { 89 int j = 0; 90 for (int i = 0; i < (int)mLines_To_Print.size(); i++) 91 { 92 if (mLines_To_Print.at(i)->Displayed == true) 93 { 94 SDL_Texture* tex = mLines_To_Print.at(i)->LineTex; 95 SDL_Rect dst = mText_box.pos; 96 SDL_QueryTexture(tex, NULL, NULL, &dst.w, &dst.h); 97 98 dst.x = mText_box.pos.x + 5; 99 dst.y = mText_box.pos.y + 4 + (dst.h * j); 100 101 SDL_RenderCopy(mren, tex, NULL, &dst); 102 j++; 103 } 104 } 105 // mLines_To_Print.clear(); 106 return false; 107 } 108 109 void Dialogue::CloseDialogue() 110 { 111 mPlayer->EventProcess(Event(TERMINATE_DIALOGUE)); 112 mDisplay = false; 113 mLines_To_Print.clear(); 114 115 mline1 = 0; 116 mline2 = 1; 117 } 118 119 bool Dialogue::EventProcess(Event eve) 120 { 121 switch (*eve.GetEventType()) 122 { 123 case DIALOGUE: 124 if (mDisplay == false) 125 { 126 mDisplay = true; 127 TextWrap(390, eve.GetEventData()->dd.str); 128 } 129 break; 130 case SCROLL: 131 if ((int)mLines_To_Print.size() > (mline2 + 1)) 132 { 133 mline1+=2; 134 mline2+=2; 135 } 136 else 137 { 138 CloseDialogue(); 139 } 140 break; 141 case TERMINATE_DIALOGUE: //Called to terminate dialogue early 142 CloseDialogue(); 143 break; 144 default: 145 gCons->ConsPrintf("Unrecognized event sent to dialogue system\n"); 146 } 147 return true; 148 } 149 150 bool Dialogue::WidgetUpdate() 151 { 152 for (int i = 0; i < (int)mLines_To_Print.size(); i++) 153 { 154 mLines_To_Print.at(i)->Displayed = false; 155 } 156 if ((int)mLines_To_Print.size() > 0) 157 { 158 mLines_To_Print.at(mline1)->Displayed = true; 159 mLines_To_Print.at(mline2)->Displayed = true; 160 } 161 162 return true; 163 } 164 165 bool Dialogue::WidgetDraw() 166 { 167 if (mDisplay == true) 168 { 169 SDL_RenderCopy(mren, mText_box.img, NULL, &mText_box.pos); 170 171 DialoguePrint(); 172 } 173 return true; 174 }