summary refs log tree commit diff stats
path: root/src/map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/map.cpp')
-rw-r--r--src/map.cpp257
1 files changed, 30 insertions, 227 deletions
diff --git a/src/map.cpp b/src/map.cpp index 0dd3e04..cb1ce72 100644 --- a/src/map.cpp +++ b/src/map.cpp
@@ -1,252 +1,55 @@
1#include "map.h" 1#include "map.h"
2#include "mapview.h"
2 3
3struct platform_t { 4Map::Map(char* filename)
4 int x;
5 int y;
6 int w;
7 int h;
8 bool enter_from_left;
9 bool enter_from_right;
10 bool enter_from_top;
11 bool enter_from_bottom;
12 int r;
13 int g;
14 int b;
15 int a;
16};
17
18Map::Map()
19{ 5{
20 add_collision(-6, 0, GAME_WIDTH, left, 1); 6 FILE* f = fopen(filename, "r");
21 add_collision(GAME_WIDTH+6, 0, GAME_WIDTH, right, 1); 7 m_mapdata = (char*) malloc(MAP_WIDTH*(MAP_HEIGHT-1)*sizeof(char));
22
23 FILE* f = fopen("../maps/bigmap.txt", "r");
24 char* mapbuf = (char*) malloc(MAP_WIDTH*(MAP_HEIGHT-1)*sizeof(char));
25 8
26 for (int i=0; i<MAP_HEIGHT-1; i++) 9 for (int i=0; i<MAP_HEIGHT-1; i++)
27 { 10 {
28 fread(mapbuf + i*MAP_WIDTH, sizeof(char), MAP_WIDTH, f); 11 fread(m_mapdata + i*MAP_WIDTH, sizeof(char), MAP_WIDTH, f);
29 fgetc(f); 12 fgetc(f);
30 } 13 }
31 14
32 fclose(f); 15 m_title = (char*) calloc(41, sizeof(char));
33 16 fgets(m_title, 41, f);
34 //Texture* tiles = loadTextureFromBMP("../res/tiles.bmp");
35 bg = createTexture(GAME_WIDTH, GAME_HEIGHT);
36 fillTexture(bg, NULL, 0, 0, 0);
37
38 for (int i=0; i<MAP_WIDTH*(MAP_HEIGHT-1); i++)
39 {
40 int x = i % MAP_WIDTH;
41 int y = i / MAP_WIDTH;
42 Rectangle dst(x*TILE_WIDTH, y*TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);
43 //Rectangle src;
44
45 switch (mapbuf[i])
46 {
47 case ' ': break;
48 case 'X': fillTexture(bg, &dst, 255, 85, 85); break;
49 case 'P': fillTexture(bg, &dst, 85, 255, 255); break;
50 }
51
52 //blitTexture(tiles, bg, &src, &dst);
53
54 if (mapbuf[i] == 'X')
55 {
56 if ((x != 0) && (mapbuf[i-1] != 'X'))
57 {
58 add_collision(x*TILE_WIDTH, y*TILE_HEIGHT, (y+1)*TILE_HEIGHT, right, 0);
59 }
60
61 if ((x != 15) && (mapbuf[i+1] != 'X'))
62 {
63 add_collision((x+1)*TILE_WIDTH, y*TILE_HEIGHT, (y+1)*TILE_HEIGHT, left, 0);
64 }
65
66 if ((y != 0) && (mapbuf[i-MAP_WIDTH] != 'X'))
67 {
68 add_collision(y*TILE_HEIGHT, x*TILE_WIDTH, (x+1)*TILE_WIDTH, down, 0);
69 }
70
71 if ((y != 15) && (mapbuf[i+MAP_WIDTH] != 'X'))
72 {
73 add_collision((y+1)*TILE_HEIGHT, x*TILE_WIDTH, (x+1)*TILE_WIDTH, up, 0);
74 }
75 } else if (mapbuf[i] == 'P')
76 {
77 add_collision(y*TILE_HEIGHT, x*TILE_WIDTH, (x+1)*TILE_WIDTH, down, 0);
78 }
79 }
80
81 Texture* font = loadTextureFromBMP("../res/font.bmp");
82 const char* map_name = "Everything Is Embarassing";
83 int start_x = (40/2) - (strlen(map_name)/2);
84 for (int i=0; i<strlen(map_name); i++)
85 {
86 Rectangle srcRect(map_name[i] % 16 * 8, map_name[i] / 16 * 8, 8, 8);
87 Rectangle dstRect((start_x + i)*8, 24*8, 8, 8);
88 blitTexture(font, bg, &srcRect, &dstRect);
89 }
90 17
91 destroyTexture(font); 18 fclose(f);
92 //destroyTexture(tiles);
93} 19}
94 20
95Map::~Map() 21Map::~Map()
96{ 22{
97 destroyTexture(bg); 23 free(m_mapdata);
24 free(m_title);
98} 25}
99 26
100void Map::add_collision(int axis, int lower, int upper, direction_t dir, int type) 27const char* Map::mapdata()
101{ 28{
102 //printf("added collision\n"); 29 return m_mapdata;
103 list<collision_t>::iterator it;
104
105 switch (dir)
106 {
107 case up:
108 it = up_collisions.begin();
109 for (; it!=up_collisions.end(); it++)
110 {
111 if (it->axis < axis) break;
112 }
113
114 up_collisions.insert(it, {axis, lower, upper, type});
115
116 break;
117 case down:
118 it = down_collisions.begin();
119 for (; it!=down_collisions.end(); it++)
120 {
121 if (it->axis > axis) break;
122 }
123
124 down_collisions.insert(it, {axis, lower, upper, type});
125
126 break;
127 case left:
128 it = left_collisions.begin();
129 for (; it!=left_collisions.end(); it++)
130 {
131 if (it->axis < axis) break;
132 }
133
134 left_collisions.insert(it, {axis, lower, upper, type});
135
136 break;
137 case right:
138 it = right_collisions.begin();
139 for (; it!=right_collisions.end(); it++)
140 {
141 if (it->axis > axis) break;
142 }
143
144 right_collisions.insert(it, {axis, lower, upper, type});
145
146 break;
147 }
148} 30}
149 31
150void Map::check_collisions(mob_t* mob, int x_next, int y_next) 32const char* Map::title()
151{ 33{
152 if (x_next < mob->x) 34 return m_title;
153 { 35}
154 for (list<collision_t>::iterator it=left_collisions.begin(); it!=left_collisions.end(); it++)
155 {
156 if (it->axis > mob->x) continue;
157 if (it->axis < x_next) break;
158
159 if ((mob->y+mob->h > it->lower) && (mob->y < it->upper))
160 {
161 // We have a collision!
162 if (it->type == 0)
163 {
164 x_next = it->axis;
165 mob->x_vel = 0;
166 } else if (it->type == 1)
167 {
168 x_next = GAME_WIDTH-mob->w/2;
169 }
170
171 break;
172 }
173 }
174 } else if (x_next > mob->x)
175 {
176 for (list<collision_t>::iterator it=right_collisions.begin(); it!=right_collisions.end(); it++)
177 {
178 if (it->axis < mob->x+mob->w) continue;
179 if (it->axis > x_next+mob->w) break;
180
181 if ((mob->y+mob->h > it->lower) && (mob->y < it->upper))
182 {
183 // We have a collision!
184 if (it->type == 0)
185 {
186 x_next = it->axis - mob->w;
187 mob->x_vel = 0;
188 } else if (it->type == 1)
189 {
190 x_next = -mob->w/2;
191 }
192
193 break;
194 }
195 }
196 }
197
198 mob->x = x_next;
199
200 if (y_next < mob->y)
201 {
202 for (list<collision_t>::iterator it=up_collisions.begin(); it!=up_collisions.end(); it++)
203 {
204 if (it->axis > mob->y) continue;
205 if (it->axis < y_next) break;
206
207 if ((mob->x+mob->w > it->lower) && (mob->x < it->upper))
208 {
209 // We have a collision!
210 if (it->type == 0)
211 {
212 y_next = it->axis;
213 mob->y_vel = 0;
214 } else if (it->type == 1)
215 {
216 y_next = GAME_HEIGHT-mob->h/2-1;
217 }
218
219 break;
220 }
221 }
222 } else if (y_next > mob->y)
223 {
224 for (list<collision_t>::iterator it=down_collisions.begin(); it!=down_collisions.end(); it++)
225 {
226 if (it->axis < mob->y+mob->h) continue;
227 if (it->axis > y_next+mob->h) break;
228 36
229 if ((mob->x+mob->w > it->lower) && (mob->x < it->upper)) 37Map* Map::getLeftMap()
230 { 38{
231 // We have a collision! 39 return m_leftMap;
232 if (it->type == 0) 40}
233 { 41
234 y_next = it->axis - mob->h; 42Map* Map::getRightMap()
235 mob->y_vel = 0; 43{
236 } else if (it->type == 1) 44 return m_rightMap;
237 { 45}
238 y_next = 1 - mob->h/2; 46
239 } 47void Map::setLeftMap(Map* m)
240 48{
241 break; 49 m_leftMap = m;
242 }
243 }
244 }
245
246 mob->y = y_next;
247} 50}
248 51
249void Map::render(Texture* buffer) 52void Map::setRightMap(Map* m)
250{ 53{
251 blitTexture(bg, buffer, NULL, NULL); 54 m_rightMap = m;
252} 55}