diff options
author | Felix Arends <edx@rockbox.org> | 2002-05-31 22:16:10 +0000 |
---|---|---|
committer | Felix Arends <edx@rockbox.org> | 2002-05-31 22:16:10 +0000 |
commit | 739f2ae0fe6ba73b6e9f52fcf96dce3c11a7979c (patch) | |
tree | 0b65e9075f681a2909f815eff56c125dc60c79ec | |
parent | 7844e67034b298242227837a499fd59e772433b0 (diff) | |
download | rockbox-739f2ae0fe6ba73b6e9f52fcf96dce3c11a7979c.tar.gz rockbox-739f2ae0fe6ba73b6e9f52fcf96dce3c11a7979c.zip |
Zoomed Screen
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@864 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/recorder/tetris.c | 137 |
1 files changed, 90 insertions, 47 deletions
diff --git a/apps/recorder/tetris.c b/apps/recorder/tetris.c index 8748231fbf..9e08635e62 100644 --- a/apps/recorder/tetris.c +++ b/apps/recorder/tetris.c | |||
@@ -33,14 +33,14 @@ | |||
33 | #endif | 33 | #endif |
34 | 34 | ||
35 | #define TETRIS_TITLE "Tetris!" | 35 | #define TETRIS_TITLE "Tetris!" |
36 | #define TETRIS_TITLE_FONT 2 | 36 | #define TETRIS_TITLE_FONT 1 |
37 | #define TETRIS_TITLE_XLOC 10 | 37 | #define TETRIS_TITLE_XLOC 43 |
38 | #define TETRIS_TITLE_YLOC 32 | 38 | #define TETRIS_TITLE_YLOC 15 |
39 | 39 | ||
40 | int start_x = 1; | 40 | int start_x = 2; |
41 | int start_y = 1; | 41 | int start_y = 1; |
42 | int max_x = 14; | 42 | int max_x = 28; |
43 | int max_y = 24; | 43 | int max_y = 48; |
44 | int current_x = 0; | 44 | int current_x = 0; |
45 | int current_y = 0; | 45 | int current_y = 0; |
46 | int current_f = 0; | 46 | int current_f = 0; |
@@ -127,22 +127,59 @@ void draw_block(int x,int y,int block,int frame,bool clear) | |||
127 | { | 127 | { |
128 | int i; | 128 | int i; |
129 | for(i=0;i < 4;i++) { | 129 | for(i=0;i < 4;i++) { |
130 | if (clear) | 130 | if (clear) |
131 | lcd_clearpixel(start_x+x+block_data[block][frame][0][i], | 131 | { |
132 | start_y+y+block_data[block][frame][1][i]); | 132 | lcd_clearpixel(start_x+x+block_data[block][frame][0][i] * 2, |
133 | start_y+y+block_data[block][frame][1][i] * 2); | ||
134 | lcd_clearpixel(start_x+x+block_data[block][frame][0][i] * 2 + 1, | ||
135 | start_y+y+block_data[block][frame][1][i] * 2); | ||
136 | lcd_clearpixel(start_x+x+block_data[block][frame][0][i] * 2, | ||
137 | start_y+y+block_data[block][frame][1][i] * 2 + 1); | ||
138 | lcd_clearpixel(start_x+x+block_data[block][frame][0][i] * 2 + 1, | ||
139 | start_y+y+block_data[block][frame][1][i] * 2 + 1); | ||
140 | } | ||
133 | else | 141 | else |
134 | lcd_drawpixel(start_x+x+block_data[block][frame][0][i], | 142 | { |
135 | start_y+y+block_data[block][frame][1][i]); | 143 | lcd_drawpixel(start_x+x+block_data[block][frame][0][i] * 2, |
144 | start_y+y+block_data[block][frame][1][i] * 2); | ||
145 | lcd_drawpixel(start_x+x+block_data[block][frame][0][i] * 2 + 1, | ||
146 | start_y+y+block_data[block][frame][1][i] * 2); | ||
147 | lcd_drawpixel(start_x+x+block_data[block][frame][0][i] * 2, | ||
148 | start_y+y+block_data[block][frame][1][i] * 2 + 1); | ||
149 | lcd_drawpixel(start_x+x+block_data[block][frame][0][i] * 2 + 1, | ||
150 | start_y+y+block_data[block][frame][1][i] * 2 + 1); | ||
151 | } | ||
136 | } | 152 | } |
137 | } | 153 | } |
138 | 154 | ||
139 | void to_virtual(void) | 155 | void to_virtual(void) |
140 | { | 156 | { |
141 | int i; | 157 | int i; |
142 | for(i=0;i < 4;i++) | 158 | for(i = 0; i < 4; i++) |
143 | *(virtual+ | 159 | { |
144 | ((current_y+block_data[current_b][current_f][1][i])*max_x)+ | 160 | *(virtual + |
145 | (current_x+block_data[current_b][current_f][0][i])) = current_b+1; | 161 | (current_y + block_data[current_b][current_f][1][i] * 2) * max_x + |
162 | current_x + block_data[current_b][current_f][0][i] * 2) = current_b + 1; | ||
163 | *(virtual + | ||
164 | (current_y + block_data[current_b][current_f][1][i] * 2 + 1) * max_x + | ||
165 | current_x + block_data[current_b][current_f][0][i] * 2) = current_b + 1; | ||
166 | *(virtual + | ||
167 | (current_y + block_data[current_b][current_f][1][i] * 2) * max_x + | ||
168 | current_x + block_data[current_b][current_f][0][i] * 2 + 1) = current_b + 1; | ||
169 | *(virtual + | ||
170 | (current_y + block_data[current_b][current_f][1][i] * 2 + 1) * max_x + | ||
171 | current_x + block_data[current_b][current_f][0][i] * 2 + 1) = current_b + 1; | ||
172 | } | ||
173 | } | ||
174 | |||
175 | bool block_touch (int x, int y) | ||
176 | { | ||
177 | if (*(virtual + y * max_x + x) != 0 || | ||
178 | *(virtual + y * max_x + x + 1) != 0 || | ||
179 | *(virtual + (y + 1) * max_x + x) != 0 || | ||
180 | *(virtual + (y + 1) * max_x + x + 1) != 0) | ||
181 | return true; | ||
182 | return false; | ||
146 | } | 183 | } |
147 | 184 | ||
148 | bool gameover(void) | 185 | bool gameover(void) |
@@ -157,11 +194,10 @@ bool gameover(void) | |||
157 | 194 | ||
158 | for(i=0;i < 4; i++){ | 195 | for(i=0;i < 4; i++){ |
159 | /* Do we have blocks touching? */ | 196 | /* Do we have blocks touching? */ |
160 | if(*(virtual+((y+block_data[block][frame][1][i])*max_x)+x+ | 197 | if(block_touch(x + block_data[block][frame][0][i] * 2, y + block_data[block][frame][1][i] * 2)) |
161 | block_data[block][frame][0][i]) != 0) | ||
162 | { | 198 | { |
163 | /* Are we at the top of the frame? */ | 199 | /* Are we at the top of the frame? */ |
164 | if(y+block_data[block][frame][1][i] < start_y) | 200 | if(y + block_data[block][frame][1][i] * 2 < start_y) |
165 | { | 201 | { |
166 | /* Game over ;) */ | 202 | /* Game over ;) */ |
167 | return true; | 203 | return true; |
@@ -175,12 +211,11 @@ bool valid_position(int x,int y,int block,int frame) | |||
175 | { | 211 | { |
176 | int i; | 212 | int i; |
177 | for(i=0;i < 4;i++) | 213 | for(i=0;i < 4;i++) |
178 | if( (*(virtual+((y+block_data[block][frame][1][i])*max_x)+x+ | 214 | if ((y + block_data[block][frame][1][i] * 2 > max_y - 2) || |
179 | block_data[block][frame][0][i]) != 0) || | 215 | (x + block_data[block][frame][0][i] * 2 > max_x - 2) || |
180 | (x+block_data[block][frame][0][i] < 0) || | 216 | (y + block_data[block][frame][1][i] * 2 < 0) || |
181 | (x+block_data[block][frame][0][i] > max_x-1) || | 217 | (x + block_data[block][frame][0][i] * 2 < 0) || |
182 | (y+block_data[block][frame][1][i] < 0) || | 218 | block_touch (x + block_data[block][frame][0][i] * 2, y + block_data[block][frame][1][i] * 2)) |
183 | (y+block_data[block][frame][1][i] > max_y-1)) | ||
184 | return false; | 219 | return false; |
185 | return true; | 220 | return true; |
186 | } | 221 | } |
@@ -188,12 +223,12 @@ bool valid_position(int x,int y,int block,int frame) | |||
188 | void from_virtual(void) | 223 | void from_virtual(void) |
189 | { | 224 | { |
190 | int x,y; | 225 | int x,y; |
191 | for(y=0;y < max_y;y++) | 226 | for(y = 0; y < max_y; y++) |
192 | for(x=0;x < max_x;x++) | 227 | for(x = 1; x < max_x - 1; x ++) |
193 | if(*(virtual+(y*max_x)+x)) | 228 | if(*(virtual + (y * max_x) + x) != 0) |
194 | lcd_drawpixel(start_x+x,start_y+y); | 229 | lcd_drawpixel(start_x + x, start_y + y); |
195 | else | 230 | else |
196 | lcd_clearpixel(start_x+x,start_y+y); | 231 | lcd_clearpixel(start_x + x, start_y + y); |
197 | } | 232 | } |
198 | 233 | ||
199 | void move_block(int x,int y,int f) | 234 | void move_block(int x,int y,int f) |
@@ -206,7 +241,8 @@ void move_block(int x,int y,int f) | |||
206 | current_f = 0; | 241 | current_f = 0; |
207 | if(current_f < 0) | 242 | if(current_f < 0) |
208 | current_f = block_frames[current_b]-1; | 243 | current_f = block_frames[current_b]-1; |
209 | } | 244 | } |
245 | |||
210 | if(valid_position(current_x+x,current_y+y,current_b,current_f)) | 246 | if(valid_position(current_x+x,current_y+y,current_b,current_f)) |
211 | { | 247 | { |
212 | draw_block(current_x,current_y,current_b,last_frame,true); | 248 | draw_block(current_x,current_y,current_b,last_frame,true); |
@@ -243,32 +279,34 @@ int check_lines(void) | |||
243 | int x,y,i; | 279 | int x,y,i; |
244 | bool line; | 280 | bool line; |
245 | int lines = 0; | 281 | int lines = 0; |
246 | for(y=0;y < max_y;y++) | 282 | for(y = 0; y < max_y; y++) |
247 | { | 283 | { |
248 | line = true; | 284 | line = true; |
249 | for(x=0;x < max_x;x++) | 285 | for(x = 1; x < max_x - 1; x++) |
250 | if(virtual[y*max_x+x] == 0) | 286 | if(*(virtual + y * max_x + x) == 0) |
287 | { | ||
251 | line = false; | 288 | line = false; |
289 | break; | ||
290 | } | ||
252 | if(line) | 291 | if(line) |
253 | { | 292 | { |
254 | lines++; | 293 | lines++; |
255 | for(i=y;i > 1;i--) | 294 | for(i = y; i > 1; i--) |
256 | for (x=0;x<max_x;x++) | 295 | memcpy(virtual + i * max_x + 1, virtual + (i-1) * max_x + 1, max_x - 2); |
257 | memcpy(&virtual[i*max_x], &virtual[((i-1)*max_x)], max_x); | 296 | memset (&virtual[max_x] + 1, 0, max_x - 2); |
258 | for (x=0;x<max_x;x++) | ||
259 | memset (&virtual[max_x], 0, max_x); | ||
260 | } | 297 | } |
261 | } | 298 | } |
262 | return lines; | 299 | return lines / 2; |
263 | } | 300 | } |
264 | 301 | ||
265 | void move_down(void) | 302 | void move_down(void) |
266 | { | 303 | { |
267 | int l; | 304 | int l; |
305 | char s[25]; | ||
268 | if(!valid_position(current_x,current_y+1,current_b,current_f)) | 306 | if(!valid_position(current_x,current_y+1,current_b,current_f)) |
269 | { | 307 | { |
270 | to_virtual(); | 308 | to_virtual(); |
271 | l = check_lines(); | 309 | l = check_lines(); |
272 | if(l) | 310 | if(l) |
273 | { | 311 | { |
274 | lines += l; | 312 | lines += l; |
@@ -278,11 +316,13 @@ void move_down(void) | |||
278 | from_virtual(); | 316 | from_virtual(); |
279 | score += l*l; | 317 | score += l*l; |
280 | } | 318 | } |
319 | sprintf (s, "%d Rows - Level %d", lines, level); | ||
320 | lcd_putsxy (2, 52, s, 0); | ||
281 | new_block(); | 321 | new_block(); |
282 | move_block(0,0,0); | 322 | move_block(0,0,0); |
283 | } | 323 | } |
284 | else | 324 | else |
285 | move_block(0,1,0); | 325 | move_block(0,2,0); |
286 | } | 326 | } |
287 | 327 | ||
288 | void game_loop(void) | 328 | void game_loop(void) |
@@ -298,10 +338,10 @@ void game_loop(void) | |||
298 | return; /* get out of here */ | 338 | return; /* get out of here */ |
299 | 339 | ||
300 | if ( b & BUTTON_LEFT ) { | 340 | if ( b & BUTTON_LEFT ) { |
301 | move_block(-1,0,0); | 341 | move_block(-2,0,0); |
302 | } | 342 | } |
303 | if ( b & BUTTON_RIGHT ) { | 343 | if ( b & BUTTON_RIGHT ) { |
304 | move_block(1,0,0); | 344 | move_block(2,0,0); |
305 | } | 345 | } |
306 | if ( b & BUTTON_UP ) { | 346 | if ( b & BUTTON_UP ) { |
307 | move_block(0,0,1); | 347 | move_block(0,0,1); |
@@ -332,10 +372,10 @@ void game_loop(void) | |||
332 | void init_tetris(void) | 372 | void init_tetris(void) |
333 | { | 373 | { |
334 | memset(&virtual, 0, sizeof(virtual)); | 374 | memset(&virtual, 0, sizeof(virtual)); |
335 | start_x = 1; | 375 | start_x = 2; |
336 | start_y = 1; | 376 | start_y = 1; |
337 | max_x = 14; | 377 | max_x = 28; |
338 | max_y = 24; | 378 | max_y = 48; |
339 | current_x = 0; | 379 | current_x = 0; |
340 | current_y = 0; | 380 | current_y = 0; |
341 | current_f = 0; | 381 | current_f = 0; |
@@ -351,9 +391,12 @@ void tetris(void) | |||
351 | { | 391 | { |
352 | init_tetris(); | 392 | init_tetris(); |
353 | 393 | ||
354 | draw_frame(start_x-1,start_x+max_x,start_y-1,start_y+max_y); | 394 | draw_frame(start_x,start_x + max_x - 1, start_y - 1, start_y + max_y); |
355 | lcd_putsxy(TETRIS_TITLE_XLOC, TETRIS_TITLE_YLOC, TETRIS_TITLE, | 395 | lcd_putsxy(TETRIS_TITLE_XLOC, TETRIS_TITLE_YLOC, TETRIS_TITLE, |
356 | TETRIS_TITLE_FONT); | 396 | TETRIS_TITLE_FONT); |
397 | lcd_putsxy(TETRIS_TITLE_XLOC, TETRIS_TITLE_YLOC + 16, "*******", | ||
398 | TETRIS_TITLE_FONT); | ||
399 | lcd_putsxy (2, 52, "0 Rows - Level 0", 0); | ||
357 | lcd_update(); | 400 | lcd_update(); |
358 | 401 | ||
359 | next_b = t_rand(blocks); | 402 | next_b = t_rand(blocks); |