forked from len0rd/rockbox
snake2: improve redrawing after pause. wrap some long lines.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22409 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
08bf107214
commit
f3439293e3
1 changed files with 129 additions and 42 deletions
|
@ -543,44 +543,62 @@ void init_snake(void)
|
||||||
new_level(level_from_file);
|
new_level(level_from_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (LCD_WIDTH >= 160) && (LCD_HEIGHT >= 128)
|
||||||
|
void draw_frame_bitmap(int header_type)
|
||||||
|
{
|
||||||
|
rb->lcd_bitmap(header_type==1? snake2_header1: snake2_header2, 0, 0,
|
||||||
|
BMPWIDTH_snake2_header, BMPHEIGHT_snake2_header);
|
||||||
|
rb->lcd_bitmap(snake2_left, 0, BMPHEIGHT_snake2_header,
|
||||||
|
BMPWIDTH_snake2_left, BMPHEIGHT_snake2_left);
|
||||||
|
rb->lcd_bitmap(snake2_right,
|
||||||
|
LCD_WIDTH - BMPWIDTH_snake2_right, BMPHEIGHT_snake2_header,
|
||||||
|
BMPWIDTH_snake2_right, BMPHEIGHT_snake2_right);
|
||||||
|
rb->lcd_bitmap(snake2_bottom,
|
||||||
|
0, BMPHEIGHT_snake2_header + BMPHEIGHT_snake2_left,
|
||||||
|
BMPWIDTH_snake2_bottom, BMPHEIGHT_snake2_bottom);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Draws the apple. If it doesn't exist then
|
** Draws the apple. If it doesn't exist then
|
||||||
** a new one get's created.
|
** a new one get's created.
|
||||||
*/
|
*/
|
||||||
|
void draw_apple_bit(int x, int y)
|
||||||
|
{
|
||||||
|
rb->lcd_fillrect((CENTER_X+x*MULTIPLIER)+1, CENTER_Y+y*MULTIPLIER,
|
||||||
|
MODIFIER_2, MODIFIER_1);
|
||||||
|
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER, (CENTER_Y+y*MULTIPLIER)+1,
|
||||||
|
MODIFIER_1, MODIFIER_2);
|
||||||
|
}
|
||||||
|
|
||||||
void draw_apple( void )
|
void draw_apple( void )
|
||||||
{
|
{
|
||||||
int x,y;
|
int x,y;
|
||||||
|
|
||||||
#if LCD_WIDTH >= 160 && LCD_HEIGHT >= 128
|
#if LCD_WIDTH >= 160 && LCD_HEIGHT >= 128
|
||||||
char pscore[5], counter[4];
|
draw_frame_bitmap(2);
|
||||||
|
|
||||||
rb->lcd_bitmap(snake2_header2,0,0,BMPWIDTH_snake2_header, BMPHEIGHT_snake2_header);
|
rb->snprintf(strbuf, sizeof(strbuf), "%d", applecount);
|
||||||
rb->lcd_bitmap(snake2_left,0,BMPHEIGHT_snake2_header,BMPWIDTH_snake2_left, BMPHEIGHT_snake2_left);
|
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
|
||||||
rb->lcd_bitmap(snake2_right,LCD_WIDTH-BMPWIDTH_snake2_right,BMPHEIGHT_snake2_header,BMPWIDTH_snake2_right, BMPHEIGHT_snake2_right);
|
rb->lcd_putsxy(TOP_X3 - strwdt/2, TOP_Y2, strbuf);
|
||||||
rb->lcd_bitmap(snake2_bottom,0,BMPHEIGHT_snake2_header+BMPHEIGHT_snake2_left,BMPWIDTH_snake2_bottom, BMPHEIGHT_snake2_bottom);
|
|
||||||
|
|
||||||
rb->snprintf(counter,sizeof(counter),"%d",applecount);
|
rb->snprintf(strbuf, sizeof(strbuf), "%d", score);
|
||||||
rb->lcd_getstringsize(counter,&strwdt,&strhgt);
|
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
|
||||||
rb->lcd_putsxy(TOP_X3-strwdt/2,TOP_Y2,counter);
|
rb->lcd_putsxy(TOP_X4 - strwdt/2, TOP_Y2, strbuf);
|
||||||
|
|
||||||
rb->snprintf(pscore,sizeof(pscore),"%d",score);
|
|
||||||
rb->lcd_getstringsize(pscore,&strwdt,&strhgt);
|
|
||||||
rb->lcd_putsxy(TOP_X4-strwdt/2,TOP_Y2,pscore);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!apple)
|
if (!apple)
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
x = (rb->rand() % (WIDTH-1))+1;
|
x = (rb->rand() % (WIDTH-1))+1;
|
||||||
y = (rb->rand() % (HEIGHT-1))+1;
|
y = (rb->rand() % (HEIGHT-1))+1;
|
||||||
} while (board[x][y]);
|
} while (board[x][y]);
|
||||||
apple=1;
|
apple = 1;
|
||||||
board[x][y]=-1;
|
board[x][y] = -1;
|
||||||
applex = x;appley = y;
|
applex = x;appley = y;
|
||||||
}
|
}
|
||||||
rb->lcd_fillrect((CENTER_X+applex*MULTIPLIER)+1,CENTER_Y+appley*MULTIPLIER,MODIFIER_2,MODIFIER_1);
|
draw_apple_bit(applex, appley);
|
||||||
rb->lcd_fillrect(CENTER_X+applex*MULTIPLIER,(CENTER_Y+appley*MULTIPLIER)+1,MODIFIER_1,MODIFIER_2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -591,7 +609,8 @@ void draw_apple( void )
|
||||||
*/
|
*/
|
||||||
void draw_vertical_bit(int x, int y)
|
void draw_vertical_bit(int x, int y)
|
||||||
{
|
{
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+1,CENTER_Y+y*MULTIPLIER,MODIFIER_2,MODIFIER_1);
|
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+1, CENTER_Y+y*MULTIPLIER,
|
||||||
|
MODIFIER_2, MODIFIER_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -602,7 +621,8 @@ void draw_vertical_bit(int x, int y)
|
||||||
*/
|
*/
|
||||||
void draw_horizontal_bit(int x, int y)
|
void draw_horizontal_bit(int x, int y)
|
||||||
{
|
{
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER,CENTER_Y+y*MULTIPLIER+1,MODIFIER_1,MODIFIER_2);
|
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER, CENTER_Y+y*MULTIPLIER+1,
|
||||||
|
MODIFIER_1, MODIFIER_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -613,8 +633,10 @@ void draw_horizontal_bit(int x, int y)
|
||||||
*/
|
*/
|
||||||
void draw_n_to_e_bit(int x, int y)
|
void draw_n_to_e_bit(int x, int y)
|
||||||
{
|
{
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+1,CENTER_Y+y*MULTIPLIER+2,MODIFIER_2,MODIFIER_2);
|
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+1, CENTER_Y+y*MULTIPLIER+2,
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+2,CENTER_Y+y*MULTIPLIER+1,MODIFIER_2,MODIFIER_2);
|
MODIFIER_2, MODIFIER_2);
|
||||||
|
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+2, CENTER_Y+y*MULTIPLIER+1,
|
||||||
|
MODIFIER_2, MODIFIER_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -636,8 +658,10 @@ void draw_w_to_s_bit(int x, int y)
|
||||||
*/
|
*/
|
||||||
void draw_n_to_w_bit(int x, int y)
|
void draw_n_to_w_bit(int x, int y)
|
||||||
{
|
{
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER,CENTER_Y+y*MULTIPLIER+1,MODIFIER_2,MODIFIER_2);
|
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER, CENTER_Y+y*MULTIPLIER+1,
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+1,CENTER_Y+y*MULTIPLIER+2,MODIFIER_2,MODIFIER_2);
|
MODIFIER_2, MODIFIER_2);
|
||||||
|
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+1, CENTER_Y+y*MULTIPLIER+2,
|
||||||
|
MODIFIER_2, MODIFIER_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -659,8 +683,10 @@ void draw_e_to_s_bit(int x, int y)
|
||||||
*/
|
*/
|
||||||
void draw_s_to_e_bit(int x, int y)
|
void draw_s_to_e_bit(int x, int y)
|
||||||
{
|
{
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+1,CENTER_Y+y*MULTIPLIER,MODIFIER_2,MODIFIER_2);
|
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+1, CENTER_Y+y*MULTIPLIER,
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+2,CENTER_Y+y*MULTIPLIER+1,MODIFIER_2,MODIFIER_2);
|
MODIFIER_2, MODIFIER_2);
|
||||||
|
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+2, CENTER_Y+y*MULTIPLIER+1,
|
||||||
|
MODIFIER_2, MODIFIER_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -682,8 +708,10 @@ void draw_w_to_n_bit(int x, int y)
|
||||||
*/
|
*/
|
||||||
void draw_e_to_n_bit(int x, int y)
|
void draw_e_to_n_bit(int x, int y)
|
||||||
{
|
{
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+1,CENTER_Y+y*MULTIPLIER,MODIFIER_2,MODIFIER_2);
|
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER+1, CENTER_Y+y*MULTIPLIER,
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER,CENTER_Y+y*MULTIPLIER+1,MODIFIER_2,MODIFIER_2);
|
MODIFIER_2, MODIFIER_2);
|
||||||
|
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER, CENTER_Y+y*MULTIPLIER+1,
|
||||||
|
MODIFIER_2, MODIFIER_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -697,6 +725,12 @@ void draw_s_to_w_bit(int x, int y)
|
||||||
draw_e_to_n_bit(x, y);
|
draw_e_to_n_bit(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void draw_head_bit(int x, int y)
|
||||||
|
{
|
||||||
|
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER, CENTER_Y+y*MULTIPLIER,
|
||||||
|
MODIFIER_1, MODIFIER_1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Draws a wall/obsticals
|
** Draws a wall/obsticals
|
||||||
*/
|
*/
|
||||||
|
@ -748,8 +782,7 @@ void redraw (void)
|
||||||
switch (board[x][y])
|
switch (board[x][y])
|
||||||
{
|
{
|
||||||
case -1:
|
case -1:
|
||||||
rb->lcd_fillrect((CENTER_X+x*MULTIPLIER)+1,CENTER_Y+y*MULTIPLIER,MODIFIER_2,MODIFIER_1);
|
draw_apple_bit(x, y);
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER,(CENTER_Y+y*MULTIPLIER)+1,MODIFIER_1,MODIFIER_2);
|
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
|
@ -765,11 +798,23 @@ void redraw (void)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER,CENTER_Y+y*MULTIPLIER,MODIFIER_1,MODIFIER_1);
|
draw_head_bit(x, y);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LCD_WIDTH >= 160 && LCD_HEIGHT >= 128
|
||||||
|
draw_frame_bitmap(2);
|
||||||
|
|
||||||
|
rb->snprintf(strbuf, sizeof(strbuf), "%d", applecount);
|
||||||
|
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
|
||||||
|
rb->lcd_putsxy(TOP_X3 - strwdt/2, TOP_Y2, strbuf);
|
||||||
|
|
||||||
|
rb->snprintf(strbuf, sizeof(strbuf), "%d", score);
|
||||||
|
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
|
||||||
|
rb->lcd_putsxy(TOP_X4 - strwdt/2, TOP_Y2, strbuf);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -779,7 +824,7 @@ void redraw (void)
|
||||||
void draw_snake_bit(int currentbit, int previousbit, int x, int y)
|
void draw_snake_bit(int currentbit, int previousbit, int x, int y)
|
||||||
{
|
{
|
||||||
rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
|
rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
|
||||||
rb->lcd_fillrect(CENTER_X+x*MULTIPLIER,CENTER_Y+y*MULTIPLIER,MODIFIER_1,MODIFIER_1);
|
draw_head_bit(x, y);
|
||||||
rb->lcd_set_drawmode(DRMODE_SOLID);
|
rb->lcd_set_drawmode(DRMODE_SOLID);
|
||||||
|
|
||||||
switch(currentbit)
|
switch(currentbit)
|
||||||
|
@ -858,6 +903,50 @@ void draw_snake_bit(int currentbit, int previousbit, int x, int y)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void redraw_snake(void)
|
||||||
|
{
|
||||||
|
int x = tailx, y = taily;
|
||||||
|
int olddir, newdir = board[x][y];
|
||||||
|
|
||||||
|
while (x != headx || y != heady)
|
||||||
|
{
|
||||||
|
olddir = newdir;
|
||||||
|
|
||||||
|
switch (olddir)
|
||||||
|
{
|
||||||
|
case(NORTH):
|
||||||
|
y--;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case(EAST):
|
||||||
|
x++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case(SOUTH):
|
||||||
|
y++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case(WEST):
|
||||||
|
x--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(x == WIDTH)
|
||||||
|
x = 0;
|
||||||
|
else if(x < 0)
|
||||||
|
x = WIDTH-1;
|
||||||
|
|
||||||
|
if(y == HEIGHT)
|
||||||
|
y = 0;
|
||||||
|
else if(y < 0)
|
||||||
|
y = HEIGHT-1;
|
||||||
|
|
||||||
|
newdir = board[x][y];
|
||||||
|
if(olddir != newdir)
|
||||||
|
draw_snake_bit(newdir, olddir, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Death 'sequence' and end game stuff.
|
** Death 'sequence' and end game stuff.
|
||||||
*/
|
*/
|
||||||
|
@ -1004,13 +1093,13 @@ void move( void )
|
||||||
else if(heady < 0)
|
else if(heady < 0)
|
||||||
heady = HEIGHT-1;
|
heady = HEIGHT-1;
|
||||||
|
|
||||||
rb->lcd_fillrect(CENTER_X+headx*MULTIPLIER,CENTER_Y+heady*MULTIPLIER,MODIFIER_1,MODIFIER_1);
|
draw_head_bit(headx, heady);
|
||||||
|
|
||||||
/*clear tail*/
|
/*clear tail*/
|
||||||
if(applecountdown <= 0)
|
if(applecountdown <= 0)
|
||||||
{
|
{
|
||||||
rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
|
rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
|
||||||
rb->lcd_fillrect(CENTER_X+tailx*MULTIPLIER,CENTER_Y+taily*MULTIPLIER,MODIFIER_1,MODIFIER_1);
|
draw_head_bit(tailx, taily);
|
||||||
rb->lcd_set_drawmode(DRMODE_SOLID);
|
rb->lcd_set_drawmode(DRMODE_SOLID);
|
||||||
|
|
||||||
taildir = board[tailx][taily];
|
taildir = board[tailx][taily];
|
||||||
|
@ -1123,6 +1212,8 @@ void game_pause (void)
|
||||||
{
|
{
|
||||||
case SNAKE2_PLAYPAUSE:
|
case SNAKE2_PLAYPAUSE:
|
||||||
redraw();
|
redraw();
|
||||||
|
redraw_snake();
|
||||||
|
draw_head_bit(headx, heady);
|
||||||
rb->lcd_update();
|
rb->lcd_update();
|
||||||
rb->sleep(HZ/2);
|
rb->sleep(HZ/2);
|
||||||
return;
|
return;
|
||||||
|
@ -1217,7 +1308,7 @@ void game (void)
|
||||||
case SNAKE2_RC_QUIT:
|
case SNAKE2_RC_QUIT:
|
||||||
#endif
|
#endif
|
||||||
case SNAKE2_QUIT:
|
case SNAKE2_QUIT:
|
||||||
dead=1;
|
quit = 1;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case SNAKE2_PLAYPAUSE:
|
case SNAKE2_PLAYPAUSE:
|
||||||
|
@ -1247,11 +1338,7 @@ void select_maze(void)
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
#if LCD_WIDTH >= 160 && LCD_HEIGHT >= 128
|
#if LCD_WIDTH >= 160 && LCD_HEIGHT >= 128
|
||||||
|
draw_frame_bitmap(1);
|
||||||
rb->lcd_bitmap(snake2_header1,0,0,BMPWIDTH_snake2_header, BMPHEIGHT_snake2_header);
|
|
||||||
rb->lcd_bitmap(snake2_left,0,BMPHEIGHT_snake2_header,BMPWIDTH_snake2_left, BMPHEIGHT_snake2_left);
|
|
||||||
rb->lcd_bitmap(snake2_right,LCD_WIDTH-BMPWIDTH_snake2_right,BMPHEIGHT_snake2_header,BMPWIDTH_snake2_right, BMPHEIGHT_snake2_right);
|
|
||||||
rb->lcd_bitmap(snake2_bottom,0,BMPHEIGHT_snake2_header+BMPHEIGHT_snake2_left,BMPWIDTH_snake2_bottom, BMPHEIGHT_snake2_bottom);
|
|
||||||
|
|
||||||
rb->snprintf(strbuf, sizeof(strbuf), "%d", level);
|
rb->snprintf(strbuf, sizeof(strbuf), "%d", level);
|
||||||
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
|
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue