TapestryEngine

A 2D Platformer Game Engine
Log | Files | Refs

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 }