Portability enhancements - make the menu bitmap positions #defines, introduce a game loop timer (to fix the speed on all targets) and fix the menu on targets with 320x240 LCDs.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8464 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Dave Chapman 2006-01-27 10:02:13 +00:00
parent 2047f79f75
commit 553c9e2fce
3 changed files with 101 additions and 59 deletions

View file

@ -18,11 +18,15 @@ sudoku_inverse.220x176x16.bmp
/* Brickmania */
#if (LCD_WIDTH >= 220) && (LCD_HEIGHT >= 176) && (LCD_DEPTH == 16)
#if (LCD_WIDTH == 320)
brickmania_menu_bg.320x240x16.bmp
#else
brickmania_menu_bg.220x176x16.bmp
#endif
brickmania_ball.220x176x16.bmp
brickmania_bricks.220x176x16.bmp
brickmania_gameover.220x176x16.bmp
brickmania_help.220x176x16.bmp
brickmania_menu_bg.220x176x16.bmp
brickmania_no_resume.220x176x16.bmp
brickmania_pads.220x176x16.bmp
brickmania_powerups.220x176x16.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

View file

@ -22,6 +22,12 @@
PLUGIN_HEADER
/* The time (in ms) for one iteration through the game loop - decrease this
to speed up the game - note that current_tick is (currently) only accurate
to 10ms.
*/
#define CYCLETIME 30
#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
#define QUIT BUTTON_OFF
@ -31,6 +37,10 @@ PLUGIN_HEADER
#define UP BUTTON_UP
#define DOWN BUTTON_DOWN
/* H100 and H300 don't have scroll events */
#define SCROLL_FWD(x) (0)
#define SCROLL_BACK(x) (0)
#elif (CONFIG_KEYPAD == IPOD_4G_PAD)
#define QUIT BUTTON_MENU
@ -40,6 +50,9 @@ PLUGIN_HEADER
#define UP BUTTON_SCROLL_BACK
#define DOWN BUTTON_SCROLL_FWD
#define SCROLL_FWD(x) ((x) & BUTTON_SCROLL_FWD)
#define SCROLL_BACK(x) ((x) & BUTTON_SCROLL_BACK)
#else
#error Unsupported keypad
#endif
@ -71,6 +84,11 @@ extern const fb_data brickmania_bricks[];
/* TO DO: This needs adjusting correctly for larger than 220x176 LCDS */
#if (LCD_WIDTH >= 220) && (LCD_HEIGHT >= 176)
/* Offsets for LCDS > 220x176 */
#define XOFS ((LCD_WIDTH-220)/2)
#define YOFS ((LCD_HEIGHT-176)/2)
#define PAD_WIDTH 40
#define PAD_HEIGHT 5
#define PAD_POS_Y LCD_HEIGHT - 7
@ -108,6 +126,18 @@ extern const fb_data brickmania_bricks[];
#define BMPHEIGHT_powerup 6
#define BMPWIDTH_powerup 10
#define BMPXOFS_resume (62+XOFS)
#define BMPYOFS_resume (100+YOFS)
#define BMPXOFS_quit (93+XOFS)
#define BMPYOFS_quit (138+YOFS)
#define BMPXOFS_start (55+XOFS)
#define BMPYOFS_start (78+YOFS)
#define BMPXOFS_help (92+XOFS)
#define BMPYOFS_help (118+YOFS)
#define HIGHSCORE_XPOS (7+XOFS)
#define HIGHSCORE_YPOS (56+YOFS)
#else
#error Unsupported LCD Size
#endif
@ -498,44 +528,46 @@ int game_menu(int when)
int button,cur=0;
char str[10];
rb->lcd_clear_display();
rb->lcd_bitmap(brickmania_menu_bg,0,0,220,176);
rb->lcd_bitmap(brickmania_menu_bg,0,0,LCD_WIDTH,LCD_HEIGHT);
while (true) {
for(i=0;i<MENU_LENGTH;i++) {
if (cur==0)
rb->lcd_bitmap(brickmania_sel_start,55,78,
rb->lcd_bitmap(brickmania_sel_start,
BMPXOFS_start,BMPYOFS_start,
BMPWIDTH_sel_start,BMPHEIGHT_sel_start);
else
rb->lcd_bitmap(brickmania_start,55,78,
rb->lcd_bitmap(brickmania_start,BMPXOFS_start,BMPYOFS_start,
BMPWIDTH_start,BMPHEIGHT_start);
if (when==1) {
if (cur==1)
rb->lcd_bitmap(brickmania_sel_resume,62,100,
rb->lcd_bitmap(brickmania_sel_resume,
BMPXOFS_resume,BMPYOFS_resume,
BMPWIDTH_sel_resume,BMPHEIGHT_sel_resume);
else
rb->lcd_bitmap(brickmania_resume,62,100,
rb->lcd_bitmap(brickmania_resume,
BMPXOFS_resume,BMPYOFS_resume,
BMPWIDTH_resume,BMPHEIGHT_resume);
} else {
rb->lcd_bitmap(brickmania_no_resume,62,100,
rb->lcd_bitmap(brickmania_no_resume,
BMPXOFS_resume,BMPYOFS_resume,
BMPWIDTH_no_resume,BMPHEIGHT_no_resume);
}
if (cur==2)
rb->lcd_bitmap(brickmania_sel_help,92,118,
rb->lcd_bitmap(brickmania_sel_help,BMPXOFS_help,BMPYOFS_help,
BMPWIDTH_sel_help,BMPHEIGHT_sel_help);
else
rb->lcd_bitmap(brickmania_help,92,118,
rb->lcd_bitmap(brickmania_help,BMPXOFS_help,BMPYOFS_help,
BMPWIDTH_help,BMPHEIGHT_help);
if (cur==3)
rb->lcd_bitmap(brickmania_sel_quit,93,138,
rb->lcd_bitmap(brickmania_sel_quit,BMPXOFS_quit,BMPYOFS_quit,
BMPWIDTH_sel_quit,BMPHEIGHT_sel_quit);
else
rb->lcd_bitmap(brickmania_quit,93,138,
rb->lcd_bitmap(brickmania_quit,BMPXOFS_quit,BMPYOFS_quit,
BMPWIDTH_quit,BMPHEIGHT_quit);
}
@ -543,11 +575,11 @@ int game_menu(int when)
rb->lcd_setfont(FONT_SYSFIXED);
rb->lcd_set_background(LCD_RGBPACK(0,0,140));
rb->lcd_set_foreground(LCD_WHITE);
rb->lcd_putsxy(7, 56, "High Score");
rb->lcd_putsxy(HIGHSCORE_XPOS, HIGHSCORE_YPOS, "High Score");
rb->snprintf(str, sizeof(str), "%d", highscore);
rb->lcd_getstringsize("High Score", &sw, NULL);
rb->lcd_getstringsize(str, &w, NULL);
rb->lcd_putsxy(7+sw/2-w/2, 65, str);
rb->lcd_putsxy(HIGHSCORE_XPOS+sw/2-w/2, HIGHSCORE_YPOS+9, str);
rb->lcd_setfont(FONT_UI);
rb->lcd_update();
@ -690,6 +722,7 @@ int game_loop(void){
int j,i,k,bricky,brickx;
char s[20];
int sec_count=0,num_count=10;
int end;
rb->srand( *rb->current_tick );
@ -713,7 +746,10 @@ int game_loop(void){
break;
}
while(true) {
while(true) {
/* Convert CYCLETIME (in ms) to HZ */
end = *rb->current_tick + (CYCLETIME * HZ) / 1000;
if (life >= 0) {
rb->lcd_set_background(LCD_BLACK);
rb->lcd_set_drawmode(DRMODE_SOLID);
@ -733,7 +769,7 @@ int game_loop(void){
rb->lcd_getstringsize(s, &sw, NULL);
rb->lcd_putsxy(LCD_WIDTH/2-2, 150, s);
}
/* write life num */
rb->snprintf(s, sizeof(s), "Life: %d", life);
rb->lcd_putsxy(2, 2, s);
@ -742,7 +778,6 @@ int game_loop(void){
rb->lcd_getstringsize(s, &sw, NULL);
rb->lcd_putsxy(LCD_WIDTH-sw-2, 2, s);
if (vscore<score) vscore++;
rb->snprintf(s, sizeof(s), "%d", vscore);
rb->lcd_getstringsize(s, &sw, NULL);
@ -1033,58 +1068,59 @@ int game_loop(void){
}
int move_button,button;
int time = 3; /* number of ticks this function will loop reading keys */
int start = *rb->current_tick;
int end = start + time;
button=rb->button_get_w_tmo(end - *rb->current_tick);
int button_right,button_left;
button=rb->button_get(false);
move_button=rb->button_status();
if ((move_button & RIGHT && flip_sides==false) || (flip_sides==true && move_button & LEFT)) {
button_right=((move_button & RIGHT) || (SCROLL_FWD(button)));
button_left=((move_button & LEFT) || (SCROLL_BACK(button)));
if ((button_right && flip_sides==false) || (button_left && flip_sides==true)) {
if (pad_pos_x+8+PAD_WIDTH > LCD_WIDTH) {
if (start_game==1 || on_the_pad==1) ball_pos_x+=LCD_WIDTH-pad_pos_x-PAD_WIDTH;
pad_pos_x+=LCD_WIDTH-pad_pos_x-PAD_WIDTH;
} else {
if ((start_game==1 || on_the_pad==1))
ball_pos_x+=8;
pad_pos_x+=8;
}
} else if ((move_button & LEFT && flip_sides==false) || (flip_sides==true && move_button & RIGHT)) {
if (pad_pos_x-8 < 0) {
if (start_game==1 || on_the_pad==1) ball_pos_x-=pad_pos_x;
pad_pos_x-=pad_pos_x;
} else {
if (start_game==1 || on_the_pad==1) ball_pos_x-=8;
pad_pos_x-=8;
}
} else {
if ((start_game==1 || on_the_pad==1))
ball_pos_x+=8;
pad_pos_x+=8;
}
} else if ((button_left && flip_sides==false) || (button_right && flip_sides==true)) {
if (pad_pos_x-8 < 0) {
if (start_game==1 || on_the_pad==1) ball_pos_x-=pad_pos_x;
pad_pos_x-=pad_pos_x;
} else {
if (start_game==1 || on_the_pad==1) ball_pos_x-=8;
pad_pos_x-=8;
}
}
switch(button){
case SELECT:
if (start_game==1 && con_game!=1 && pad_type!=1) {
bally=-4;
ballx=pad_pos_x+(PAD_WIDTH/2)-2>=LCD_WIDTH/2?2:-2;
switch(button) {
case SELECT:
if (start_game==1 && con_game!=1 && pad_type!=1) {
bally=-4;
ballx=pad_pos_x+(PAD_WIDTH/2)-2>=LCD_WIDTH/2?2:-2;
start_game =0;
} else if (pad_type==1 && on_the_pad==1) {
on_the_pad=0;
if (start_game!=1 && con_game==1) {
start_game =0;
} else if (pad_type==1 && on_the_pad==1) {
on_the_pad=0;
if (start_game!=1 && con_game==1) {
start_game =0;
con_game=0;
}
} else if (pad_type==2 && con_game!=1) {
int tfire;
tfire=fire_space();
fire[tfire].top=PAD_POS_Y-7;
fire[tfire].left=pad_pos_x+1;
tfire=fire_space();
fire[tfire].top=PAD_POS_Y-7;
fire[tfire].left=pad_pos_x+PAD_WIDTH-1;
} else if (con_game==1 && start_game!=1) {
ballx=x;
bally=y;
con_game=0;
}
break;
} else if (pad_type==2 && con_game!=1) {
int tfire;
tfire=fire_space();
fire[tfire].top=PAD_POS_Y-7;
fire[tfire].left=pad_pos_x+1;
tfire=fire_space();
fire[tfire].top=PAD_POS_Y-7;
fire[tfire].left=pad_pos_x+PAD_WIDTH-1;
} else if (con_game==1 && start_game!=1) {
ballx=x;
bally=y;
con_game=0;
}
break;
case QUIT:
switch(game_menu(1)){
case 0:
@ -1140,6 +1176,8 @@ int game_loop(void){
break;
}
}
if (end > *rb->current_tick)
rb->sleep(end-*rb->current_tick);
}
}