From 72640385379264d301bf1995970343a41e182a64 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Tue, 29 Jun 2010 06:53:30 +0000 Subject: [PATCH] Add mediocre support for .tmx tiled maps. --- src/Makefile | 2 +- src/test-map.cpp | 110 ++++++++++++++++++++++++++++++----------------- 2 files changed, 72 insertions(+), 40 deletions(-) diff --git a/src/Makefile b/src/Makefile index 3e227fc9..5e45635e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -10,5 +10,5 @@ test-map: $(SRC:%.cpp=%.o) g++ -Wall -O3 -c $^ -o $@ `pkg-config --cflags sdl gl SDL_image` clean: - rm -f test-map + rm -f *.o test-map diff --git a/src/test-map.cpp b/src/test-map.cpp index 49bb305e..d5063ab0 100644 --- a/src/test-map.cpp +++ b/src/test-map.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include "video.h" @@ -25,6 +26,11 @@ GLuint texture[1]; /* Storage for 3 vertex buffers */ GLuint buflist[3]; +/* Storage for map layers */ +int *layers[128]; +int width = 32, height = 32; +int nlayers = 0; + // Load Bitmaps And Convert To Textures void LoadGLTextures(void) { @@ -51,53 +57,77 @@ void MakeVBOs(void) glGenBuffers(3, buflist); } -void PutMap(int const *themap) +void LoadMap(void) +{ + FILE *fp = popen("grep '^ ' maps/testmap.tmx | while read i; do echo -n \"$i\" | perl -MMIME::Base64 -ne 'print decode_base64($_)' | gunzip; done", "r"); + while (fp && !feof(fp)) + { + layers[nlayers] = (int *)malloc(width * height * sizeof(int)); + fread(layers[nlayers], sizeof(int), width * height, fp); + if (feof(fp)) + { + free(layers[nlayers]); + layers[nlayers] = 0; + fclose(fp); + break; + } + for (int n = 0; n < width * height; n++) + { + unsigned int i = layers[nlayers][n]; + //i = (i >> 24) | ((i >> 8) & 0xff00) | ((i << 8) & 0xff0000) | (i << 24); + layers[nlayers][n] = i ? i - 1 : 0; + } + nlayers++; + } +} + +void PutMap(int const *themap, int width, int height) { // Put map - float uvs[8 * 20 * 15]; + float uvs[8 * width * height]; - for (int y = 0; y < 15; y++) - for (int x = 0; x < 20; x++) + for (int y = 0; y < height; y++) + for (int x = 0; x < width; x++) { - int tile = themap[20 * y + x]; + int tile = themap[width * y + x]; float ty = .0625f * (tile / 16); float tx = .0625f * (tile % 16); - uvs[8 * (20 * y + x) + 0] = tx; - uvs[8 * (20 * y + x) + 1] = ty; - uvs[8 * (20 * y + x) + 2] = tx + .0625f; - uvs[8 * (20 * y + x) + 3] = ty; - uvs[8 * (20 * y + x) + 4] = tx + .0625f; - uvs[8 * (20 * y + x) + 5] = ty + .0625f; - uvs[8 * (20 * y + x) + 6] = tx; - uvs[8 * (20 * y + x) + 7] = ty + .0625f; + uvs[8 * (width * y + x) + 0] = tx; + uvs[8 * (width * y + x) + 1] = ty; + uvs[8 * (width * y + x) + 2] = tx + .0625f; + uvs[8 * (width * y + x) + 3] = ty; + uvs[8 * (width * y + x) + 4] = tx + .0625f; + uvs[8 * (width * y + x) + 5] = ty + .0625f; + uvs[8 * (width * y + x) + 6] = tx; + uvs[8 * (width * y + x) + 7] = ty + .0625f; } glBindBuffer(GL_ARRAY_BUFFER, buflist[1]); glBufferData(GL_ARRAY_BUFFER, - 8 * 20 * 15 * sizeof(float), uvs, GL_STATIC_DRAW); + 8 * width * height * sizeof(float), uvs, GL_STATIC_DRAW); - float vertices[8 * 20 * 15]; - for (int y = 0; y < 15; y++) - for (int x = 0; x < 20; x++) + float vertices[8 * width * height]; + for (int y = 0; y < height; y++) + for (int x = 0; x < width; x++) { - vertices[8 * (20 * y + x) + 0] = x * 32; - vertices[8 * (20 * y + x) + 1] = y * 32; - vertices[8 * (20 * y + x) + 2] = x * 32 + 32; - vertices[8 * (20 * y + x) + 3] = y * 32; - vertices[8 * (20 * y + x) + 4] = x * 32 + 32; - vertices[8 * (20 * y + x) + 5] = y * 32 + 32; - vertices[8 * (20 * y + x) + 6] = x * 32; - vertices[8 * (20 * y + x) + 7] = y * 32 + 32; + vertices[8 * (width * y + x) + 0] = x * 32; + vertices[8 * (width * y + x) + 1] = y * 32; + vertices[8 * (width * y + x) + 2] = x * 32 + 32; + vertices[8 * (width * y + x) + 3] = y * 32; + vertices[8 * (width * y + x) + 4] = x * 32 + 32; + vertices[8 * (width * y + x) + 5] = y * 32 + 32; + vertices[8 * (width * y + x) + 6] = x * 32; + vertices[8 * (width * y + x) + 7] = y * 32 + 32; } glBindBuffer(GL_ARRAY_BUFFER, buflist[0]); glBufferData(GL_ARRAY_BUFFER, - 8 * 20 * 15 * sizeof(float), vertices, GL_STATIC_DRAW); + 8 * width * height * sizeof(float), vertices, GL_STATIC_DRAW); - int indices[4 * 20 * 15]; - for (int n = 0; n < 4 * 20 * 15; n++) + int indices[4 * width * height]; + for (int n = 0; n < 4 * width * height; n++) indices[n] = n; glBindBuffer(GL_ARRAY_BUFFER, buflist[2]); glBufferData(GL_ARRAY_BUFFER, - 4 * 20 * 15 * sizeof(int), indices, GL_STATIC_DRAW); + 4 * width * height * sizeof(int), indices, GL_STATIC_DRAW); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); @@ -112,7 +142,7 @@ void PutMap(int const *themap) glBindBuffer(GL_ARRAY_BUFFER, buflist[2]); glIndexPointer(GL_INT, 0, NULL); - glDrawArrays(GL_QUADS, 0, 4 * 20 * 15); + glDrawArrays(GL_QUADS, 0, 4 * width * height); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); @@ -122,6 +152,7 @@ void PutMap(int const *themap) /* The main drawing function. */ void DrawScene() { +/* int ground[20 * 15] = { 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, @@ -151,21 +182,21 @@ void DrawScene() 0, 0, 0, 0, 49, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 49, 49, 49, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 32, 49, 0, 0, 0, - 0, 0, 0, 49, 49, 32, 0, 50, 0, 0, 0, 48, 0, 64, 0, 49, 49, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 49, 49, 49, 49, 0, 0, 0, 0, 25, 9, 9, 9, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 40, 39, 39, 41, 0, 0, + 0, 0, 0, 49, 49, 32, 0, 50, 0, 0, 0, 48, 0, 24, 23, 54, 40, 55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 64, 0, 24, 23, 24, 23, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 24, 23, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; +*/ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); - PutMap(ground); - //glTranslatef(10.0f * sinf(0.16f * frames), 10.0f * cosf(0.16f * frames), 0.0f); - PutMap(l1objects); + for (int i = 0; i < nlayers; i++) + PutMap(layers[i], width, height); } int main(int argc, char **argv) @@ -177,6 +208,7 @@ int main(int argc, char **argv) /* Loop, drawing and checking events */ LoadGLTextures(); MakeVBOs(); + LoadMap(); done = 0; while (!done)