(0,0) at the bottom left.legacy
| @@ -64,10 +64,10 @@ void DebugSprite::TickDraw(float deltams) | |||||
| int y = data->y; | int y = data->y; | ||||
| int z = data->z; | int z = data->z; | ||||
| data->game->GetScene()->AddTile((data->tiler << 16) | 15, | |||||
| x - 16, y - 32, z + 32, 1); | |||||
| data->game->GetScene()->AddTile((data->tiler << 16) | 31, | data->game->GetScene()->AddTile((data->tiler << 16) | 31, | ||||
| x - 16, y - 32, z, 1); | |||||
| x - 16, y, z + 32, 1); | |||||
| data->game->GetScene()->AddTile((data->tiler << 16) | 15, | |||||
| x - 16, y, z, 1); | |||||
| } | } | ||||
| DebugSprite::~DebugSprite() | DebugSprite::~DebugSprite() | ||||
| @@ -120,13 +120,13 @@ void Font::Print(int x, int y, char const *str) | |||||
| if (ch != ' ') | if (ch != ' ') | ||||
| { | { | ||||
| glTexCoord2f(tx, ty); | |||||
| glTexCoord2f(tx, ty + .0625f); | |||||
| glVertex2f(x, y); | glVertex2f(x, y); | ||||
| glTexCoord2f(tx + .0625f, ty); | |||||
| glVertex2f(x + data->width, y); | |||||
| glTexCoord2f(tx + .0625f, ty + .0625f); | glTexCoord2f(tx + .0625f, ty + .0625f); | ||||
| glVertex2f(x + data->width, y); | |||||
| glTexCoord2f(tx + .0625f, ty); | |||||
| glVertex2f(x + data->width, y + data->height); | glVertex2f(x + data->width, y + data->height); | ||||
| glTexCoord2f(tx, ty + .0625f); | |||||
| glTexCoord2f(tx, ty); | |||||
| glVertex2f(x, y + data->height); | glVertex2f(x, y + data->height); | ||||
| } | } | ||||
| @@ -56,7 +56,7 @@ int main(int argc, char **argv) | |||||
| GTK_SIGNAL_FUNC(delayed_quit), NULL); | GTK_SIGNAL_FUNC(delayed_quit), NULL); | ||||
| g_object_unref(G_OBJECT(builder)); | g_object_unref(G_OBJECT(builder)); | ||||
| glmapview->LoadMap("maps/testmap.tmx"); | |||||
| glmapview->LoadMap("maps/testmap2.tmx"); | |||||
| new DebugFps(); | new DebugFps(); | ||||
| gtk_main(); | gtk_main(); | ||||
| @@ -104,7 +104,8 @@ gboolean GlMapView::IdleTick() | |||||
| if (mapviewer) | if (mapviewer) | ||||
| mapviewer->SetPOV(gtk_adjustment_get_value(hadj), | mapviewer->SetPOV(gtk_adjustment_get_value(hadj), | ||||
| gtk_adjustment_get_value(vadj)); | |||||
| mapviewer->GetHeight() - glarea->allocation.height | |||||
| - gtk_adjustment_get_value(vadj)); | |||||
| /* Tick the game */ | /* Tick the game */ | ||||
| Ticker::TickGame(); | Ticker::TickGame(); | ||||
| @@ -42,9 +42,9 @@ Float2 Input::GetAxis(int axis) | |||||
| /* Simulate a joystick using the keyboard. This SDL call is free. */ | /* Simulate a joystick using the keyboard. This SDL call is free. */ | ||||
| Uint8 *keystate = SDL_GetKeyState(NULL); | Uint8 *keystate = SDL_GetKeyState(NULL); | ||||
| int left = keystate[SDLK_d] - (keystate[SDLK_a] | keystate[SDLK_q]); | int left = keystate[SDLK_d] - (keystate[SDLK_a] | keystate[SDLK_q]); | ||||
| int up = keystate[SDLK_s] - (keystate[SDLK_w] | keystate[SDLK_z]); | |||||
| f.y += up; | |||||
| int up = (keystate[SDLK_w] | keystate[SDLK_z]) - keystate[SDLK_s] ; | |||||
| f.x += left; | f.x += left; | ||||
| f.y += up; | |||||
| if (left && up) | if (left && up) | ||||
| { | { | ||||
| f.x *= invsqrt2; | f.x *= invsqrt2; | ||||
| @@ -90,7 +90,11 @@ Map::Map(char const *path) | |||||
| } | } | ||||
| } | } | ||||
| tiles[ntiles++] = code; | |||||
| int x = ntiles % data->width; | |||||
| int y = data->height - 1 - (ntiles / data->width); | |||||
| tiles[y * data->width + x] = code; | |||||
| ntiles++; | |||||
| while (isdigit(*parser)) | while (isdigit(*parser)) | ||||
| parser++; | parser++; | ||||
| if (*parser == ',') | if (*parser == ',') | ||||
| @@ -45,7 +45,7 @@ int main(int argc, char **argv) | |||||
| Video::Setup(video->w, video->h); | Video::Setup(video->w, video->h); | ||||
| /* Create a game */ | /* Create a game */ | ||||
| Game *game = new Game("maps/testmap.tmx"); | |||||
| Game *game = new Game("maps/testmap2.tmx"); | |||||
| /* Register an input driver and some debug stuff */ | /* Register an input driver and some debug stuff */ | ||||
| new SdlInput(); | new SdlInput(); | ||||
| @@ -37,7 +37,8 @@ class TileSetData | |||||
| private: | private: | ||||
| char *name; | char *name; | ||||
| int *tiles; | int *tiles; | ||||
| int ntiles; | |||||
| int nw, nh, ntiles; | |||||
| float tx, ty; | |||||
| SDL_Surface *img; | SDL_Surface *img; | ||||
| GLuint texture; | GLuint texture; | ||||
| @@ -52,7 +53,6 @@ TileSet::TileSet(char const *path) | |||||
| data = new TileSetData(); | data = new TileSetData(); | ||||
| data->name = strdup(path); | data->name = strdup(path); | ||||
| data->tiles = NULL; | data->tiles = NULL; | ||||
| data->ntiles = 0; | |||||
| data->img = NULL; | data->img = NULL; | ||||
| data->texture = 0; | data->texture = 0; | ||||
| @@ -65,6 +65,12 @@ TileSet::TileSet(char const *path) | |||||
| SDL_Quit(); | SDL_Quit(); | ||||
| exit(1); | exit(1); | ||||
| } | } | ||||
| data->nw = data->img->w / 32; | |||||
| data->nh = data->img->h / 32; | |||||
| data->ntiles = data->nw * data->nh; | |||||
| data->tx = 32.0f / data->img->w; | |||||
| data->ty = 32.0f / data->img->h; | |||||
| } | } | ||||
| TileSet::~TileSet() | TileSet::~TileSet() | ||||
| @@ -113,8 +119,8 @@ char const *TileSet::GetName() | |||||
| void TileSet::BlitTile(uint32_t id, int x, int y, int z, int o) | void TileSet::BlitTile(uint32_t id, int x, int y, int z, int o) | ||||
| { | { | ||||
| float tx = .0625f * (id & 0xf); | |||||
| float ty = .0625f * ((id >> 4) & 0xf); | |||||
| float tx = data->tx * ((id & 0xffff) % data->nw); | |||||
| float ty = data->ty * ((id & 0xffff) / data->nw); | |||||
| float sqrt2 = sqrtf(2.0f); | float sqrt2 = sqrtf(2.0f); | ||||
| int off = o ? 32 : 0; | int off = o ? 32 : 0; | ||||
| @@ -123,14 +129,14 @@ void TileSet::BlitTile(uint32_t id, int x, int y, int z, int o) | |||||
| { | { | ||||
| glBindTexture(GL_TEXTURE_2D, data->texture); | glBindTexture(GL_TEXTURE_2D, data->texture); | ||||
| glBegin(GL_QUADS); | glBegin(GL_QUADS); | ||||
| glTexCoord2f(tx, ty + data->ty); | |||||
| glVertex3f(x, sqrt2 * (y - 70 + off), sqrt2 * (z + off)); | |||||
| glTexCoord2f(tx + data->tx, ty + data->ty); | |||||
| glVertex3f(x + 32, sqrt2 * (y - 70 + off), sqrt2 * (z + off)); | |||||
| glTexCoord2f(tx + data->tx, ty); | |||||
| glVertex3f(x + 32, sqrt2 * (y - 38), sqrt2 * z); | |||||
| glTexCoord2f(tx, ty); | glTexCoord2f(tx, ty); | ||||
| glVertex3f(x, sqrt2 * (y + off), sqrt2 * (z + off)); | |||||
| glTexCoord2f(tx + .0625f, ty); | |||||
| glVertex3f(x + 32, sqrt2 * (y + off), sqrt2 * (z + off)); | |||||
| glTexCoord2f(tx + .0625f, ty + .0625f); | |||||
| glVertex3f(x + 32, sqrt2 * (y + 32), sqrt2 * z); | |||||
| glTexCoord2f(tx, ty + .0625f); | |||||
| glVertex3f(x, sqrt2 * (y + 32), sqrt2 * z); | |||||
| glVertex3f(x, sqrt2 * (y - 38), sqrt2 * z); | |||||
| glEnd(); | glEnd(); | ||||
| } | } | ||||
| } | } | ||||
| @@ -43,7 +43,7 @@ void Video::Setup(int width, int height) | |||||
| /* Projection matrix: once and for all */ | /* Projection matrix: once and for all */ | ||||
| glMatrixMode(GL_PROJECTION); | glMatrixMode(GL_PROJECTION); | ||||
| glLoadIdentity(); | glLoadIdentity(); | ||||
| glOrtho(0, width, height, 0, -(width + height), width + height); | |||||
| glOrtho(0, width, 0, height, -(width + height), width + height); | |||||
| } | } | ||||
| void Video::Clear() | void Video::Clear() | ||||