bool xaeBlockScene::update(float fDT) { g_BGMPlayer.update(fDT); #ifdef __DEBUG if(xae::Instance().keyup(HGEK_ESCAPE)) { g_bDebugStop ^= true; } if(g_bDebugStop) return false; /** 彩旦:直接赢了 */ if(xae::Instance().keystate(HGEK_CTRL) && xae::Instance().keystate(HGEK_E)) { xaeAVGScene* scene = (xaeAVGScene*)(xaeSceneMgr::Instance().get_scene("AVG")); /** 若死过了而且是PreBoss关 */ if(scene->getRevived() && m_szLevelName == g_Setting.Block.m_szPreBoss) { xaeSceneMgr::Instance().del_scene("AVG"); xaeSceneObject* sceneo = xaeSceneMgr::Instance().create_scene("Welcome", "Welcome"); xaeSceneMgr::Instance().add_scene("Welcome", sceneo); xaeSceneMgr::Instance().set_current_scene("Welcome"); return false; } /** 否则跳到AVG画面 */ scene->parseNextPause(); xaeSceneMgr::Instance().set_current_scene("AVG"); /** Pre Boss干翻了 */ if(m_szLevelName == g_Setting.Block.m_szPreBoss) { scene->setPreBossed(); } return false; } #endif /** 暂停 */ if(xae::Instance().keyup(HGEK_ENTER)) { if(m_emStatus == XBPS_PLAYING) { m_emStatus = XBPS_PAUSE; return false; } else if(m_emStatus == XBPS_PAUSE) { m_emStatus = XBPS_PLAYING; } } if(m_emStatus == XBPS_PAUSE) return false; /** GUI */ float mousex, mousey; m_pHGE->Input_GetMousePos(&mousex, &mousey); m_pGUI->update(fDT, mousex, mousey); /** 挡板左右转 */ float dx = fDT * g_Setting.Block.m_fFlapSpeed; if(xae::Instance().keystate(HGEK_RIGHT)) { if(m_fFlapX + dx + g_Setting.Block.m_nFlapLength * m_dwFlapNum <= 600.0f) { m_fFlapX += dx; if(m_emStatus == XBPS_READY) { m_fBallX += dx; } } else { m_fFlapX = 600.0f - g_Setting.Block.m_nFlapLength * m_dwFlapNum; if(m_emStatus == XBPS_READY) { m_fBallX = 600.0f - (g_Setting.Block.m_nFlapLength * m_dwFlapNum) / 2.0f; } } } if(xae::Instance().keystate(HGEK_LEFT)) { if(m_fFlapX - dx >= 0) { m_fFlapX -= dx; if(m_emStatus == XBPS_READY) { m_fBallX -= dx; } } else { m_fFlapX = 0.0f; if(m_emStatus == XBPS_READY) { m_fBallX = (g_Setting.Block.m_nFlapLength * m_dwFlapNum) / 2.0f; } } } /** 道具更新 */ m_Treasure.update(fDT, m_fFlapX, m_fFlapY); /** 挡板长度 */ float fFlapCenterX = m_fFlapX + (m_dwFlapNum * g_Setting.Block.m_nFlapLength) / 2.0f; m_dwFlapNum = m_Treasure.getFlapNum(); m_fFlapX = fFlapCenterX - (m_dwFlapNum * g_Setting.Block.m_nFlapLength) / 2; if(m_fFlapX < 0) m_fFlapX = 0; else if(m_fFlapX + m_dwFlapNum * g_Setting.Block.m_nFlapLength > 600.0f) m_fFlapX = 600.0f - m_dwFlapNum * g_Setting.Block.m_nFlapLength; /** 空格或者回车 */ if(xae::Instance().keyup(HGEK_SPACE) || xae::Instance().keyup(HGEK_ENTER)) { /** 变成开始状态 */ if(m_emStatus == XBPS_READY) { m_emStatus =XBPS_PLAYING; } else /** 赢了按回车回到AVG画面 */ if(m_emStatus == XBPS_WIN) { xaeAVGScene* scene = (xaeAVGScene*)(xaeSceneMgr::Instance().get_scene("AVG")); /** 若死过了而且是PreBoss关 */ if(scene->getRevived() && m_szLevelName == g_Setting.Block.m_szPreBoss) { xaeSceneMgr::Instance().del_scene("AVG"); xaeSceneObject* sceneo = xaeSceneMgr::Instance().create_scene("Welcome", "Welcome"); xaeSceneMgr::Instance().add_scene("Welcome", sceneo); xaeSceneMgr::Instance().set_current_scene("Welcome"); return false; } /** 否则跳到AVG画面 */ scene->parseNextPause(); xaeSceneMgr::Instance().set_current_scene("AVG"); /** Pre Boss干翻了 */ if(m_szLevelName == g_Setting.Block.m_szPreBoss) { scene->setPreBossed(); } return false; } } /** 游戏在玩的状态 */ if(m_emStatus == XBPS_PLAYING) { /** 球飞啦! */ float fbdx = m_fBallSpeedX * fDT, fbdy = m_fBallSpeedY * fDT; fbdx *= m_Treasure.getSpeedScale(); fbdy *= m_Treasure.getSpeedScale(); /** 横向飞 */ if(m_fBallX + fbdx - g_Setting.Block.m_nBallLength / 2 >= 0.0f && m_fBallX + fbdx + g_Setting.Block.m_nBallLength / 2 <= 600.0f) { m_fBallX += fbdx; } else if(m_fBallX + fbdx - g_Setting.Block.m_nBallLength / 2 < 0.0f) m_fBallX = g_Setting.Block.m_nBallLength / 2, m_fBallSpeedX = -m_fBallSpeedX; else m_fBallX = 600 - g_Setting.Block.m_nBallLength / 2, m_fBallSpeedX = -m_fBallSpeedX; /** 纵向飞 */ if(m_fBallY + fbdy - g_Setting.Block.m_nBallLength / 2 >= 0.0f) { m_fBallY += fbdy; } else if(m_fBallY + fbdy - g_Setting.Block.m_nBallLength / 2 < 0.0f) m_fBallY = g_Setting.Block.m_nBallLength / 2, m_fBallSpeedY = - m_fBallSpeedY; //else m_fBallY = 590.0f, m_fBallSpeedY = - m_fBallSpeedY; /** 碰到挡板:往上弹 */ if(m_fBallY >= g_Setting.Block.m_fFlapY - g_Setting.Block.m_nBallLength / 2 && m_fBallY <= g_Setting.Block.m_fFlapY + 15.0f - g_Setting.Block.m_nBallLength / 2) { /** x轴在挡板范围内 */ if(m_fBallX >= m_fFlapX && m_fBallX <= m_fFlapX + m_dwFlapNum * g_Setting.Block.m_nFlapLength) { /** 根据小球在挡板的位置确定x速度 */ m_fBallSpeedX = (m_fBallX - (m_fFlapX + m_dwFlapNum * g_Setting.Block.m_nFlapLength / 2)) / (m_dwFlapNum * (g_Setting.Block.m_nFlapLength) / 2); m_fBallSpeedX *= g_Setting.Block.m_fMaxHorizontalRate; m_fBallSpeedX *= g_Setting.Block.m_fBallSpeed; /** 确定y轴速度:保证x和y的合速度为g_Setting.Block.m_fBallSpeed */ m_fBallSpeedY = -sqrt(g_Setting.Block.m_fBallSpeed * g_Setting.Block.m_fBallSpeed - m_fBallSpeedX * m_fBallSpeedX); } } /** 飞丢了 */ if(m_fBallY >= 600.0f) { /** 如果已经干翻了Pre Boss,则直接到welcome */ xaeAVGScene* scenea = (xaeAVGScene*)xaeSceneMgr::Instance().get_scene("AVG"); if(scenea->getPreBossed()) { xaeSceneObject* sceneo = xaeSceneMgr::Instance().create_scene("Welcome", "Welcome"); xaeSceneMgr::Instance().add_scene("Welcome", sceneo); xaeSceneMgr::Instance().del_scene("AVG"); xaeSceneMgr::Instance().set_current_scene("Welcome"); return false; } xaeSceneObject* scene = xaeSceneMgr::Instance().create_scene("Revive", "Revive"); if(NULL != scene) { xaeSceneMgr::Instance().add_scene("Revive", scene); } xaeSceneMgr::Instance().set_current_scene("Revive"); ((xaeReviveScene*)scene)->setLevel(m_szLevelName); /** 设置AVG为死过了 */ ((xaeAVGScene*)xaeSceneMgr::Instance().get_scene("AVG"))->setRevived(); return false; } /** 得到小球区域四个角的坐标 */ coor zs(m_fBallX, m_fBallY), zx(m_fBallX, m_fBallY), ys(m_fBallX, m_fBallY), yx(m_fBallX, m_fBallY); zs.x -= (g_Setting.Block.m_nBallLength / 2), zs.y -= (g_Setting.Block.m_nBallLength / 2); ys.x += (g_Setting.Block.m_nBallLength / 2), ys.y -= (g_Setting.Block.m_nBallLength / 2); zx.x -= (g_Setting.Block.m_nBallLength / 2), zx.y += (g_Setting.Block.m_nBallLength / 2); yx.x -= (g_Setting.Block.m_nBallLength / 2), yx.y -= (g_Setting.Block.m_nBallLength / 2); /** 求四个角所在的各方块的下标 */ int zsi = ((int)zs.y) / g_Setting.Block.m_nBlockHeight, zsj = ((int)zs.x) / g_Setting.Block.m_nBlockWidth; int ysi = ((int)ys.y) / g_Setting.Block.m_nBlockHeight, ysj = ((int)ys.x) / g_Setting.Block.m_nBlockWidth; int zxi = ((int)zx.y) / g_Setting.Block.m_nBlockHeight, zxj = ((int)zx.x) / g_Setting.Block.m_nBlockWidth; int yxi = ((int)yx.y) / g_Setting.Block.m_nBlockHeight, yxj = ((int)yx.x) / g_Setting.Block.m_nBlockWidth; /** 碰撞检测 */ coor zspz = collisionCheck(m_hTexClothHot, zsj * g_Setting.Block.m_nBlockWidth, zsi * g_Setting.Block.m_nBlockHeight, g_Setting.Block.m_nBlockWidth, g_Setting.Block.m_nBlockHeight); coor zxpz = collisionCheck(m_hTexClothHot, zxj * g_Setting.Block.m_nBlockWidth, zxi * g_Setting.Block.m_nBlockHeight, g_Setting.Block.m_nBlockWidth, g_Setting.Block.m_nBlockHeight); coor yspz = collisionCheck(m_hTexClothHot, ysj * g_Setting.Block.m_nBlockWidth, ysi * g_Setting.Block.m_nBlockHeight, g_Setting.Block.m_nBlockWidth, g_Setting.Block.m_nBlockHeight); coor yxpz = collisionCheck(m_hTexClothHot, yxj * g_Setting.Block.m_nBlockWidth, yxi * g_Setting.Block.m_nBlockHeight, g_Setting.Block.m_nBlockWidth, g_Setting.Block.m_nBlockHeight); /** 处理碰撞 */ if(zspz.x >= 0.0f && zspz.y >= 0.0f) { /** 这个方块消失 */ m_bClothes[zsi][zsj] = false; /** 方块数减少 */ m_dwBlockLeft--; m_Treasure.generateTreasure(zsj * g_Setting.Block.m_nBlockWidth + g_Setting.Block.m_nBlockWidth / 2, zsi * g_Setting.Block.m_nBlockHeight + g_Setting.Block.m_nBlockHeight / 2); /** 下同 */ } if(zxpz.x >= 0.0f && zxpz.y >= 0.0f && (zsi != zxi || zsj != zxj)) { m_bClothes[zxi][zxj] = false; m_dwBlockLeft--; m_Treasure.generateTreasure(zxj * g_Setting.Block.m_nBlockWidth + g_Setting.Block.m_nBlockWidth / 2, zxi * g_Setting.Block.m_nBlockHeight + g_Setting.Block.m_nBlockHeight / 2); } if(yspz.x >= 0.0f && yspz.y >= 0.0f && (zxi != ysi || zxj != ysj) && (zsi != ysi || zsj != ysj)) { m_bClothes[ysi][ysj] = false; m_dwBlockLeft--; m_Treasure.generateTreasure(ysj * g_Setting.Block.m_nBlockWidth + g_Setting.Block.m_nBlockWidth / 2, ysi * g_Setting.Block.m_nBlockHeight + g_Setting.Block.m_nBlockHeight / 2); } if(yxpz.x >= 0.0f && yxpz.y >= 0.0f && (zxi != yxi || zxj != yxj) && (ysi != yxi || ysj != yxj) && (zsi != yxi || zsj != yxj)) { m_bClothes[yxi][yxj] = false; m_dwBlockLeft--; m_Treasure.generateTreasure(yxj * g_Setting.Block.m_nBlockWidth + g_Setting.Block.m_nBlockWidth / 2, yxi * g_Setting.Block.m_nBlockHeight + g_Setting.Block.m_nBlockHeight / 2); } /** 重新设置速度 */ if(!m_Treasure.getHits()) { if(zspz.x >= 0.0f && zspz.y >= 0.0f) setRebound(zspz); else if(yspz.x >= 0.0f && yspz.y >= 0.0f) setRebound(yspz); else if(zxpz.x >= 0.0f && zxpz.y >= 0.0f) setRebound(zxpz); else if(yxpz.x >= 0.0f && yxpz.y >= 0.0f) setRebound(yxpz); } /** 所有方块打完了就赢了 */ if(m_dwBlockLeft == 0) m_emStatus = XBPS_WIN; } return false; }
int radixsort(struct rnode a[20],int n) { int f[11],e[11],i,j,k,l,p,d,t; for(i=1;i<=n;i++) { a[i].key=r[i-1].key; a[i].point=i+1; } a[n].point=0; p=1; printf("Êä³ö¹Ø¼ü×ÖÓÐЧλÊý d\n"); scanf("%d",&d); printf("Êä³ö»ùÊýÅÅÐòµÄ½á¹û:\n"); for(i=1;i<=d;i++) { for(j=0;j<=10;j++) { f[j]=0; e[j]=0; } while(p!=0) { k=yx(a[p].key,i); if(f[k]==0) { f[k]=p; e[k]=p; } else { l=e[k]; a[l].point=p; e[k]=p; } p=a[p].point; } j=0; while(f[j]==0) j++; p=f[j];t=e[j]; while(j<10) { j++; while((j<10)&&(f[j]==0)) j++; if(f[j]!=0) { a[t].point=f[j]; t=e[j]; } } a[t].point=0; t=p; while(t!=0) { printf("%5d",a[t].key); t=a[t].point; } printf("\n"); } return(p); }