source: trunk/src/test-map.cpp @ 21

Last change on this file since 21 was 21, checked in by sam, 11 years ago

Add a sprite following the mouse.

  • Property svn:keywords set to Id
File size: 8.1 KB
Line 
1// Test stuff
2
3#ifdef WIN32
4#   define WIN32_LEAN_AND_MEAN
5#   include <windows.h>
6#endif
7#if defined __APPLE__ && defined __MACH__
8#   include <OpenGL/gl.h>
9#else
10#   define GL_GLEXT_PROTOTYPES
11#   include <GL/gl.h>
12#   include <GL/glext.h>
13#endif
14
15#include <SDL.h>
16#include <SDL_image.h>
17
18#include <stdio.h>
19#include <math.h>
20
21#include "video.h"
22
23/* Storage for one texture  */
24GLuint texture[1];
25
26/* Storage for 3 vertex buffers */
27GLuint buflist[3];
28
29/* Storage for map layers */
30int *layers[128];
31int width = 32, height = 32;
32int nlayers = 0;
33
34/* Player coordinates */
35int playerx = 0, playery = 0;
36
37// Load Bitmaps And Convert To Textures
38void LoadGLTextures(void)
39{       
40    SDL_Surface *image1 = IMG_Load("art/test/groundtest.png");
41
42    if (!image1)
43    {
44        SDL_Quit();
45        exit(1);
46    }
47
48    glGenTextures(1, &texture[0]);
49    glBindTexture(GL_TEXTURE_2D, texture[0]);
50
51    glTexImage2D(GL_TEXTURE_2D, 0, 4, image1->w, image1->h, 0,
52                 GL_RGBA, GL_UNSIGNED_BYTE, image1->pixels);
53
54    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
55    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
56};
57
58void MakeVBOs(void)
59{
60    glGenBuffers(3, buflist);
61}
62
63void LoadMap(void)
64{
65    FILE *fp = popen("grep '^   ' maps/testmap.tmx | while read i; do echo -n \"$i\" | perl -MMIME::Base64 -ne 'print decode_base64($_)' | gunzip; done", "r");
66    while (fp && !feof(fp))
67    {
68        layers[nlayers] = (int *)malloc(width * height * sizeof(int));
69        fread(layers[nlayers], sizeof(int), width * height, fp);
70        if (feof(fp))
71        {
72            free(layers[nlayers]);
73            layers[nlayers] = 0;
74            fclose(fp);
75            break;
76        }
77        for (int n = 0; n < width * height; n++)
78        {
79            unsigned int i = layers[nlayers][n];
80            //i = (i >> 24) | ((i >> 8) & 0xff00) | ((i << 8) & 0xff0000) | (i << 24);
81            layers[nlayers][n] = i ? i - 1 : 0;
82        }
83        nlayers++;
84    }
85}
86
87void PutMap(int const *themap, int width, int height)
88{
89    // Put map
90    float uvs[8 * width * height];
91
92    for (int y = 0; y < height; y++)
93        for (int x = 0; x < width; x++)
94        {
95            int tile = themap[width * y + x];
96            float ty = .0625f * (tile / 16);
97            float tx = .0625f * (tile % 16);
98            uvs[8 * (width * y + x) + 0] = tx;
99            uvs[8 * (width * y + x) + 1] = ty;
100            uvs[8 * (width * y + x) + 2] = tx + .0625f;
101            uvs[8 * (width * y + x) + 3] = ty;
102            uvs[8 * (width * y + x) + 4] = tx + .0625f;
103            uvs[8 * (width * y + x) + 5] = ty + .0625f;
104            uvs[8 * (width * y + x) + 6] = tx;
105            uvs[8 * (width * y + x) + 7] = ty + .0625f;
106        }
107    glBindBuffer(GL_ARRAY_BUFFER, buflist[1]);
108    glBufferData(GL_ARRAY_BUFFER,
109                 8 * width * height * sizeof(float), uvs, GL_STATIC_DRAW);
110
111    float vertices[8 * width * height];
112    for (int y = 0; y < height; y++)
113        for (int x = 0; x < width; x++)
114        {
115            vertices[8 * (width * y + x) + 0] = x * 32;
116            vertices[8 * (width * y + x) + 1] = y * 32;
117            vertices[8 * (width * y + x) + 2] = x * 32 + 32;
118            vertices[8 * (width * y + x) + 3] = y * 32;
119            vertices[8 * (width * y + x) + 4] = x * 32 + 32;
120            vertices[8 * (width * y + x) + 5] = y * 32 + 32;
121            vertices[8 * (width * y + x) + 6] = x * 32;
122            vertices[8 * (width * y + x) + 7] = y * 32 + 32;
123        }
124    glBindBuffer(GL_ARRAY_BUFFER, buflist[0]);
125    glBufferData(GL_ARRAY_BUFFER,
126                 8 * width * height * sizeof(float), vertices, GL_STATIC_DRAW);
127
128    int indices[4 * width * height];
129    for (int n = 0; n < 4 * width * height; n++)
130        indices[n] = n;
131    glBindBuffer(GL_ARRAY_BUFFER, buflist[2]);
132    glBufferData(GL_ARRAY_BUFFER,
133                 4 * width * height * sizeof(int), indices, GL_STATIC_DRAW);
134
135    glEnableClientState(GL_VERTEX_ARRAY);
136    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
137    glEnableClientState(GL_INDEX_ARRAY);
138
139    glBindTexture(GL_TEXTURE_2D, texture[0]);
140
141    glBindBuffer(GL_ARRAY_BUFFER, buflist[0]);
142    glVertexPointer(2, GL_FLOAT, 0, NULL);
143    glBindBuffer(GL_ARRAY_BUFFER, buflist[1]);
144    glTexCoordPointer(2, GL_FLOAT, 0, NULL);
145    glBindBuffer(GL_ARRAY_BUFFER, buflist[2]);
146    glIndexPointer(GL_INT, 0, NULL);
147
148    glDrawArrays(GL_QUADS, 0, 4 * width * height);
149
150    glDisableClientState(GL_VERTEX_ARRAY);
151    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
152    glDisableClientState(GL_INDEX_ARRAY);
153}
154
155/* The main drawing function. */
156void DrawScene()
157{
158/*
159    int ground[20 * 15] =
160    {
16118, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
16218,  1,  2,  2,  2, 34,  2,  2,  2,  2,  2,  2,  3, 34,  4, 18, 18, 18, 18, 18,
16318, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 18, 20,  4, 18, 18, 18, 18,
16418, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 18, 17, 19, 18, 18, 18, 18,
16518, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 18, 17, 17, 18, 18, 18, 18,
16618, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 18, 20, 36, 18, 18, 18, 18,
16718, 33,  2,  2,  2,  2,  2,  2,  2,  2, 34,  2, 35,  2, 36, 18, 18, 18, 18, 18,
16818, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
16916, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
17016, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
17116, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
17216, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
17316, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
17416, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
17516, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
176    };
177
178    int l1objects[20 * 15] =
179    {
180 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
181 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
182 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
183 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
184 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 49,  0,  0,  0,  0,  0,  0,  0,  0,
185 0,  0,  0,  0, 49, 49,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
186 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
187 0,  0,  0,  0, 49, 49, 49, 49, 49, 49,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
188 0,  0,  0,  0,  0, 49, 49, 49, 49,  0,  0,  0,  0, 25,  9,  9,  9,  8,  0,  0,
189 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 54, 40, 39, 39, 41,  0,  0,
190 0,  0,  0, 49, 49, 32,  0, 50,  0,  0,  0, 48,  0, 24, 23, 54, 40, 55,  0,  0,
191 0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 64,  0, 24, 23, 24, 23,  7,  0,  0,
192 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6, 38, 24, 23,  7,  0,  0,
193 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6, 38, 22,  0,  0,
194 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
195    };
196*/
197
198    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
199    glLoadIdentity();
200
201    for (int i = 0; i < nlayers; i++)
202    {
203        glPushMatrix();
204        if (i == 2)
205            glTranslatef(playerx, playery, 0.0f);
206        PutMap(layers[i], width, height);
207        glPopMatrix();
208    }
209}
210
211int main(int argc, char **argv)
212{
213    Video *video = new Video("Deus Hax", 640, 480);
214
215    int done;
216
217    /* Loop, drawing and checking events */
218    LoadGLTextures();
219    MakeVBOs();
220    LoadMap();
221
222    done = 0;
223    while (!done)
224    {
225        DrawScene();
226
227        video->Refresh(33.33333f);
228
229        SDL_GetMouseState(&playerx, &playery);
230
231        /* This could go in a separate function */
232        SDL_Event event;
233        while (SDL_PollEvent(&event))
234        {
235            if (event.type == SDL_QUIT)
236                done = 1;
237            if (event.type == SDL_KEYDOWN)
238            {
239                if (event.key.keysym.sym == SDLK_RETURN)
240                    video->FullScreen();
241                else if (event.key.keysym.sym == SDLK_ESCAPE)
242                    done = 1;
243            }
244        }
245    }
246
247    delete video;
248
249    return EXIT_SUCCESS;
250}
251
Note: See TracBrowser for help on using the repository browser.