From edb7ba32c514795680203c7a2e4fb25c34e891be Mon Sep 17 00:00:00 2001 From: Ivan Hernanez Date: Fri, 1 Jun 2012 03:02:57 -0500 Subject: [PATCH] Added Font class and updated other bits to make things work --- ArtAssets/Fonts/text.bmp | Bin 32886 -> 0 bytes ArtAssets/Story/intro.txt | 5 +++++ CMakeLists.txt | 2 +- Game.cpp | 2 +- Level.cpp | 39 +++++++++++++++++++++++++++++++++++++- Level.h | 7 ++++++- Text.cpp | 47 +++++++++++++++++++--------------------------- Text.h | 9 ++++++--- fns.h | 9 +++++++++ game.vcxproj | 2 ++ 10 files changed, 87 insertions(+), 35 deletions(-) delete mode 100644 ArtAssets/Fonts/text.bmp create mode 100644 ArtAssets/Story/intro.txt diff --git a/ArtAssets/Fonts/text.bmp b/ArtAssets/Fonts/text.bmp deleted file mode 100644 index b6c1ec71e83fb3a401c1c5dba329d9c7cfac3782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32886 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 + mFonts.push_back(map()); } -Level::Level(string n, Condition winCond, Behavior loadBehave, Behavior updateBehave, Behavior endBehave) : mName(n), mBackground(NULL), Loaded(false), mTextures(map()), ToAdd(vector()), ToRemove(vector()) +Level::Level(string n, Condition winCond, Behavior loadBehave, Behavior updateBehave, Behavior endBehave) : mName(n), mBackground(NULL), Loaded(false), mTextures(map()), ToAdd(vector()), ToRemove(vector()), mFonts(vector< map >()) { /// Set behavior mLoadBehavior = loadBehave; mUpdateBehavior = updateBehave; mUnloadBehavior = endBehave; mWinCondition = winCond; + mFonts.push_back(map()); + mFonts.push_back(map()); } Level::~Level() @@ -273,3 +277,36 @@ Sprite* Level::findSpriteByName(string name){ } return NULL;//if a sprite wasn't found return null } + +Font* Level::getFont( int s = 24, FontType t = English){ + map font = t == English ? mFonts[0] : mFonts[1]; + map::iterator it = font.find(s); + //if the font doesn't exist + if(it!=font.end()){ + //create it + Font* f = new Font(t,s); + font[s] = f; + return f; + } else{ + Font* f = it->second; + f->count++; + return f; + } +} + +void Level::closeFont( Font* f){ + map font = f->type == English ? mFonts[0] : mFonts[1]; + map::iterator it = font.find(f->size); + + if(it != font.end()){ + //if we're here we have a font + Font* f = it->second; + //decrement the count of texts using the font + f->count--; + //if there are none left + if(f->count==0){ + //delete it + font.erase(it); + } + } +} \ No newline at end of file diff --git a/Level.h b/Level.h index 27cde98..f572473 100644 --- a/Level.h +++ b/Level.h @@ -3,10 +3,12 @@ #include "Sprite.h" #include "Background.h" #include "HUD.h" +#include "Font.h" #include #include #include + using std::vector; using std::string; @@ -52,7 +54,9 @@ public: Background* getBackground(){return mBackground;}/**< gets the current level's name \return Level's Background */ Sprite* findSpriteByName(string name);/**< returns the first Sprite with a given name \param name Name of the sprite to return \return Pointer to the requested sprite */ bool Loaded;/**< Shows if the level has loaded or not (level changing) */ - void Unload();/** What should be done when this level is left (not deleted) */ + void Unload();/**< What should be done when this level is left (not deleted) */ + Font* getFont( int s, FontType t);/**< Grabs the font if it exists and creates it if it does not */ + void closeFont(Font *);/**< Closes the font if not more texts are using it. */ protected://allow inheritance string mName; @@ -64,6 +68,7 @@ protected://allow inheritance map mTextures;/**< Textures that have been loaded by the level. */ vector ToAdd;/**< List of sprites that should be added this game loop */ vector ToRemove;/**< List of sprites that should die after this game loop */ + vector< map > mFonts;/** List of all the fonts we have */ HUD mHUD;/**< Display to draw on everything else */ void DrawIMG();/**< Draws an image to the screen. (Not used) */ void DrawIMG(SDL_Surface *img, int x, int y);/**< Draws the specified image to the screen at location (x,y) */ diff --git a/Text.cpp b/Text.cpp index 6807189..6af939c 100644 --- a/Text.cpp +++ b/Text.cpp @@ -1,25 +1,21 @@ #include "Text.h" #include #include -//#include "Game.h" +#include "Game.h" #include "fns.h" #include using namespace std; -Text::Text(string name, string t, SDL_Color color) : WorldObject(name){ - // Load a font - font = TTF_OpenFont("FreeSans.ttf", 24); +Text::Text(string filename, FontType t, int s, SDL_Color c, int w, int h ) : WorldObject(filename), mFont(Game::game()->getCurrentLevel()->getFont(s, t)), color(c), width(w), height(h){ + +} + +Text::Text(string name, string t, int s, SDL_Color c, int w, int h) : WorldObject(name), text(t), mFont(Game::game()->getCurrentLevel()->getFont(s, (FontType)0)), color(c), width(w), height(h){ - if(font){ - //SDL_Color text_color = {r,g, b}; - string txt="A journey of a thousand miles begins with a single step."; - SDL_Rect rect = {0,0,100,100}; - draw(); - } - else - cerr << "TTF_OpenFont() Failed: " << TTF_GetError() << endl; +} - TTF_CloseFont(font); +Text::~Text(){ + Game::game()->getCurrentLevel()->closeFont(mFont); } void Text::draw() @@ -27,12 +23,11 @@ void Text::draw() const char* txt = text.c_str(); SDL_Surface *initial; SDL_Surface *intermediary; - SDL_Rect location = {mPos.x, mPos.y, width, height}; int w,h; Texture texture; /* Use SDL_TTF to render our txt */ - initial = TTF_RenderUTF8_Blended(font, text.c_str(), color); + initial = TTF_RenderUTF8_Blended(mFont->font, text.c_str(), color); /* Convert the rendered txt to a known format */ w = nextPow2(initial->w); @@ -59,23 +54,19 @@ void Text::draw() /* Draw a quad at location */ glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); - glVertex2f(location.x , location.y); - glTexCoord2f(1.0f, 0.0f); - glVertex2f(location.x + w, location.y); - glTexCoord2f(1.0f, 1.0f); - glVertex2f(location.x + w, location.y + h); - glTexCoord2f(0.0f, 1.0f); - glVertex2f(location.x , location.y + h); + glTexCoord2d(0.0f, 0.0f); + glVertex2d(mPos.x , mPos.y); + glTexCoord2d(1.0f, 0.0f); + glVertex2d(mPos.x + w, mPos.y); + glTexCoord2d(1.0f, 1.0f); + glVertex2d(mPos.x + w, mPos.y + h); + glTexCoord2d(0.0f, 1.0f); + glVertex2d(mPos.x , mPos.y + h); glEnd(); /* Bad things happen if we delete the texture before it finishes */ glFinish(); - - /* return the deltas in the unused w,h part of the rect */ - location.w = initial->w; - location.h = initial->h; - + /* Clean up */ SDL_FreeSurface(initial); SDL_FreeSurface(intermediary); diff --git a/Text.h b/Text.h index 111a9f1..c7de0f8 100644 --- a/Text.h +++ b/Text.h @@ -6,24 +6,27 @@ #include #include "SDL_ttf.h" #include "WorldObject.h" +#include "Font.h" using namespace std; + /** On-screen text This class is tasked with the following: - displaying text on screen. */ - class Text : public WorldObject { public: - TTF_Font* font; + Font* mFont; string text; SDL_Color color; void draw(); void update(); int width; int height; - Text(string name, string t, SDL_Color color); + Text(string name, string t, int size = 24, SDL_Color c = WHITE, int w = 600, int h = 150); + Text(string filename, FontType t, int size = 24, SDL_Color c = WHITE, int w = 600, int h = 150); + ~Text(); }; #endif diff --git a/fns.h b/fns.h index c3c134b..4e3a1fa 100644 --- a/fns.h +++ b/fns.h @@ -22,6 +22,15 @@ const float deg2rad = (float)(3.14159/180); SDL_Surface* LoadImage( std::string filename );/**< Loads supported images. */ +/** The types that our fonts can be */ +enum FontType{ + English=0, + Japanese, + JapaneseWithRuby +}; + +const SDL_Color WHITE = {0xFF, 0xFF, 0xFF}; + class SizeD; /** 2D position or vector placed here because of general access*/ diff --git a/game.vcxproj b/game.vcxproj index eaa73da..87c83f7 100644 --- a/game.vcxproj +++ b/game.vcxproj @@ -100,6 +100,7 @@ cd ../../ + @@ -115,6 +116,7 @@ cd ../../ + -- 2.11.0