@@ -40,7 +40,7 @@ private: | |||||
char *name; | char *name; | ||||
SDL_Surface *img; | SDL_Surface *img; | ||||
int width, height; | |||||
int2 size; | |||||
float tx, ty; | float tx, ty; | ||||
GLuint texture; | GLuint texture; | ||||
}; | }; | ||||
@@ -68,10 +68,9 @@ Font::Font(char const *path) | |||||
exit(1); | 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; | drawgroup = DRAWGROUP_BEFORE; | ||||
} | } | ||||
@@ -150,14 +149,14 @@ void Font::Print(int3 pos, char const *str) | |||||
glTexCoord2f(tx, ty + data->ty); | glTexCoord2f(tx, ty + data->ty); | ||||
glVertex2f(pos.x, pos.y); | glVertex2f(pos.x, pos.y); | ||||
glTexCoord2f(tx + data->tx, ty + data->ty); | 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); | 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); | 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(); | glEnd(); | ||||
} | } | ||||
@@ -188,3 +187,8 @@ void Font::PrintBold(int3 pos, char const *str) | |||||
glPopAttrib(); | glPopAttrib(); | ||||
} | } | ||||
int2 Font::GetSize() const | |||||
{ | |||||
return data->size; | |||||
} | |||||
@@ -35,6 +35,7 @@ public: | |||||
/* New methods */ | /* New methods */ | ||||
void Print(int3 pos, char const *str); | void Print(int3 pos, char const *str); | ||||
void PrintBold(int3 pos, char const *str); | void PrintBold(int3 pos, char const *str); | ||||
int2 GetSize() const; | |||||
private: | private: | ||||
FontData *data; | FontData *data; | ||||
@@ -18,15 +18,24 @@ | |||||
#include "matrix.h" | #include "matrix.h" | ||||
class WorldEntity; | |||||
class Input | class Input | ||||
{ | { | ||||
public: | public: | ||||
/* These methods are general queries */ | |||||
static float2 GetAxis(int axis); | static float2 GetAxis(int axis); | ||||
static void SetMousePos(int2 coord); | |||||
static int2 GetMousePos(); | 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 SetMouseButton(int index); | ||||
static void UnsetMouseButton(int index); | static void UnsetMouseButton(int index); | ||||
static int3 GetMouseButtons(); | |||||
}; | }; | ||||
#endif // __DH_INPUT_H__ | #endif // __DH_INPUT_H__ | ||||
@@ -27,7 +27,7 @@ class TextData | |||||
friend class Text; | friend class Text; | ||||
private: | private: | ||||
int font; | |||||
int font, align, length; | |||||
char *text; | char *text; | ||||
int3 pos; | int3 pos; | ||||
}; | }; | ||||
@@ -41,6 +41,7 @@ Text::Text(char const *text, char const *font) | |||||
{ | { | ||||
data->font = Forge::Register(font); | data->font = Forge::Register(font); | ||||
data->text = text ? strdup(text) : NULL; | data->text = text ? strdup(text) : NULL; | ||||
data->length = text ? strlen(text) : 0; | |||||
data->pos = int3(0, 0, 0); | data->pos = int3(0, 0, 0); | ||||
drawgroup = DRAWGROUP_HUD; | drawgroup = DRAWGROUP_HUD; | ||||
@@ -51,15 +52,17 @@ void Text::SetText(char const *text) | |||||
if (data->text) | if (data->text) | ||||
free(data->text); | free(data->text); | ||||
data->text = text ? strdup(text) : NULL; | data->text = text ? strdup(text) : NULL; | ||||
data->length = text ? strlen(text) : 0; | |||||
} | } | ||||
void Text::SetInt(int val) | void Text::SetInt(int val) | ||||
{ | { | ||||
if (data->text) | if (data->text) | ||||
free(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) | void Text::SetPos(int3 pos) | ||||
@@ -67,6 +70,11 @@ void Text::SetPos(int3 pos) | |||||
data->pos = pos; | data->pos = pos; | ||||
} | } | ||||
void Text::SetAlign(int align) | |||||
{ | |||||
data->align = align; | |||||
} | |||||
void Text::TickDraw(float deltams) | void Text::TickDraw(float deltams) | ||||
{ | { | ||||
Entity::TickDraw(deltams); | Entity::TickDraw(deltams); | ||||
@@ -74,7 +82,12 @@ void Text::TickDraw(float deltams) | |||||
if (data->text) | if (data->text) | ||||
{ | { | ||||
Font *font = Forge::GetFont(data->font); | 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); | |||||
} | } | ||||
} | } | ||||
@@ -29,6 +29,14 @@ public: | |||||
void SetText(char const *text); | void SetText(char const *text); | ||||
void SetInt(int val); | void SetInt(int val); | ||||
void SetPos(int3 pos); | void SetPos(int3 pos); | ||||
void SetAlign(int align); | |||||
enum | |||||
{ | |||||
ALIGN_LEFT, | |||||
ALIGN_RIGHT, | |||||
ALIGN_CENTER, | |||||
}; | |||||
protected: | protected: | ||||
virtual void TickDraw(float deltams); | virtual void TickDraw(float deltams); | ||||