From bf2ad34e516579526666e2fc94b974ccf555d2cf Mon Sep 17 00:00:00 2001 From: teru Date: Fri, 12 Feb 2010 12:11:37 +0000 Subject: [PATCH] chopper: fix FS#11000: Drawing issue with steep mode. don't change level while in game. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24616 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/chopper.c | 100 +++++++++++++++++++------------------------------ 1 file changed, 39 insertions(+), 61 deletions(-) diff --git a/apps/plugins/chopper.c b/apps/plugins/chopper.c index 66ce30927..c48e1a995 100644 --- a/apps/plugins/chopper.c +++ b/apps/plugins/chopper.c @@ -205,7 +205,7 @@ static int iPlayerSpeedY; static int iLastBlockPlacedPosX; static int iGravityTimerCountdown; static int iPlayerAlive; -static int iLevelMode; +static int iLevelMode, iCurrLevelMode; static int blockh,blockw; static int highscore; static int score; @@ -261,7 +261,7 @@ struct CTerrain mRoof; /*Function declarations*/ static void chopDrawParticle(struct CParticle *mParticle); static void chopDrawBlock(struct CBlock *mBlock); -static void chopRenderTerrain(struct CTerrain *ter); +static void chopRenderTerrain(struct CTerrain *ter, bool isground); void chopper_load(bool newgame); void cleanup_chopper(void); @@ -385,7 +385,7 @@ int chopUpdateTerrainRecycling(struct CTerrain *ter) v = 3*iPlayerSpeedX; if(v>50) v=50; - if(iLevelMode == LEVEL_MODE_STEEP) + if(iCurrLevelMode == LEVEL_MODE_STEEP) v*=5; chopAddTerrainNode(ter,iNewNodePos,g - iR(-v,v)); @@ -560,7 +560,7 @@ static int chopParticleOffscreen(struct CParticle *mParticle) static void chopKillPlayer(void) { - int i, button; + int i; for (i = 0; i < NUMBER_OF_PARTICLES; i++) { mParticles[i].bIsActive = 0; @@ -571,10 +571,6 @@ static void chopKillPlayer(void) iPlayerAlive--; if (iPlayerAlive == 0) { - rb->lcd_set_drawmode(DRMODE_FG); -#if LCD_DEPTH >= 2 - rb->lcd_set_foreground(LCD_LIGHTGRAY); -#endif rb->splash(HZ, "Game Over"); if (score > highscore) { @@ -584,36 +580,8 @@ static void chopKillPlayer(void) highscore); rb->splash(HZ*2, scoretext); } - - rb->splash(HZ/4, "Press " ACTIONTEXT " to continue"); - rb->lcd_update(); - - rb->lcd_set_drawmode(DRMODE_SOLID); - - while (true) { - button = rb->button_get(true); - if (button == ACTION -#ifdef ACTION2 - || button == ACTION2 -#endif - ) { - while (true) { - button = rb->button_get(true); - if (button == (ACTION | BUTTON_REL) -#ifdef ACTION2 - || button == (ACTION2 | BUTTON_REL) -#endif - ) { - chopper_load(true); - return; - } - } - } - } - } else chopper_load(false); - } static void chopDrawTheWorld(void) @@ -648,8 +616,8 @@ static void chopDrawTheWorld(void) i++; } - chopRenderTerrain(&mGround); - chopRenderTerrain(&mRoof); + chopRenderTerrain(&mGround, true); + chopRenderTerrain(&mRoof, false); } @@ -676,6 +644,7 @@ static void chopDrawScene(void) #elif LCD_DEPTH == 2 rb->lcd_set_background(LCD_WHITE); #endif + rb->lcd_clear_display(); chopDrawTheWorld(); chopDrawPlayer(iPlayerPosX - iCameraPosX, iPlayerPosY); @@ -750,6 +719,7 @@ static int chopMenu(int menunum) #endif rb->lcd_clear_display(); + rb->button_clear_queue(); while (!menu_quit) { switch(rb->do_menu(&menu, &result, NULL, false)) @@ -818,7 +788,6 @@ static int chopGameLoop(void) mParticles[i].iWorldY += mParticles[i].iSpeedY; } - rb->lcd_clear_display(); /* Redraw the main window: */ chopDrawScene(); @@ -831,7 +800,7 @@ static int chopGameLoop(void) chopAddParticle(iPlayerPosX, iPlayerPosY+5, 0, 0); } - if(iLevelMode == LEVEL_MODE_NORMAL) + if(iCurrLevelMode == LEVEL_MODE_NORMAL) chopGenerateBlockIfNeeded(); @@ -939,18 +908,12 @@ static void chopDrawBlock(struct CBlock *mBlock) } -static void chopRenderTerrain(struct CTerrain *ter) +static void chopRenderTerrain(struct CTerrain *ter, bool isground) { - int i=1; + int i = 1; - int oldx=0; - - int ay=0; - if(ter->mNodes[0].y < (LCD_HEIGHT*SIZE)/2) - ay=0; - else - ay=(LCD_HEIGHT*SIZE); + int oldx = 0; while(i < ter->iNodesCount && oldx < iScreenX) { @@ -960,6 +923,19 @@ static void chopRenderTerrain(struct CTerrain *ter) int x2 = ter->mNodes[i].x - iCameraPosX; int y2 = ter->mNodes[i].y; + + int ax, ay; + + if ((y < y2) != isground) + { + ax = x2; + ay = y; + } + else + { + ax = x; + ay = y2; + } #if LCD_DEPTH > 2 rb->lcd_set_foreground(LCD_RGBPACK(100,255,100)); #elif LCD_DEPTH == 2 @@ -969,23 +945,24 @@ static void chopRenderTerrain(struct CTerrain *ter) rb->lcd_drawline(SCALE(x), SCALE(y), SCALE(x2), SCALE(y2)); xlcd_filltriangle(SCALE(x), SCALE(y), SCALE(x2), SCALE(y2), - SCALE(x2), SCALE(ay)); - xlcd_filltriangle(SCALE(x), SCALE(ay), SCALE(x2), SCALE(y2), - SCALE(x2), SCALE(ay)); + SCALE(ax), SCALE(ay)); - if (ay == 0) - xlcd_filltriangle(SCALE(x), SCALE(ay), SCALE(x), SCALE(y), - SCALE(x2), SCALE(y2 / 2)); + if (isground) + { + y = ay; + y2 = (LCD_HEIGHT*SIZE); + } else - xlcd_filltriangle(SCALE(x), SCALE(ay), SCALE(x), SCALE(y), - SCALE(x2), SCALE((LCD_HEIGHT*SIZE) - - ((LCD_HEIGHT*SIZE) - y2) / 2)); + { + y = 0; + y2 = ay; + } + if (y2-y > 0) + rb->lcd_fillrect(SCALE(x), SCALE(y), SCALE(x2-x)+1, SCALE(y2-y)+1); oldx = x; i++; - } - } void chopper_load(bool newgame) @@ -1000,6 +977,7 @@ void chopper_load(bool newgame) blockh = iScreenY / 5; blockw = iScreenX / 20; iPlayerAlive = 1; + iCurrLevelMode = iLevelMode; score = 0; } iRotorOffset = 0; @@ -1028,7 +1006,7 @@ void chopper_load(bool newgame) /* mirror the sky if we've changed the ground */ chopCopyTerrain(&mGround, &mRoof, 0, - ( (iScreenY * 3) / 4)); - if (iLevelMode == LEVEL_MODE_NORMAL) + if (iCurrLevelMode == LEVEL_MODE_NORMAL) /* make it a bit more exciting, cause it's easy terrain... */ iPlayerSpeedX *= 2; } -- 2.11.4.GIT