Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}