Small improvements to sliding puzzle. (1) Don't draw the 'Moves' box at fixed size, and display 'Moves:' and number of moves on one line for square and portrait screens. (2) Use 4x4 spots on Archos too, to make the spots look square on the Archos display - change the default 80x64 image accordingly. (3) Replace the 110x110 images with 108x108 so that the width is evenly divisible by 4 (number of spots) as mentioned in the comment. (4) Make the greyscale images look a little less broken, could be even better though. -- The code could be made simpler and more flexible but one step at a time.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16200 a1c6a512-1295-4272-9138-f99709370657
|
@ -550,14 +550,14 @@ matrix_normal.bmp
|
||||||
#if (LCD_WIDTH != LCD_HEIGHT)
|
#if (LCD_WIDTH != LCD_HEIGHT)
|
||||||
#define SMALLER_DIMENSION ((LCD_WIDTH < LCD_HEIGHT) ? LCD_WIDTH : LCD_HEIGHT)
|
#define SMALLER_DIMENSION ((LCD_WIDTH < LCD_HEIGHT) ? LCD_WIDTH : LCD_HEIGHT)
|
||||||
#else /* 5/6GB H10 with square display */
|
#else /* 5/6GB H10 with square display */
|
||||||
#define SMALLER_DIMENSION (LCD_HEIGHT - 18)
|
#define SMALLER_DIMENSION (LCD_HEIGHT - 20)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined HAVE_LCD_COLOR
|
#if defined HAVE_LCD_COLOR
|
||||||
#if SMALLER_DIMENSION <= 80
|
#if SMALLER_DIMENSION <= 80
|
||||||
sliding_puzzle.80x80x16.bmp
|
sliding_puzzle.80x80x16.bmp
|
||||||
#elif SMALLER_DIMENSION <= 112
|
#elif SMALLER_DIMENSION <= 108
|
||||||
sliding_puzzle.110x110x16.bmp
|
sliding_puzzle.108x108x16.bmp
|
||||||
#elif SMALLER_DIMENSION <= 128
|
#elif SMALLER_DIMENSION <= 128
|
||||||
sliding_puzzle.128x128x16.bmp
|
sliding_puzzle.128x128x16.bmp
|
||||||
#elif SMALLER_DIMENSION <= 132
|
#elif SMALLER_DIMENSION <= 132
|
||||||
|
@ -569,7 +569,7 @@ matrix_normal.bmp
|
||||||
#endif
|
#endif
|
||||||
#elif (LCD_DEPTH > 1)
|
#elif (LCD_DEPTH > 1)
|
||||||
#if SMALLER_DIMENSION <= 110
|
#if SMALLER_DIMENSION <= 110
|
||||||
sliding_puzzle.110x110x2.bmp
|
sliding_puzzle.108x108x2.bmp
|
||||||
#elif SMALLER_DIMENSION <= 128
|
#elif SMALLER_DIMENSION <= 128
|
||||||
sliding_puzzle.128x128x2.bmp
|
sliding_puzzle.128x128x2.bmp
|
||||||
#endif
|
#endif
|
||||||
|
|
BIN
apps/plugins/bitmaps/native/sliding_puzzle.108x108x16.bmp
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
apps/plugins/bitmaps/native/sliding_puzzle.108x108x2.bmp
Normal file
After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 830 B After Width: | Height: | Size: 830 B |
|
@ -102,20 +102,14 @@ PLUGIN_HEADER
|
||||||
#define IMAGE_SIZE IMAGE_WIDTH
|
#define IMAGE_SIZE IMAGE_WIDTH
|
||||||
|
|
||||||
static struct plugin_api* rb;
|
static struct plugin_api* rb;
|
||||||
#if LCD_DEPTH==1
|
|
||||||
/* for Archos, use rectangular image, 5x4 puzzle */
|
/* use a square image, (the default Archos bitmap looks square on its display)
|
||||||
#define SPOTS_X 5
|
|
||||||
#define SPOTS_Y 4
|
|
||||||
#else
|
|
||||||
/* for other targets, use a square image, 4x4 puzzle
|
|
||||||
Puzzle image dimension is min(lcd_height,lcd_width)
|
Puzzle image dimension is min(lcd_height,lcd_width)
|
||||||
4x4 is more convenient than 5x4 for square puzzles
|
4x4 is more convenient for square puzzles
|
||||||
Note: sliding_puzzle.bmp should be evenly divisible by SPOTS_X
|
Note: sliding_puzzle.bmp should be evenly divisible by SPOTS_X
|
||||||
and SPOTS_Y, otherwise lcd_bitmap_part stride won't be correct */
|
and SPOTS_Y, otherwise lcd_bitmap_part stride won't be correct */
|
||||||
#define SPOTS_X 4
|
#define SPOTS_X 4
|
||||||
#define SPOTS_Y 4
|
#define SPOTS_Y 4
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SPOTS_WIDTH (IMAGE_WIDTH / SPOTS_X)
|
#define SPOTS_WIDTH (IMAGE_WIDTH / SPOTS_X)
|
||||||
#define SPOTS_HEIGHT (IMAGE_HEIGHT / SPOTS_Y)
|
#define SPOTS_HEIGHT (IMAGE_HEIGHT / SPOTS_Y)
|
||||||
#define NUM_SPOTS (SPOTS_X*SPOTS_Y)
|
#define NUM_SPOTS (SPOTS_X*SPOTS_Y)
|
||||||
|
@ -321,12 +315,11 @@ static void move_spot(int x, int y)
|
||||||
moves++;
|
moves++;
|
||||||
rb->snprintf(s, sizeof(s), "%d", moves);
|
rb->snprintf(s, sizeof(s), "%d", moves);
|
||||||
s[sizeof(s)-1] = '\0';
|
s[sizeof(s)-1] = '\0';
|
||||||
#if (LCD_WIDTH>IMAGE_SIZE)
|
#if ((LCD_WIDTH - IMAGE_SIZE) > (LCD_HEIGHT - IMAGE_HEIGHT))
|
||||||
rb->lcd_putsxy(IMAGE_WIDTH+5, 20, (unsigned char *)s);
|
rb->lcd_putsxy(IMAGE_WIDTH+5, 20, (unsigned char *)s);
|
||||||
#else
|
#else
|
||||||
rb->lcd_putsxy(5, IMAGE_HEIGHT+20, (unsigned char *)s);
|
rb->lcd_putsxy(40, IMAGE_HEIGHT+7, (unsigned char *)s);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for(i=1;i<=4;i++)
|
for(i=1;i<=4;i++)
|
||||||
{
|
{
|
||||||
draw_spot(HOLE_ID,
|
draw_spot(HOLE_ID,
|
||||||
|
@ -358,14 +351,15 @@ static void puzzle_init(void)
|
||||||
rb->lcd_clear_display();
|
rb->lcd_clear_display();
|
||||||
rb->snprintf(s, sizeof(s), "%d", moves);
|
rb->snprintf(s, sizeof(s), "%d", moves);
|
||||||
|
|
||||||
#if (LCD_WIDTH>IMAGE_SIZE)
|
#if ((LCD_WIDTH - IMAGE_SIZE) > (LCD_HEIGHT - IMAGE_HEIGHT))
|
||||||
rb->lcd_drawrect(IMAGE_WIDTH, 0, 32, 64);
|
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+1, 10, (unsigned char *)"Moves");
|
||||||
rb->lcd_putsxy(IMAGE_WIDTH+5, 20, (unsigned char *)s);
|
rb->lcd_putsxy(IMAGE_WIDTH+5, 20, (unsigned char *)s);
|
||||||
#else
|
#else
|
||||||
rb->lcd_drawrect(0, IMAGE_HEIGHT, 32, 64);
|
rb->lcd_drawrect(0, IMAGE_HEIGHT, IMAGE_WIDTH,
|
||||||
rb->lcd_putsxy(1, IMAGE_HEIGHT+10, (unsigned char *)"Moves");
|
(LCD_HEIGHT-IMAGE_HEIGHT));
|
||||||
rb->lcd_putsxy(5, IMAGE_HEIGHT+20, (unsigned char *)s);
|
rb->lcd_putsxy(3, IMAGE_HEIGHT+7, (unsigned char *)"Moves: ");
|
||||||
|
rb->lcd_putsxy(40, IMAGE_HEIGHT+7, (unsigned char *)s);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* shuffle spots */
|
/* shuffle spots */
|
||||||
|
@ -468,14 +462,15 @@ 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();
|
rb->lcd_clear_display();
|
||||||
#if (LCD_WIDTH>IMAGE_SIZE)
|
#if ((LCD_WIDTH - IMAGE_SIZE) > (LCD_HEIGHT - IMAGE_HEIGHT))
|
||||||
rb->lcd_drawrect(IMAGE_WIDTH, 0, 32, 64);
|
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+1, 10, (unsigned char *)"Moves");
|
||||||
#else
|
#else
|
||||||
rb->lcd_drawrect(0,IMAGE_HEIGHT,32,64);
|
rb->lcd_drawrect(0, IMAGE_HEIGHT, IMAGE_WIDTH,
|
||||||
rb->lcd_putsxy(1,IMAGE_HEIGHT+10, (unsigned char *)"Moves");
|
(LCD_HEIGHT-IMAGE_HEIGHT));
|
||||||
|
rb->lcd_putsxy(3, IMAGE_HEIGHT+7, (unsigned char *)"Moves: ");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (i=0; i<NUM_SPOTS; i++)
|
for (i=0; i<NUM_SPOTS; i++)
|
||||||
draw_spot(spots[i],
|
draw_spot(spots[i],
|
||||||
(i%SPOTS_X)*SPOTS_WIDTH,
|
(i%SPOTS_X)*SPOTS_WIDTH,
|
||||||
|
@ -606,14 +601,14 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rb->lcd_clear_display();
|
rb->lcd_clear_display();
|
||||||
#if (LCD_WIDTH>IMAGE_SIZE)
|
#if ((LCD_WIDTH - IMAGE_SIZE) > (LCD_HEIGHT - IMAGE_HEIGHT))
|
||||||
rb->lcd_drawrect(IMAGE_WIDTH, 0, 32, 64);
|
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+1, 10, (unsigned char *)"Moves");
|
||||||
#else
|
#else
|
||||||
rb->lcd_drawrect(0,IMAGE_HEIGHT,32,64);
|
rb->lcd_drawrect(0, IMAGE_HEIGHT, IMAGE_WIDTH,
|
||||||
rb->lcd_putsxy(1,IMAGE_HEIGHT+10, (unsigned char *)"Moves");
|
(LCD_HEIGHT-IMAGE_HEIGHT));
|
||||||
|
rb->lcd_putsxy(3, IMAGE_HEIGHT+7, (unsigned char *)"Moves: ");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (i=0; i<NUM_SPOTS; i++) {
|
for (i=0; i<NUM_SPOTS; i++) {
|
||||||
spots[i]=(i+1);
|
spots[i]=(i+1);
|
||||||
draw_spot(spots[i], (i%SPOTS_X)*SPOTS_WIDTH, (i/SPOTS_X)*SPOTS_HEIGHT);
|
draw_spot(spots[i], (i%SPOTS_X)*SPOTS_WIDTH, (i/SPOTS_X)*SPOTS_HEIGHT);
|
||||||
|
|