forked from len0rd/rockbox
sliding_puzzle improvements: * Use the UI font for numerals and 'moves' display when possible. * Center the numerals and the 'moves' display. * Use a simple line separator. * Use black text on white background for greyscale targets. * Simplify the code a bit.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16207 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
e686f17ec1
commit
6f65afd0b7
1 changed files with 83 additions and 62 deletions
|
|
@ -140,8 +140,11 @@ static const char* const picmode_descriptions[] = {
|
||||||
|
|
||||||
static int spots[NUM_SPOTS];
|
static int spots[NUM_SPOTS];
|
||||||
static int hole = INITIAL_HOLE, moves;
|
static int hole = INITIAL_HOLE, moves;
|
||||||
static char s[5];
|
static unsigned char s[32];
|
||||||
static enum picmodes picmode = PICMODE_INITIAL_PICTURE;
|
static enum picmodes picmode = PICMODE_INITIAL_PICTURE;
|
||||||
|
static int num_font = FONT_UI;
|
||||||
|
static int moves_font = FONT_UI;
|
||||||
|
static int moves_y = 0;
|
||||||
|
|
||||||
static unsigned char img_buf[IMAGE_WIDTH*IMAGE_HEIGHT*sizeof(fb_data)]
|
static unsigned char img_buf[IMAGE_WIDTH*IMAGE_HEIGHT*sizeof(fb_data)]
|
||||||
__attribute__ ((aligned(16)));
|
__attribute__ ((aligned(16)));
|
||||||
|
|
@ -155,7 +158,6 @@ static char albumart_path[MAX_PATH+1];
|
||||||
static char img_buf_path[MAX_PATH+1];
|
static char img_buf_path[MAX_PATH+1];
|
||||||
|
|
||||||
static const fb_data * puzzle_bmp_ptr;
|
static const fb_data * puzzle_bmp_ptr;
|
||||||
extern const fb_data sliding_puzzle[];
|
|
||||||
/* initial_bmp_path points to selected bitmap if this game is launched
|
/* initial_bmp_path points to selected bitmap if this game is launched
|
||||||
as a viewer for a .bmp file, or NULL if game is launched regular way */
|
as a viewer for a .bmp file, or NULL if game is launched regular way */
|
||||||
static const char * initial_bmp_path=NULL;
|
static const char * initial_bmp_path=NULL;
|
||||||
|
|
@ -265,6 +267,8 @@ static bool load_resize_bitmap(void)
|
||||||
/* draws a spot at the coordinates (x,y), range of p is 1-20 */
|
/* draws a spot at the coordinates (x,y), range of p is 1-20 */
|
||||||
static void draw_spot(int p, int x, int y)
|
static void draw_spot(int p, int x, int y)
|
||||||
{
|
{
|
||||||
|
int w, h;
|
||||||
|
|
||||||
if (p == HOLE_ID)
|
if (p == HOLE_ID)
|
||||||
{
|
{
|
||||||
#if LCD_DEPTH==1
|
#if LCD_DEPTH==1
|
||||||
|
|
@ -275,10 +279,10 @@ static void draw_spot(int p, int x, int y)
|
||||||
IMAGE_WIDTH, x, y, SPOTS_WIDTH, SPOTS_HEIGHT);
|
IMAGE_WIDTH, x, y, SPOTS_WIDTH, SPOTS_HEIGHT);
|
||||||
#else
|
#else
|
||||||
/* just draw a black rectangle */
|
/* just draw a black rectangle */
|
||||||
rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
|
int old_fg = rb->lcd_get_foreground();
|
||||||
rb->lcd_set_background(LCD_BLACK);
|
rb->lcd_set_foreground(LCD_BLACK);
|
||||||
rb->lcd_fillrect(x,y,SPOTS_WIDTH,SPOTS_HEIGHT);
|
rb->lcd_fillrect(x,y,SPOTS_WIDTH,SPOTS_HEIGHT);
|
||||||
rb->lcd_set_drawmode(DRMODE_SOLID);
|
rb->lcd_set_foreground(old_fg);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (picmode != PICMODE_NUMERALS)
|
else if (picmode != PICMODE_NUMERALS)
|
||||||
|
|
@ -292,7 +296,10 @@ static void draw_spot(int p, int x, int y)
|
||||||
rb->lcd_fillrect(x+1, y+1, SPOTS_WIDTH-2, SPOTS_HEIGHT-2);
|
rb->lcd_fillrect(x+1, y+1, SPOTS_WIDTH-2, SPOTS_HEIGHT-2);
|
||||||
rb->lcd_set_drawmode(DRMODE_SOLID);
|
rb->lcd_set_drawmode(DRMODE_SOLID);
|
||||||
rb->snprintf(s, sizeof(s), "%d", p);
|
rb->snprintf(s, sizeof(s), "%d", p);
|
||||||
rb->lcd_putsxy(x+2, y+4, (unsigned char *)s);
|
rb->lcd_setfont(num_font);
|
||||||
|
rb->lcd_getstringsize(s, &w, &h);
|
||||||
|
rb->lcd_putsxy(x + (SPOTS_WIDTH/2) - w / 2,
|
||||||
|
y + (SPOTS_HEIGHT/2) - h / 2, s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -309,16 +316,20 @@ static bool puzzle_finished(void)
|
||||||
/* move a piece in any direction */
|
/* move a piece in any direction */
|
||||||
static void move_spot(int x, int y)
|
static void move_spot(int x, int y)
|
||||||
{
|
{
|
||||||
int i;
|
int i, w;
|
||||||
spots[hole] = spots[hole-x-SPOTS_X*y];
|
spots[hole] = spots[hole-x-SPOTS_X*y];
|
||||||
hole -= (x+SPOTS_X*y);
|
hole -= (x+SPOTS_X*y);
|
||||||
moves++;
|
moves++;
|
||||||
|
rb->lcd_setfont(moves_font);
|
||||||
|
#if LCD_WIDTH > LCD_HEIGHT
|
||||||
rb->snprintf(s, sizeof(s), "%d", moves);
|
rb->snprintf(s, sizeof(s), "%d", moves);
|
||||||
s[sizeof(s)-1] = '\0';
|
w = rb->lcd_getstringsize(s, NULL, NULL);
|
||||||
#if ((LCD_WIDTH - IMAGE_SIZE) > (LCD_HEIGHT - IMAGE_HEIGHT))
|
rb->lcd_putsxy((IMAGE_WIDTH+1+(LCD_WIDTH-IMAGE_WIDTH-1)/2) - w / 2,
|
||||||
rb->lcd_putsxy(IMAGE_WIDTH+5, 20, (unsigned char *)s);
|
moves_y, s);
|
||||||
#else
|
#else
|
||||||
rb->lcd_putsxy(40, IMAGE_HEIGHT+7, (unsigned char *)s);
|
(void)w;
|
||||||
|
rb->snprintf(s, sizeof(s), "Moves: %d", moves);
|
||||||
|
rb->lcd_putsxy(3, moves_y, s);
|
||||||
#endif
|
#endif
|
||||||
for(i=1;i<=4;i++)
|
for(i=1;i<=4;i++)
|
||||||
{
|
{
|
||||||
|
|
@ -342,25 +353,41 @@ static void move_spot(int x, int y)
|
||||||
spots[hole] = HOLE_ID;
|
spots[hole] = HOLE_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void draw_playfield(void)
|
||||||
|
{
|
||||||
|
int i, w;
|
||||||
|
|
||||||
|
rb->lcd_clear_display();
|
||||||
|
rb->lcd_setfont(moves_font);
|
||||||
|
#if LCD_WIDTH > LCD_HEIGHT
|
||||||
|
rb->lcd_vline(IMAGE_WIDTH, 0, LCD_HEIGHT-1);
|
||||||
|
w = rb->lcd_getstringsize("Moves", NULL, NULL);
|
||||||
|
rb->lcd_putsxy((IMAGE_WIDTH+1+(LCD_WIDTH-IMAGE_WIDTH-1)/2) - w / 2,
|
||||||
|
10, "Moves");
|
||||||
|
rb->snprintf(s, sizeof(s), "%d", moves);
|
||||||
|
w = rb->lcd_getstringsize(s, NULL, NULL);
|
||||||
|
rb->lcd_putsxy((IMAGE_WIDTH+1+(LCD_WIDTH-IMAGE_WIDTH-1)/2) - w / 2,
|
||||||
|
moves_y, s);
|
||||||
|
#else
|
||||||
|
(void)w;
|
||||||
|
rb->lcd_hline(0, LCD_WIDTH-1, IMAGE_HEIGHT);
|
||||||
|
rb->snprintf(s, sizeof(s), "Moves: %d", moves);
|
||||||
|
rb->lcd_putsxy(3, moves_y, s);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* draw spots to the lcd */
|
||||||
|
for (i=0; i<NUM_SPOTS; i++)
|
||||||
|
draw_spot(spots[i], (i%SPOTS_X)*SPOTS_WIDTH, (i/SPOTS_X)*SPOTS_HEIGHT);
|
||||||
|
|
||||||
|
rb->lcd_update();
|
||||||
|
}
|
||||||
|
|
||||||
/* initializes the puzzle */
|
/* initializes the puzzle */
|
||||||
static void puzzle_init(void)
|
static void puzzle_init(void)
|
||||||
{
|
{
|
||||||
int i, r, temp, tsp[NUM_SPOTS];
|
int i, r, temp, tsp[NUM_SPOTS];
|
||||||
|
|
||||||
moves = 0;
|
moves = 0;
|
||||||
rb->lcd_clear_display();
|
|
||||||
rb->snprintf(s, sizeof(s), "%d", moves);
|
|
||||||
|
|
||||||
#if ((LCD_WIDTH - IMAGE_SIZE) > (LCD_HEIGHT - IMAGE_HEIGHT))
|
|
||||||
rb->lcd_drawrect(IMAGE_WIDTH, 0, LCD_WIDTH-IMAGE_WIDTH, IMAGE_HEIGHT);
|
|
||||||
rb->lcd_putsxy(IMAGE_WIDTH+1, 10, (unsigned char *)"Moves");
|
|
||||||
rb->lcd_putsxy(IMAGE_WIDTH+5, 20, (unsigned char *)s);
|
|
||||||
#else
|
|
||||||
rb->lcd_drawrect(0, IMAGE_HEIGHT, IMAGE_WIDTH,
|
|
||||||
(LCD_HEIGHT-IMAGE_HEIGHT));
|
|
||||||
rb->lcd_putsxy(3, IMAGE_HEIGHT+7, (unsigned char *)"Moves: ");
|
|
||||||
rb->lcd_putsxy(40, IMAGE_HEIGHT+7, (unsigned char *)s);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* shuffle spots */
|
/* shuffle spots */
|
||||||
for (i=NUM_SPOTS-1; i>=0; i--) {
|
for (i=NUM_SPOTS-1; i>=0; i--) {
|
||||||
|
|
@ -407,11 +434,7 @@ static void puzzle_init(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draw spots to the lcd */
|
draw_playfield();
|
||||||
for (i=0; i<NUM_SPOTS; i++)
|
|
||||||
draw_spot(spots[i], (i%SPOTS_X)*SPOTS_WIDTH, (i/SPOTS_X)*SPOTS_HEIGHT);
|
|
||||||
|
|
||||||
rb->lcd_update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the main game loop */
|
/* the main game loop */
|
||||||
|
|
@ -419,7 +442,6 @@ static int puzzle_loop(void)
|
||||||
{
|
{
|
||||||
int button;
|
int button;
|
||||||
int lastbutton = BUTTON_NONE;
|
int lastbutton = BUTTON_NONE;
|
||||||
int i;
|
|
||||||
bool load_success;
|
bool load_success;
|
||||||
|
|
||||||
puzzle_init();
|
puzzle_init();
|
||||||
|
|
@ -461,22 +483,7 @@ static int puzzle_loop(void)
|
||||||
|
|
||||||
/* tell the user what mode we picked in the end! */
|
/* tell the user what mode we picked in the end! */
|
||||||
rb->splash(HZ,picmode_descriptions[ picmode ] );
|
rb->splash(HZ,picmode_descriptions[ picmode ] );
|
||||||
rb->lcd_clear_display();
|
draw_playfield();
|
||||||
#if ((LCD_WIDTH - IMAGE_SIZE) > (LCD_HEIGHT - IMAGE_HEIGHT))
|
|
||||||
rb->lcd_drawrect(IMAGE_WIDTH, 0, LCD_WIDTH-IMAGE_WIDTH,
|
|
||||||
IMAGE_HEIGHT);
|
|
||||||
rb->lcd_putsxy(IMAGE_WIDTH+1, 10, (unsigned char *)"Moves");
|
|
||||||
#else
|
|
||||||
rb->lcd_drawrect(0, IMAGE_HEIGHT, IMAGE_WIDTH,
|
|
||||||
(LCD_HEIGHT-IMAGE_HEIGHT));
|
|
||||||
rb->lcd_putsxy(3, IMAGE_HEIGHT+7, (unsigned char *)"Moves: ");
|
|
||||||
#endif
|
|
||||||
for (i=0; i<NUM_SPOTS; i++)
|
|
||||||
draw_spot(spots[i],
|
|
||||||
(i%SPOTS_X)*SPOTS_WIDTH,
|
|
||||||
(i/SPOTS_X)*SPOTS_HEIGHT);
|
|
||||||
rb->lcd_update();
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BUTTON_LEFT:
|
case BUTTON_LEFT:
|
||||||
|
|
@ -594,27 +601,41 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
|
||||||
return PLUGIN_OK;
|
return PLUGIN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if LCD_DEPTH>1
|
/* Calculate possible font sizes and text positions */
|
||||||
|
rb->lcd_setfont(FONT_UI);
|
||||||
|
rb->lcd_getstringsize("15", &w, &h);
|
||||||
|
if ((w > (SPOTS_WIDTH-2)) || (h > (SPOTS_HEIGHT-2)))
|
||||||
|
num_font = FONT_SYSFIXED;
|
||||||
|
|
||||||
|
#if LCD_WIDTH > LCD_HEIGHT
|
||||||
|
rb->lcd_getstringsize("Moves", &w, &h);
|
||||||
|
if (w > (LCD_WIDTH-IMAGE_WIDTH-1))
|
||||||
|
moves_font = FONT_SYSFIXED;
|
||||||
|
rb->lcd_setfont(moves_font);
|
||||||
|
rb->lcd_getstringsize("Moves", &w, &h);
|
||||||
|
moves_y = 10 + h;
|
||||||
|
#else
|
||||||
|
rb->lcd_getstringsize("Moves: 999", &w, &h);
|
||||||
|
if ((w > LCD_WIDTH) || (h > (LCD_HEIGHT-IMAGE_HEIGHT-1)))
|
||||||
|
moves_font = FONT_SYSFIXED;
|
||||||
|
rb->lcd_setfont(moves_font);
|
||||||
|
rb->lcd_getstringsize("Moves: 999", &w, &h);
|
||||||
|
moves_y = (IMAGE_HEIGHT+1+(LCD_HEIGHT-IMAGE_HEIGHT-1)/2) - h / 2;
|
||||||
|
#endif
|
||||||
|
for (i=0; i<NUM_SPOTS; i++)
|
||||||
|
spots[i]=(i+1);
|
||||||
|
|
||||||
|
#ifdef HAVE_LCD_COLOR
|
||||||
rb->lcd_set_background(LCD_BLACK);
|
rb->lcd_set_background(LCD_BLACK);
|
||||||
rb->lcd_set_foreground(LCD_WHITE);
|
rb->lcd_set_foreground(LCD_WHITE);
|
||||||
rb->lcd_set_backdrop(NULL);
|
rb->lcd_set_backdrop(NULL);
|
||||||
|
#elif LCD_DEPTH > 1
|
||||||
|
rb->lcd_set_background(LCD_WHITE);
|
||||||
|
rb->lcd_set_foreground(LCD_BLACK);
|
||||||
|
rb->lcd_set_backdrop(NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rb->lcd_clear_display();
|
draw_playfield();
|
||||||
#if ((LCD_WIDTH - IMAGE_SIZE) > (LCD_HEIGHT - IMAGE_HEIGHT))
|
|
||||||
rb->lcd_drawrect(IMAGE_WIDTH, 0, LCD_WIDTH-IMAGE_WIDTH, IMAGE_HEIGHT);
|
|
||||||
rb->lcd_putsxy(IMAGE_WIDTH+1, 10, (unsigned char *)"Moves");
|
|
||||||
#else
|
|
||||||
rb->lcd_drawrect(0, IMAGE_HEIGHT, IMAGE_WIDTH,
|
|
||||||
(LCD_HEIGHT-IMAGE_HEIGHT));
|
|
||||||
rb->lcd_putsxy(3, IMAGE_HEIGHT+7, (unsigned char *)"Moves: ");
|
|
||||||
#endif
|
|
||||||
for (i=0; i<NUM_SPOTS; i++) {
|
|
||||||
spots[i]=(i+1);
|
|
||||||
draw_spot(spots[i], (i%SPOTS_X)*SPOTS_WIDTH, (i/SPOTS_X)*SPOTS_HEIGHT);
|
|
||||||
}
|
|
||||||
|
|
||||||
rb->lcd_update();
|
|
||||||
rb->sleep(HZ*2);
|
rb->sleep(HZ*2);
|
||||||
|
|
||||||
return puzzle_loop();
|
return puzzle_loop();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue