| @@ -1,6 +1,7 @@ | |||
| SRC = test-map.cpp \ | |||
| game.cpp video.cpp tiler.cpp tileset.cpp scene.cpp layer.cpp map.cpp | |||
| game.cpp video.cpp tiler.cpp tileset.cpp scene.cpp \ | |||
| font.cpp layer.cpp map.cpp | |||
| all: test-map | |||
| @@ -0,0 +1,94 @@ | |||
| #ifdef WIN32 | |||
| # define WIN32_LEAN_AND_MEAN | |||
| # include <windows.h> | |||
| #endif | |||
| #if defined __APPLE__ && defined __MACH__ | |||
| # include <OpenGL/gl.h> | |||
| #else | |||
| # define GL_GLEXT_PROTOTYPES | |||
| # include <GL/gl.h> | |||
| #endif | |||
| #include <SDL.h> | |||
| #include <SDL_image.h> | |||
| #include "font.h" | |||
| /* | |||
| * Font implementation class | |||
| */ | |||
| class FontData | |||
| { | |||
| friend class Font; | |||
| private: | |||
| SDL_Surface *img; | |||
| GLuint texture[1]; | |||
| }; | |||
| /* | |||
| * Public Font class | |||
| */ | |||
| Font::Font(char const *path) | |||
| { | |||
| data = new FontData(); | |||
| data->img = NULL; | |||
| for (char const *name = path; *name; name++) | |||
| if ((data->img = IMG_Load(name))) | |||
| break; | |||
| if (!data->img) | |||
| { | |||
| SDL_Quit(); | |||
| exit(1); | |||
| } | |||
| glGenTextures(1, data->texture); | |||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | |||
| glTexImage2D(GL_TEXTURE_2D, 0, 4, data->img->w, data->img->h, 0, | |||
| GL_RGBA, GL_UNSIGNED_BYTE, data->img->pixels); | |||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | |||
| } | |||
| Font::~Font() | |||
| { | |||
| glDeleteTextures(1, data->texture); | |||
| SDL_FreeSurface(data->img); | |||
| delete data; | |||
| } | |||
| void Font::Print(int x, int y, char const *str) | |||
| { | |||
| int w = data->img->w / 16; | |||
| int h = data->img->h / 16; | |||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | |||
| glBegin(GL_QUADS); | |||
| while (*str) | |||
| { | |||
| uint32_t ch = (uint8_t)*str++; | |||
| float tx = .0625f * (ch & 0xf); | |||
| float ty = .0625f * ((ch >> 4) & 0xf); | |||
| glTexCoord2f(tx, ty); | |||
| glVertex2f(x, y); | |||
| glTexCoord2f(tx + .0625f, ty); | |||
| glVertex2f(x + w, y); | |||
| glTexCoord2f(tx + .0625f, ty + .0625f); | |||
| glVertex2f(x + w, y + h); | |||
| glTexCoord2f(tx, ty + .0625f); | |||
| glVertex2f(x, y + h); | |||
| x += w; | |||
| } | |||
| glEnd(); | |||
| } | |||
| @@ -0,0 +1,24 @@ | |||
| /* | |||
| * The font object | |||
| */ | |||
| #if !defined __DH_FONT_H__ | |||
| #define __DH_FONT_H__ | |||
| class FontData; | |||
| class Font | |||
| { | |||
| public: | |||
| Font(char const *path); | |||
| ~Font(); | |||
| void Print(int x, int y, char const *str); | |||
| private: | |||
| FontData *data; | |||
| }; | |||
| #endif // __DH_FONT_H__ | |||
| @@ -1,6 +1,9 @@ | |||
| #include <cstdio> | |||
| #include "game.h" | |||
| #include "map.h" | |||
| #include "font.h" | |||
| /* | |||
| * Game implementation class | |||
| @@ -12,8 +15,11 @@ class GameData | |||
| private: | |||
| Map *map; | |||
| Font *font; | |||
| int x, y; | |||
| int mousex, mousey; | |||
| int frame; | |||
| }; | |||
| /* | |||
| @@ -24,11 +30,14 @@ Game::Game(char const *mapname) | |||
| { | |||
| data = new GameData(); | |||
| data->map = new Map(mapname); | |||
| data->font = new Font("gfx/font/ascii.png"); | |||
| data->x = data->y = 0; | |||
| data->frame = 0; | |||
| } | |||
| Game::~Game() | |||
| { | |||
| delete data->font; | |||
| delete data->map; | |||
| delete data; | |||
| } | |||
| @@ -47,5 +56,9 @@ void Game::Render() | |||
| scene->Render(); | |||
| delete scene; | |||
| char buf[1024]; | |||
| sprintf(buf, "Frame %i", data->frame++); | |||
| data->font->Print(10, 10, buf); | |||
| } | |||
| @@ -39,6 +39,7 @@ private: | |||
| int *tiles; | |||
| int ntiles; | |||
| SDL_Surface *img; | |||
| GLuint texture[1]; | |||
| }; | |||
| @@ -48,20 +49,18 @@ private: | |||
| TileSet::TileSet(char const *path) | |||
| { | |||
| SDL_Surface *img = NULL; | |||
| data = new TileSetData(); | |||
| data->name = strdup(path); | |||
| data->ref = 0; | |||
| data->tiles = NULL; | |||
| data->ntiles = 0; | |||
| data->img = NULL; | |||
| /* One tile texture */ | |||
| for (char const *name = path; *name; name++) | |||
| if ((img = IMG_Load(name))) | |||
| if ((data->img = IMG_Load(name))) | |||
| break; | |||
| if (!img) | |||
| if (!data->img) | |||
| { | |||
| SDL_Quit(); | |||
| exit(1); | |||
| @@ -70,8 +69,8 @@ TileSet::TileSet(char const *path) | |||
| glGenTextures(1, data->texture); | |||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | |||
| glTexImage2D(GL_TEXTURE_2D, 0, 4, img->w, img->h, 0, | |||
| GL_RGBA, GL_UNSIGNED_BYTE, img->pixels); | |||
| glTexImage2D(GL_TEXTURE_2D, 0, 4, data->img->w, data->img->h, 0, | |||
| GL_RGBA, GL_UNSIGNED_BYTE, data->img->pixels); | |||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | |||