From 8921b34e4b81f427d19b5c9f263eb893040c2d43 Mon Sep 17 00:00:00 2001 From: Shachar Liberman Date: Mon, 7 Aug 2006 17:08:48 +0000 Subject: Pong! * adapt to FS#4761 * add pause button for non-holdswitch players * better gameplay (no wait for BUTTON_REPEAT) * a few bugfixes * H300 new keypad (should credit & close 2822) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10472 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/pong.c | 64 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 12 deletions(-) (limited to 'apps/plugins') diff --git a/apps/plugins/pong.c b/apps/plugins/pong.c index dfa2a22fd4..ef7f2f672e 100644 --- a/apps/plugins/pong.c +++ b/apps/plugins/pong.c @@ -25,7 +25,7 @@ PLUGIN_HEADER #define PAD_HEIGHT LCD_HEIGHT / 6 /* Recorder: 10 iRiver: 21 */ #define PAD_WIDTH LCD_WIDTH / 50 /* Recorder: 2 iRiver: 2 */ -#define BALL_HEIGTH LCD_HEIGHT / 32 /* Recorder: 2 iRiver: 4 */ +#define BALL_HEIGHT LCD_HEIGHT / 32 /* Recorder: 2 iRiver: 4 */ #define BALL_WIDTH LCD_HEIGHT / 32 /* We want a square ball */ #define SPEEDX ( LCD_WIDTH * 3 ) / 2 /* Recorder: 168 iRiver: 240 */ @@ -38,6 +38,7 @@ PLUGIN_HEADER /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define PONG_QUIT BUTTON_OFF +#define PONG_PAUSE BUTTON_ON #define PONG_LEFT_UP BUTTON_F1 #define PONG_LEFT_DOWN BUTTON_LEFT #define PONG_RIGHT_UP BUTTON_F3 @@ -45,13 +46,13 @@ PLUGIN_HEADER #elif CONFIG_KEYPAD == ONDIO_PAD #define PONG_QUIT BUTTON_OFF +#define PONG_PAUSE BUTTON_RIGHT #define PONG_LEFT_UP BUTTON_LEFT #define PONG_LEFT_DOWN BUTTON_MENU #define PONG_RIGHT_UP BUTTON_UP #define PONG_RIGHT_DOWN BUTTON_DOWN -#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ - (CONFIG_KEYPAD == IRIVER_H300_PAD) +#elif CONFIG_KEYPAD == IRIVER_H100_PAD #define PONG_QUIT BUTTON_OFF #define PONG_LEFT_UP BUTTON_UP #define PONG_LEFT_DOWN BUTTON_DOWN @@ -59,6 +60,14 @@ PLUGIN_HEADER #define PONG_RIGHT_DOWN BUTTON_MODE #define PONG_RC_QUIT BUTTON_RC_STOP +#elif CONFIG_KEYPAD == IRIVER_H300_PAD +#define PONG_QUIT BUTTON_OFF +#define PONG_LEFT_UP BUTTON_UP +#define PONG_LEFT_DOWN BUTTON_DOWN +#define PONG_RIGHT_UP BUTTON_REC +#define PONG_RIGHT_DOWN BUTTON_MODE +#define PONG_RC_QUIT BUTTON_RC_STOP + #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ (CONFIG_KEYPAD == IPOD_3G_PAD) #define PONG_QUIT BUTTON_SELECT @@ -76,6 +85,7 @@ PLUGIN_HEADER #elif (CONFIG_KEYPAD == GIGABEAT_PAD) #define PONG_QUIT BUTTON_A +#define PONG_PAUSE BUTTON_MENU #define PONG_LEFT_UP BUTTON_UP #define PONG_LEFT_DOWN BUTTON_DOWN #define PONG_RIGHT_UP BUTTON_POWER @@ -154,7 +164,7 @@ bool padcollide(struct pong *p, int pad, int *info) int y = p->bally/RES; if((y < (p->e_pad[pad]+PAD_HEIGHT)) && - (y + BALL_HEIGTH > p->e_pad[pad])) { + (y + BALL_HEIGHT > p->e_pad[pad])) { /* Y seems likely right */ /* store the delta between ball-middle MINUS pad-middle, so @@ -166,15 +176,15 @@ bool padcollide(struct pong *p, int pad, int *info) max number is +- PAD_HEIGHT/2 */ - *info = (y+BALL_HEIGTH/2) - (p->e_pad[pad] + PAD_HEIGHT/2); + *info = (y+BALL_HEIGHT/2) - (p->e_pad[pad] + PAD_HEIGHT/2); if(pad) { /* right-side */ - if((x + BALL_WIDTH) > (LCD_WIDTH - PAD_WIDTH)) + if((x + BALL_WIDTH) >= (LCD_WIDTH - PAD_WIDTH)) return true; /* phump */ } else { - if(x <= 0) + if(x <= PAD_WIDTH) return true; } } @@ -225,8 +235,12 @@ void score(struct pong *p, int pad) /* then move the X-speed of the ball and give it a random Y position */ p->ballspeedx = -p->ballspeedx; - p->bally = rb->rand()%(LCD_HEIGHT-BALL_HEIGTH); + p->bally = rb->rand()%(LCD_HEIGHT*RES - BALL_HEIGHT); + /* avoid hitting the pad with the new ball */ + p->ballx = (p->ballx < 0) ? + (RES * PAD_WIDTH) : (RES * (LCD_WIDTH - PAD_WIDTH - BALL_WIDTH)); + /* restore Y-speed to default */ p->ballspeedy = (p->ballspeedy > 0) ? SPEEDY : -SPEEDY; @@ -254,10 +268,10 @@ void ball(struct pong *p) newy = p->bally/RES; /* detect if ball hits a wall */ - if(newy + BALL_HEIGTH > LCD_HEIGHT) { + if(newy + BALL_HEIGHT > LCD_HEIGHT) { /* hit floor, bounce */ p->ballspeedy = -p->ballspeedy; - newy = LCD_HEIGHT - BALL_HEIGTH; + newy = LCD_HEIGHT - BALL_HEIGHT; p->bally = newy * RES; } else if(newy < 0) { @@ -277,13 +291,16 @@ void ball(struct pong *p) else if(wallcollide(p, 1)) score(p, 0); + newx = p->ballx/RES; + newy = p->bally/RES; + /* clear old position */ rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); - rb->lcd_fillrect(x, y, BALL_WIDTH, BALL_HEIGTH); + rb->lcd_fillrect(x, y, BALL_WIDTH, BALL_HEIGHT); rb->lcd_set_drawmode(DRMODE_SOLID); /* draw the new ball position */ - rb->lcd_fillrect(newx, newy, BALL_WIDTH, BALL_HEIGTH); + rb->lcd_fillrect(newx, newy, BALL_WIDTH, BALL_HEIGHT); } void padmove(int *pos, int dir) @@ -298,6 +315,9 @@ void padmove(int *pos, int dir) int keys(struct pong *p) { int key; +#ifdef PONG_PAUSE + static bool pause = false; +#endif int time = 4; /* number of ticks this function will loop reading keys */ int start = *rb->current_tick; @@ -306,6 +326,11 @@ int keys(struct pong *p) while(end > *rb->current_tick) { key = rb->button_get_w_tmo(end - *rb->current_tick); +#ifdef HAS_BUTTON_HOLD + if (rb->button_hold()) + return 2; /* Pause game */ +#endif + if(key & PONG_QUIT #ifdef PONG_RC_QUIT || key & PONG_RC_QUIT @@ -313,6 +338,15 @@ int keys(struct pong *p) ) return 0; /* exit game NOW */ +#ifdef PONG_PAUSE + if(key == PONG_PAUSE) + pause = !pause; + if(pause) + return 2; /* Pause game */ +#endif + + key = rb->button_status(); /* ignore BUTTON_REPEAT */ + if(key & PONG_LEFT_DOWN) /* player left goes down */ padmove(&p->w_pad[0], MOVE_STEP); @@ -373,6 +407,12 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) /* go go go */ while(game > 0) { + if (game == 2) { /* Game Paused */ + rb->splash(0, true, "PAUSED"); + while(game == 2) + game = keys(&pong); /* short circuit */ + rb->lcd_clear_display(); + } showscore(&pong); pad(&pong, 0); /* draw left pad */ pad(&pong, 1); /* draw right pad */ -- cgit v1.2.3