diff --git a/src/font.cpp b/src/font.cpp index af0af320..a0039414 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -40,7 +40,7 @@ private: char *name; SDL_Surface *img; - int width, height; + int2 size; float tx, ty; GLuint texture; }; @@ -68,10 +68,9 @@ Font::Font(char const *path) exit(1); } - data->width = data->img->w / 16; - data->height = data->img->h / 16; - data->tx = (float)data->width / PotUp(data->img->w); - data->ty = (float)data->height / PotUp(data->img->h); + data->size = int2(data->img->w, data->img->h) / 16; + data->tx = (float)data->size.x / PotUp(data->img->w); + data->ty = (float)data->size.y / PotUp(data->img->h); drawgroup = DRAWGROUP_BEFORE; } @@ -150,14 +149,14 @@ void Font::Print(int3 pos, char const *str) glTexCoord2f(tx, ty + data->ty); glVertex2f(pos.x, pos.y); glTexCoord2f(tx + data->tx, ty + data->ty); - glVertex2f(pos.x + data->width, pos.y); + glVertex2f(pos.x + data->size.x, pos.y); glTexCoord2f(tx + data->tx, ty); - glVertex2f(pos.x + data->width, pos.y + data->height); + glVertex2f(pos.x + data->size.x, pos.y + data->size.y); glTexCoord2f(tx, ty); - glVertex2f(pos.x, pos.y + data->height); + glVertex2f(pos.x, pos.y + data->size.y); } - pos.x += data->width; + pos.x += data->size.x; } glEnd(); } @@ -188,3 +187,8 @@ void Font::PrintBold(int3 pos, char const *str) glPopAttrib(); } +int2 Font::GetSize() const +{ + return data->size; +} + diff --git a/src/font.h b/src/font.h index 371aa133..d3459c13 100644 --- a/src/font.h +++ b/src/font.h @@ -35,6 +35,7 @@ public: /* New methods */ void Print(int3 pos, char const *str); void PrintBold(int3 pos, char const *str); + int2 GetSize() const; private: FontData *data; diff --git a/src/input.h b/src/input.h index b3ee8172..e33b9aa3 100644 --- a/src/input.h +++ b/src/input.h @@ -18,15 +18,24 @@ #include "matrix.h" +class WorldEntity; + class Input { public: + /* These methods are general queries */ static float2 GetAxis(int axis); - static void SetMousePos(int2 coord); static int2 GetMousePos(); + static int3 GetMouseButtons(); + + /* Entities can subscribe to events */ + static void ListenMouse(WorldEntity *e); + static void UnlistenMouse(WorldEntity *e); + + /* These methods are called by the underlying input listeners */ + static void SetMousePos(int2 coord); static void SetMouseButton(int index); static void UnsetMouseButton(int index); - static int3 GetMouseButtons(); }; #endif // __DH_INPUT_H__ diff --git a/src/text.cpp b/src/text.cpp index 5f494dbd..6a237bf8 100644 --- a/src/text.cpp +++ b/src/text.cpp @@ -27,7 +27,7 @@ class TextData friend class Text; private: - int font; + int font, align, length; char *text; int3 pos; }; @@ -41,6 +41,7 @@ Text::Text(char const *text, char const *font) { data->font = Forge::Register(font); data->text = text ? strdup(text) : NULL; + data->length = text ? strlen(text) : 0; data->pos = int3(0, 0, 0); drawgroup = DRAWGROUP_HUD; @@ -51,15 +52,17 @@ void Text::SetText(char const *text) if (data->text) free(data->text); data->text = text ? strdup(text) : NULL; + data->length = text ? strlen(text) : 0; } void Text::SetInt(int val) { if (data->text) free(data->text); - char buf[128]; - sprintf(buf, "%i", val); - data->text = strdup(buf); + char text[128]; + sprintf(text, "%i", val); + data->text = strdup(text); + data->length = strlen(text); } void Text::SetPos(int3 pos) @@ -67,6 +70,11 @@ void Text::SetPos(int3 pos) data->pos = pos; } +void Text::SetAlign(int align) +{ + data->align = align; +} + void Text::TickDraw(float deltams) { Entity::TickDraw(deltams); @@ -74,7 +82,12 @@ void Text::TickDraw(float deltams) if (data->text) { Font *font = Forge::GetFont(data->font); - font->Print(data->pos, data->text); + int3 delta = 0; + if (data->align == ALIGN_RIGHT) + delta.x -= data->length * font->GetSize().x; + else if (data->align == ALIGN_CENTER) + delta.x -= data->length * font->GetSize().x / 2; + font->Print(data->pos + delta, data->text); } } diff --git a/src/text.h b/src/text.h index f1775cff..6faf016c 100644 --- a/src/text.h +++ b/src/text.h @@ -29,6 +29,14 @@ public: void SetText(char const *text); void SetInt(int val); void SetPos(int3 pos); + void SetAlign(int align); + + enum + { + ALIGN_LEFT, + ALIGN_RIGHT, + ALIGN_CENTER, + }; protected: virtual void TickDraw(float deltams);