Browse Source

Support tilesets larger than 512x512 and switch the coordinates system to

(0,0) at the bottom left.
legacy
Sam Hocevar sam 14 years ago
parent
commit
9e2c239e74
9 changed files with 36 additions and 25 deletions
  1. +3
    -3
      src/debugsprite.cpp
  2. +4
    -4
      src/font.cpp
  3. +1
    -1
      src/gtk/editor.cpp
  4. +2
    -1
      src/gtk/glmapview.cpp
  5. +2
    -2
      src/input.cpp
  6. +5
    -1
      src/map.cpp
  7. +1
    -1
      src/test-map.cpp
  8. +17
    -11
      src/tileset.cpp
  9. +1
    -1
      src/video.cpp

+ 3
- 3
src/debugsprite.cpp View File

@@ -64,10 +64,10 @@ void DebugSprite::TickDraw(float deltams)
int y = data->y;
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,
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()


+ 4
- 4
src/font.cpp View File

@@ -120,13 +120,13 @@ void Font::Print(int x, int y, char const *str)

if (ch != ' ')
{
glTexCoord2f(tx, ty);
glTexCoord2f(tx, ty + .0625f);
glVertex2f(x, y);
glTexCoord2f(tx + .0625f, ty);
glVertex2f(x + data->width, y);
glTexCoord2f(tx + .0625f, ty + .0625f);
glVertex2f(x + data->width, y);
glTexCoord2f(tx + .0625f, ty);
glVertex2f(x + data->width, y + data->height);
glTexCoord2f(tx, ty + .0625f);
glTexCoord2f(tx, ty);
glVertex2f(x, y + data->height);
}



+ 1
- 1
src/gtk/editor.cpp View File

@@ -56,7 +56,7 @@ int main(int argc, char **argv)
GTK_SIGNAL_FUNC(delayed_quit), NULL);
g_object_unref(G_OBJECT(builder));

glmapview->LoadMap("maps/testmap.tmx");
glmapview->LoadMap("maps/testmap2.tmx");
new DebugFps();

gtk_main();


+ 2
- 1
src/gtk/glmapview.cpp View File

@@ -104,7 +104,8 @@ gboolean GlMapView::IdleTick()

if (mapviewer)
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 */
Ticker::TickGame();


+ 2
- 2
src/input.cpp View File

@@ -42,9 +42,9 @@ Float2 Input::GetAxis(int axis)
/* Simulate a joystick using the keyboard. This SDL call is free. */
Uint8 *keystate = SDL_GetKeyState(NULL);
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.y += up;
if (left && up)
{
f.x *= invsqrt2;


+ 5
- 1
src/map.cpp View File

@@ -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))
parser++;
if (*parser == ',')


+ 1
- 1
src/test-map.cpp View File

@@ -45,7 +45,7 @@ int main(int argc, char **argv)
Video::Setup(video->w, video->h);

/* 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 */
new SdlInput();


+ 17
- 11
src/tileset.cpp View File

@@ -37,7 +37,8 @@ class TileSetData
private:
char *name;
int *tiles;
int ntiles;
int nw, nh, ntiles;
float tx, ty;

SDL_Surface *img;
GLuint texture;
@@ -52,7 +53,6 @@ TileSet::TileSet(char const *path)
data = new TileSetData();
data->name = strdup(path);
data->tiles = NULL;
data->ntiles = 0;
data->img = NULL;
data->texture = 0;

@@ -65,6 +65,12 @@ TileSet::TileSet(char const *path)
SDL_Quit();
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()
@@ -113,8 +119,8 @@ char const *TileSet::GetName()

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);
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);
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);
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();
}
}


+ 1
- 1
src/video.cpp View File

@@ -43,7 +43,7 @@ void Video::Setup(int width, int height)
/* Projection matrix: once and for all */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, -(width + height), width + height);
glOrtho(0, width, 0, height, -(width + height), width + height);
}

void Video::Clear()


Loading…
Cancel
Save