cocos2d-x 实现翻书效果

因为项目需求,需要使用cocos实现3d翻书的效果,刚开始确实没有什么思路,cocos2d做3d的效果这不是开玩笑吗。但是,再难也得做啊,没办法。

开始查资料,在百度,google上搜索了好几天,基本把所有的文章都翻遍了,根本没有人实现过惊恐,好吧,我承认有点虚了,这可咋办。

后来想到cocos2dx的例子里有个类似的效果,不过那个是个action,后来看了看感觉还可以,只是效果和我的需求有点差异,但终归是找到了实现的思路,于是开始看cocos2dx的源码,主要用到的是cocos的网格动画,涉及到以下几个文件:

 

CCGrid.h /cpp :网格数据及渲染,包括基本网格数据和3D网格数据,这是数据的基础。

CCActionGrid.h /cpp :网格基本动画,这是动画的基础。

CCActionGrid3D.h/cpp: 3D网格基本动画,这是3D网格动画的基础。

CCActionTiledGrid.h / cpp :网格衍生动画,这是最终的特效实现。

咱们这里主要用到CCGrid.h进行渲染,其他三个是action的实现。

 

这里插一句,在此之前,我曾经还想用遮罩去实现类似的翻书效果,因为android上类似效果的实现就是实用遮罩的,可是在cocos中这种方法行不通,最终放弃了。

void MyGrid3D::blit()
{
    glEnable(GL_CULL_FACE);
    CCDirector::sharedDirector()->setDepthTest(true);
    
    CCGrid3D::blit();
    
    glDisable(GL_CULL_FACE);
    CCDirector::sharedDirector()->setDepthTest(false);
}

MyGrid3D* MyGrid3D::create(const CCSize& gridSize,const CCSize& textureSize,bool bReverse)
{
    MyGrid3D *pRet= new MyGrid3D();
    
    if (pRet)
    {
        if (pRet->initWithSize(gridSize,textureSize,bReverse))
        {
            pRet->autorelease();
        }
        else
        {
            delete pRet;
            pRet = NULL;
        }
    }
    
    return pRet;
}

看CCActionPageTurn3d这个类,cocos的翻页效果的实现就是在这个类中实现的,在这个类中有个update()函数:

 

/*

 * Update each tick

 * Time is the percentage of the way through the duration

 */

voidCCPageTurn3D::update(float time)

{

    float tt =MAX(0, time -0.25f);


#include "BoluPageTurn2.h"
#include "BoluButton.h"
#include "../BoluMsg/BoluMsgPick.h"
#include "../BoluStage.h"
#include "../BoluGame/BoluPropNm.h"
#include "../BoluPlay/BoluMngTable.h"
#include "RoundProgress.hpp"
#include "../BoluUserCfg.h"

#define FLIP_CARD_NUM "FLIPCARDNUM"

SuitPosInfo PageTurn2::pos[] = {{60,400,0},{60,263,0},{60,128,0}};

// implementation of PageTurn2
PageTurn2::PageTurn2(void):
m_pForeSprite(NULL),
m_pBgSprite(NULL),
m_pBgSpriteMirror(NULL),
m_pForeSpriteMirror(NULL),
m_pForeSpriteVertical(NULL),
m_pBgSpriteVertical(NULL),
m_pBgSpriteMirrorVertical(NULL),
m_pForeSpriteMirrorVertical(NULL),
//pHorizontalItem(NULL),
//pVerticalAItem(NULL),
//pVerticalEItem(NULL),
m_pShowPokerCard(NULL),
mpHideBtn(nullptr),
mpMenu(nullptr),
mpAlarmLabel(nullptr),
mCurLyr(nullptr)
{
    EventManager::sharedEventManager()->addObserver(this);
}

PageTurn2::~PageTurn2(void)
{
    EventManager::sharedEventManager()->removeObserver(this);
}

bool PageTurn2::init(const PickHAry &ary,int nTableId,int nLeftTime)
{
    bool bRet = false;
    do
    {
        CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();
        setContentSize(winSize);
        int num = GetRayInt(FLIP_CARD_NUM,0);
        if (num < 3) {
            num++;
            SetRayInt(FLIP_CARD_NUM, num);
            NtfShowTipsA("{0xFF0000亲,在设置-系统设置中可关闭或开启搓牌哦}");
        }
        mPickAry = ary;
        mNLeftTM = nLeftTime;
        
        mTableId = nTableId;
        mCurIndex = g_stage->mFlipProgress[mTableId];
        
        CCLayerColor* pBgLayer = CCLayerColor::create(ccc4(0, 0, 0, 125));
        pBgLayer->setContentSize(winSize);
        pBgLayer->setAnchorPoint(ccp(0, 0));
        pBgLayer->setPosition(ccp(0, 0));
        addChild(pBgLayer);
        
        CCSprite* pBgSprite = NtfCreateSprite("FarmAndPine/flip_left_bg.png");
        pBgSprite->setAnchorPoint(ccp(0, 0.5));
        pBgSprite->setPosition(ccp(0, winSize.height/2));
        this->addChild(pBgSprite);
        
        for (int i = 0; i < mPickAry.size(); i++) {
            if (mCurIndex > i)
            {
                String imgName = GetCardFace(mPickAry[i].mGrp, mPickAry[i].mNum);
                CCSprite* sprite = NtfCreateSprite(imgName.c_str());
                sprite->setPosition(ccp(pos[i].fx,pos[i].fy));
                this->addChild(sprite,1,i);
            }
            else if (mCurIndex == i) {
                cocos2d::extension::CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("BuilderAnimate/fanpaidonghuazuixin0.png", "BuilderAnimate/fanpaidonghuazuixin0.plist", "BuilderAnimate/fanpaidonghuazuixin.ExportJson");
                CCArmature* armatureTriangle = cocos2d::extension::CCArmature::create("fanpaidonghuazuixin");
                armatureTriangle->setAnchorPoint(ccp(0.5, 0.5));
                armatureTriangle->setPosition(ccp(pos[i].fx, pos[i].fy));
                armatureTriangle->getAnimation()->playWithIndex(0);
                this->addChild(armatureTriangle,1,mCurIndex);
            }
            else
            {
               
                CCSprite* sprite = NtfCreateSprite("SmallImg/bkg_playboard06.png");
                sprite->setPosition(ccp(pos[i].fx, pos[i].fy));
                this->addChild(sprite,1,i);
                
            }
        }
        m_sGridSize = CCSizeMake(50, 50);
        
        createPokerSprite(ary[mCurIndex].mGrp,ary[mCurIndex].mNum);
        
        
        
        
        
        // 玩家头像
        String sImg = g_pSelf->GetSelfIcon();
        if (sImg.empty())
            sImg = "ImgIcon/bkgIconCircle01.png";
        
        CCClippingNode* clipA = NtfSetHeadIcon(sImg.c_str(), CCSize(56, 56));
        clipA->setAnchorPoint(ccp(0.5, 0.5));
        clipA->setPosition(ccp(60, winSize.height - 118));
        this->addChild(clipA, 30,TAG_AVATAR);
        
        
        //搓牌倒计时
        CCSprite* pTimerBg = NtfCreateSprite("SmallImg/bkg_pic_Other.png");
        pTimerBg->setAnchorPoint(ccp(0.5, 0.5));
        pTimerBg->setPosition(ccp(60, winSize.height - 118));
        addChild(pTimerBg);
        
        g_stage->DisplayAvatar(g_pSelf->GetValue(RVT_ACC_ID), 0);
        
        
        
        std::stringstream s;
        s << mNLeftTM;
        
        CCNode *vNd = AddNumImg(atoi(s.str().c_str()), 10);
        vNd->setPosition(ccp(60, winSize.height - 118));
        vNd->setAnchorPoint(ccp(0.5, 0.5));
        this->addChild(vNd, 60,TAG_TIMER);
//        mpAlarmLabel = CCLabelTTF::create(s.str().c_str(), "", 22, CCSize(100, 50), kCCTextAlignmentCenter, kCCVerticalTextAlignmentCenter);
//        mpAlarmLabel->setPosition(ccp(60, winSize.height - 118));
//        mpAlarmLabel->setAnchorPoint(ccp(0.5, 0.5));
//        this->addChild(mpAlarmLabel,60);
        
        schedule(schedule_selector(PageTurn2::onAlarmUpdate), 1.0f, mNLeftTM, 0.0f);
        
        mFlipDemoOffset = 0;
        schedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
        
        RoundProgress* pProgress = RoundProgress::create();
        pProgress->setAnchorPoint(ccp(0.5, 0.5));
        pProgress->setPosition(ccp(pTimerBg->getContentSize().width/2,pTimerBg->getContentSize().height/2));
        pTimerBg->addChild(pProgress, 190);
        pProgress->start(mNLeftTM);
        
        //横置按钮
        SEL_MenuHandler rotate = menu_selector(PageTurn2::OnClickHorizontal);
        CRayButton *pRotateBtn = CRayButton::create("FarmAndPine/btn_rotate_normal.png", "FarmAndPine/btn_rotate_selected.png", NULL);
        pRotateBtn->AttachHandler(this, rotate);
        pRotateBtn->setPosition(ccp(origin.x + winSize.width - pRotateBtn->getContentSize().width / 2 - 100,
                                  origin.y + pRotateBtn->getContentSize().height / 2 + 120));
        pRotateBtn->EnableAnima(false);
        this->addChild(pRotateBtn);
        mTouchLyr.push_back(pRotateBtn);
        
        //开牌按钮
        SEL_MenuHandler flip = menu_selector(PageTurn2::OnClickFlip);
        CRayButton *pFlipBtn = CRayButton::create("FarmAndPine/btn_flipcard_normal.png", "FarmAndPine/btn_flipcard_selected.png", NULL);
        pFlipBtn->AttachHandler(this, flip);
        pFlipBtn->setPosition(ccp(origin.x + winSize.width - pFlipBtn->getContentSize().width / 2 - 100,
                                    origin.y + pFlipBtn->getContentSize().height / 2 + 420));
        pFlipBtn->EnableAnima(false);
        this->addChild(pFlipBtn,5);
        mTouchLyr.push_back(pFlipBtn);
        
        mpHideBtn = CCControlButton::create("", "", 26);
        mpHideBtn->setBackgroundSpriteForState(CCScale9Sprite::create("FarmAndPine/btn_hide_card_normal.png"), CCControlStateNormal);
        mpHideBtn->setBackgroundSpriteForState(CCScale9Sprite::create("FarmAndPine/btn_hide_card_selected.png"), CCControlStateHighlighted);
        mpHideBtn->setAnchorPoint(ccp(0.5, 0.5));
        mpHideBtn->setPosition(ccp(origin.x + winSize.width - mpHideBtn->getContentSize().width/2 - 95,
                                    origin.y + mpHideBtn->getContentSize().height/2 + 370));
        mpHideBtn->setContentSize(CCSizeMake(105, 90));
        mpHideBtn->setPreferredSize(CCSizeMake(105, 90));
        mpHideBtn->setZoomOnTouchDown(false);
        addChild(mpHideBtn,100);
        
        // 按下按钮事件回调
        mpHideBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(PageTurn2::onTouchDownAction), CCControlEventTouchDown);
        // 按钮在其内部拾起事件回调
        mpHideBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(PageTurn2::onTouchUpInsideAction), CCControlEventTouchUpInside);
        //按钮在其外部拾起事件回调
        mpHideBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(PageTurn2::onTouchUpOutsideAction), CCControlEventTouchUpOutside);
        
        if (mCurIndex == mPickAry.size()) {
            mbIsFliped = true;
            mFlipDemoOffset = 0;
            unschedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
            m_pForeSprite->setVisible(false);
            m_pForeSpriteMirror->setVisible(false);
            m_pBgSprite->setVisible(false);
            m_pBgSpriteMirror->setVisible(false);
            //添加盘牌动画
            m_pShowPokerCard = createPokerCard(mPickAry[mCurIndex-1].mGrp, mPickAry[mCurIndex-1].mNum,true);
            m_pShowPokerCard->setAnchorPoint(ccp(0.5, 0.5));
            m_pShowPokerCard->setPosition(ccp(winSize.width/2, winSize.height/2));
            this->addChild(m_pShowPokerCard,2);
            
            scheduleOnce(schedule_selector(PageTurn2::onRemoveUpdate), 2);
        }
        
        bRet = true;
    }
    while (0);
    return bRet;
}

void PageTurn2::onRemoveUpdate(float ft)
{
    g_stage->mFlipProgress[mTableId] = 0;
    removeFromParentAndCleanup(true);
    EventManager::sharedEventManager()->notifyEventFinished(EventShowLastThreeCard);

}

void PageTurn2::onTouchDownAction(cocos2d::CCObject *sender, CCControlEvent controlEvent)
{
    if (!mbIsFliped) {
        
        if (mCardShowType == Horizontal || mCardShowType == Horizontal2) {
            mFlipDemoOffset = 0;
            unschedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
            m_pForeSprite->setVisible(false);
            m_pForeSpriteMirror->setVisible(false);
            m_pBgSprite->setVisible(false);
            m_pBgSpriteMirror->setVisible(false);
        }
        else
        {
            m_pForeSpriteVertical->setVisible(false);
            m_pForeSpriteMirrorVertical->setVisible(false);
            m_pBgSpriteVertical->setVisible(false);
            m_pBgSpriteMirrorVertical->setVisible(false);
        }
    }
    
    
}

void PageTurn2::onTouchUpInsideAction(cocos2d::CCObject *sender, CCControlEvent controlEvent)
{
    if (!mbIsFliped) {
        
        if (mCardShowType == Horizontal || mCardShowType == Horizontal2) {
            mFlipDemoOffset = 0;
            schedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
            m_pForeSprite->setVisible(false);
            m_pForeSpriteMirror->setVisible(true);
            m_pBgSprite->setVisible(false);
            m_pBgSpriteMirror->setVisible(true);
        }
        else
        {
            m_pForeSpriteVertical->setVisible(false);
            m_pForeSpriteMirrorVertical->setVisible(true);
            m_pBgSpriteVertical->setVisible(false);
            m_pBgSpriteMirrorVertical->setVisible(true);
        }
    }
    
}

void PageTurn2::onTouchUpOutsideAction(cocos2d::CCObject *sender, CCControlEvent controlEvent)
{
    if (!mbIsFliped) {
        
        if (mCardShowType == Horizontal || mCardShowType == Horizontal2) {
            mFlipDemoOffset = 0;
            schedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
            m_pForeSprite->setVisible(false);
            m_pForeSpriteMirror->setVisible(true);
            m_pBgSprite->setVisible(false);
            m_pBgSpriteMirror->setVisible(true);
        }
        else
        {
            m_pForeSpriteVertical->setVisible(false);
            m_pForeSpriteMirrorVertical->setVisible(true);
            m_pBgSpriteVertical->setVisible(false);
            m_pBgSpriteMirrorVertical->setVisible(true);
        }
    }
    
}

void PageTurn2::createPokerSprite(CCrdGrp type, CCrdNum num)
{
    //水平牌
    m_pForeSprite = createPokerCard(type, num,false);
    m_pForeSprite->setAnchorPoint(ccp(0.5, 0.5));
    m_pForeSprite->setPosition(ccp(m_pForeSprite->getContentSize().width/2, m_pForeSprite->getContentSize().height/2));
    m_pForeSprite->setFlipX(true);
    this->addChild(m_pForeSprite,2);
    m_pForeSprite->setVisible(false);
    
    m_pForeSpriteMirror = createPokerCard(type, num,false);
    m_pForeSpriteMirror->setAnchorPoint(ccp(0.5, 0.5));
    m_pForeSpriteMirror->setPosition(ccp(mHOffsetX + m_pForeSpriteMirror->getContentSize().width/2,mHOffsetY + m_pForeSpriteMirror->getContentSize().height/2));
    this->addChild(m_pForeSpriteMirror);
    
    m_pBgSprite = NtfCreateSprite("Cards/card_bg.png");
    m_pBgSprite->setAnchorPoint(ccp(0.5, 0.5));
    m_pBgSprite->setPosition(ccp(m_pBgSprite->getContentSize().width/2, m_pBgSprite->getContentSize().height/2));
    this->addChild(m_pBgSprite,1);
    m_pBgSprite->setVisible(false);
    
    m_pBgSpriteMirror = NtfCreateSprite("Cards/card_bg.png");
    m_pBgSpriteMirror->setAnchorPoint(ccp(0.5, 0.5));
    m_pBgSpriteMirror->setPosition(ccp(mHOffsetX + m_pBgSpriteMirror->getContentSize().width/2,mHOffsetY + m_pBgSpriteMirror->getContentSize().height/2));
    this->addChild(m_pBgSpriteMirror);
    
    //竖直牌
    m_pForeSpriteVertical = createPokerCard(type, num,false);
    m_pForeSpriteVertical->setAnchorPoint(ccp(0.5, 0.5));
    m_pForeSpriteVertical->setPosition(ccp(m_pForeSpriteVertical->getContentSize().height/2 ,m_pForeSpriteVertical->getContentSize().width/2));
    m_pForeSpriteVertical->setFlipX(true);
    this->addChild(m_pForeSpriteVertical,2);
    m_pForeSpriteVertical->setVisible(false);
    m_pForeSpriteVertical->setRotation(90);
    
    m_pForeSpriteMirrorVertical = createPokerCard(type, num,false);
    m_pForeSpriteMirrorVertical->setAnchorPoint(ccp(0.5, 0.5));
    m_pForeSpriteMirrorVertical->setPosition(ccp(mVOffsetX + m_pForeSpriteMirrorVertical->getContentSize().height/2 ,mVOffsetY + m_pForeSpriteMirrorVertical->getContentSize().width/2));
    this->addChild(m_pForeSpriteMirrorVertical);
    m_pForeSpriteMirrorVertical->setRotation(90);
    
    
    m_pBgSpriteVertical = NtfCreateSprite("Cards/card_bg.png");
    m_pBgSpriteVertical->setAnchorPoint(ccp(0.5, 0.5));
    m_pBgSpriteVertical->setPosition(ccp(m_pBgSpriteVertical->getContentSize().height/2 ,m_pBgSpriteVertical->getContentSize().width/2));
    this->addChild(m_pBgSpriteVertical,1);
    m_pBgSpriteVertical->setVisible(false);
    m_pBgSpriteVertical->setRotation(90);
    
    m_pBgSpriteMirrorVertical = NtfCreateSprite("Cards/card_bg.png");
    m_pBgSpriteMirrorVertical->setAnchorPoint(ccp(0.5, 0.5));
    m_pBgSpriteMirrorVertical->setPosition(ccp(mVOffsetX + m_pBgSpriteMirrorVertical->getContentSize().height/2 ,mVOffsetY + m_pBgSpriteMirrorVertical->getContentSize().width/2));
    this->addChild(m_pBgSpriteMirrorVertical);
    m_pBgSpriteMirrorVertical->setRotation(90);
    
    
    if (mCardShowType == Horizontal || mCardShowType == Horizontal2) {
        m_pForeSpriteVertical->setVisible(false);
        m_pForeSpriteMirrorVertical->setVisible(false);
        m_pBgSpriteVertical->setVisible(false);
        m_pBgSpriteMirrorVertical->setVisible(false);
    }
    
//    cocos2d::extension::CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("BuilderAnimate/cuowo-triangle0.png", "BuilderAnimate/cuowo-triangle0.plist", "BuilderAnimate/cuowo-triangle.ExportJson");
//    CCArmature* armatureTriangle = cocos2d::extension::CCArmature::create("cuowo-triangle");
//    armatureTriangle->setAnchorPoint(ccp(1, 0));
//    armatureTriangle->setPosition(ccp(m_pBgSprite->getContentSize().width, 0));
//    armatureTriangle->getAnimation()->playWithIndex(0);
//    m_pBgSpriteMirror->addChild(armatureTriangle);
//    
//    
//    cocos2d::extension::CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("BuilderAnimate/cuopai0.png", "BuilderAnimate/cuopai0.plist", "BuilderAnimate/cuopai.ExportJson");
//    CCArmature* armature = cocos2d::extension::CCArmature::create("cuopai");
//    armature->setAnchorPoint(ccp(0, 0));
//    armature->setPosition(ccp(m_pBgSprite->getContentSize().width, 0));
//    armature->setRotation(-90);
//    armature->getAnimation()->playWithIndex(0);
//    m_pBgSpriteMirrorVertical->addChild(armature);
//    
//    CCArmature* armature2 = cocos2d::extension::CCArmature::create("cuopai");
//    armature2->setAnchorPoint(ccp(0, 0));
//    armature2->setPosition(ccp(0, m_pBgSprite->getContentSize().height));
//    armature2->setRotation(90);
//    armature2->getAnimation()->playWithIndex(0);
//    m_pBgSpriteMirrorVertical->addChild(armature2);
    
    startWithTarget(m_pForeSprite,true,m_pForeSprite->getContentSize());
    startWithTarget(m_pBgSprite,false,m_pBgSprite->getContentSize());
    
    startWithTarget(m_pForeSpriteVertical, true, CCSizeMake(m_pForeSpriteVertical->getContentSize().height, m_pForeSpriteVertical->getContentSize().width));
    startWithTarget(m_pBgSpriteVertical, false, CCSizeMake(m_pBgSpriteVertical->getContentSize().height, m_pBgSpriteVertical->getContentSize().width));
}


void PageTurn2::onAlarmUpdate(float ft)
{
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    CCNode* pNode = getChildByTag(TAG_TIMER);
    if (pNode) {
        pNode->removeFromParent();
        
        mNLeftTM--;
        if (mNLeftTM <= 0) {
            OnClickFlip(nullptr);
            unschedule(schedule_selector(PageTurn2::onAlarmUpdate));
        }
        std::stringstream s;
        s << mNLeftTM;
        CCNode *vNd = AddNumImg(atoi(s.str().c_str()), 10);
        vNd->setPosition(ccp(60, winSize.height - 118));
        vNd->setAnchorPoint(ccp(0.5, 0.5));
        this->addChild(vNd, 60,TAG_TIMER);
        
    }
//    if (mpAlarmLabel) {
//        mNLeftTM--;
//        if (mNLeftTM <= 0) {
//            OnClickFlip(nullptr);
//            unschedule(schedule_selector(PageTurn2::onAlarmUpdate));
//        }
//        std::stringstream s;
//        s << mNLeftTM;
//        
//        
//        mpAlarmLabel->setString(s.str().c_str());
//    }
}

void PageTurn2::onFlipDemoUpdate(float ft)
{
    if (mFlipDemoOffset > 100) {
        isIncrease = false;
    }
    else if(mFlipDemoOffset <= 0)
    {
        isIncrease = true;
    }
    if (isIncrease)
    {
        mFlipDemoOffset += 2;
    }
    else
    {
        mFlipDemoOffset -= 2;;
    }
    
    if (mCardShowType == Horizontal || mCardShowType == Horizontal2) {
        if (!m_pBgSprite->isVisible()) {
            m_pBgSprite->setVisible(true);
            m_pBgSpriteMirror->setVisible(false);
        }
        if (!m_pForeSprite->isVisible()) {
            m_pForeSprite->setVisible(true);
            m_pForeSpriteMirror->setVisible(false);
        }
    }
    else
    {
        if (!m_pBgSpriteVertical->isVisible()) {
            m_pBgSpriteVertical->setVisible(true);
            m_pBgSpriteMirrorVertical->setVisible(false);
        }
        if (!m_pForeSpriteVertical->isVisible()) {
            m_pForeSpriteVertical->setVisible(true);
            m_pForeSpriteMirrorVertical->setVisible(false);
        }
    }
    
    
    calculateHorizontalVertexPoints(mFlipDemoOffset / cosf(M_PI / 4),true);
}

PageTurn2* PageTurn2::create(const PickHAry &ary,int nTableId,int nLeftTime)
{
    PageTurn2 * pRet = new PageTurn2();
    if (pRet && pRet->init(ary,nTableId,nLeftTime))
    {
        pRet->autorelease();
    }
    else
    {
        CC_SAFE_DELETE(pRet);
    }
    return pRet;
}




MyGrid3D* PageTurn2::getGrid(bool bReverse,const CCSize& size)
{
    return MyGrid3D::create(m_sGridSize,size,bReverse);
}

void PageTurn2::startWithTarget(CCNode *pTarget, bool bReverse, const CCSize& size)
{
    
    CCGridBase *newgrid = this->getGrid(bReverse,size);
    
    CCNode *t = pTarget;
    CCGridBase *targetGrid = t->getGrid();
    
    if (targetGrid && targetGrid->getReuseGrid() > 0)
    {
        if (targetGrid->isActive() && targetGrid->getGridSize().width == m_sGridSize.width
            && targetGrid->getGridSize().height == m_sGridSize.height /*&& dynamic_cast<CCGridBase*>(targetGrid) != NULL*/)
        {
            targetGrid->reuse();
        }
        else
        {
            CCAssert(0, "");
        }
    }
    else
    {
        if (targetGrid && targetGrid->isActive())
        {
            targetGrid->setActive(false);
        }
        
        t->setGrid(newgrid);
        t->getGrid()->setActive(true);
    }
}

ccVertex3F PageTurn2::vertex(const CCPoint& position,CCNode *pTarget)
{
    CCGrid3D *g = (CCGrid3D*)pTarget->getGrid();
    return g->vertex(position);
}

ccVertex3F PageTurn2::originalVertex(const CCPoint& position,CCNode *pTarget)
{
    CCGrid3D *g = (CCGrid3D*)pTarget->getGrid();
    return g->originalVertex(position);
}

void PageTurn2::setVertex(const CCPoint& position, const ccVertex3F& vertex,CCNode *pTarget)
{
    CCGrid3D *g = (CCGrid3D*)pTarget->getGrid();
    g->setVertex(position, vertex);
}

void PageTurn2::registerWithTouchDispatcher()
{
//    CCDirector* pDirec = CCDirector::sharedDirector();
//    pDirec->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
}

bool PageTurn2::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    CCPoint point = pTouch->getLocation();
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    
    float borderXH = winSize.width/2 + m_pBgSprite->getContentSize().width/2;
    float borderYH = winSize.height/2 - m_pBgSprite->getContentSize().height/2;
    float borderXHMin = winSize.width/2 - m_pBgSprite->getContentSize().width/2;
    
    float borderXVMax = winSize.width/2 + m_pBgSprite->getContentSize().height/2;
    float borderXVMin = winSize.width/2 - m_pBgSprite->getContentSize().height/2;
    float borderYV = mVOffsetY;
    
    if (mCardShowType == Horizontal || mCardShowType == Horizontal2) {
        if (point.x > borderXH - 150 && point.x < borderXH && point.y > borderYH && point.y < borderYH + 150)
        {
            //触摸牌的右下角
            mTouchBegin = pTouch->getLocation();
            unschedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
        }
        else if (point.x > borderXHMin && point.x < borderXHMin + 150 && point.y > borderYH && point.y < borderYH + 150)
        {//触摸牌的左下角
            mTouchBegin = pTouch->getLocation();
            unschedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
        }
        else
        {
            mTouchBegin = CCPoint(0, 0);
        }
    }
    else
    {
        if (point.x > borderXVMin && point.x < borderXVMax && point.y > borderYV && point.y < borderYV + 150)
        {
            //垂直情况下触摸牌的下边缘
            mTouchBegin = pTouch->getLocation();
        }
        else
        {
            mTouchBegin = CCPoint(0, 0);
        }
    }
    
    
    return false;
}

void PageTurn2::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    if (mTouchBegin.x != 0 && mTouchBegin.y != 0 && !mbIsFliped) {
        if (mCardShowType == Horizontal || mCardShowType == Horizontal2) {
            if (!m_pBgSprite->isVisible()) {
                m_pBgSprite->setVisible(true);
                m_pBgSpriteMirror->setVisible(false);
            }
            if (!m_pForeSprite->isVisible()) {
                m_pForeSprite->setVisible(true);
                m_pForeSpriteMirror->setVisible(false);
            }
        }
        else
        {
            if (!m_pBgSpriteVertical->isVisible()) {
                m_pBgSpriteVertical->setVisible(true);
                m_pBgSpriteMirrorVertical->setVisible(false);
            }
            if (!m_pForeSpriteVertical->isVisible()) {
                m_pForeSpriteVertical->setVisible(true);
                m_pForeSpriteMirrorVertical->setVisible(false);
            }
        }
        
        
        float offsetX = mTouchBegin.x - pTouch->getLocation().x;
        float offsetY = pTouch->getLocation().y - mTouchBegin.y;
        bool flag;
        if (offsetX > 0) {
            flag = true;
        }
        else
        {
            flag = false;
        }
        
        float offset = fabs(offsetX) > offsetY ? offsetX : offsetY;
        calculateHorizontalVertexPoints(offset / cosf(M_PI/4), flag);
        
        calculateVerticalVertexPoints(offsetY);
        
        if (mCardShowType == Horizontal || mCardShowType == Horizontal2) {
//            CMsgTurnCrd::PostToSever(mBacId,g_pSelf->GetValue(RVT_ACC_ID), mPickAry[mCurIndex].mGrp, mPickAry[mCurIndex].mNum, mCardShowType, offsetX);
            judgeIsFlipCard(fabsf(offsetX) / cosf(M_PI / 4),mCardShowType,true);
        }
        else if (mCardShowType == VerticalA || mCardShowType == VerticalE)
        {
//            CMsgTurnCrd::PostToSever(mBacId,g_pSelf->GetValue(RVT_ACC_ID), mPickAry[mCurIndex].mGrp, mPickAry[mCurIndex].mNum, mCardShowType, offsetY);
            judgeIsFlipCard(offsetY / cosf(M_PI / 4),mCardShowType,true);
        }
    }
}

void PageTurn2::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
   if (mTouchBegin.x != 0 && mTouchBegin.y != 0 && !mbIsFliped) {
       
       calculateHorizontalVertexPoints(0,true);
       calculateVerticalVertexPoints(-mVOffsetY);
       if (mCardShowType == Horizontal || mCardShowType == Horizontal2) {
//           CMsgTurnCrd::PostToSever(mBacId,g_pSelf->GetValue(RVT_ACC_ID), mPickAry[mCurIndex].mGrp, mPickAry[mCurIndex].mNum, mCardShowType, 0);
       }
       else if (mCardShowType == VerticalA || mCardShowType == VerticalE)
       {
//           CMsgTurnCrd::PostToSever(mBacId,g_pSelf->GetValue(RVT_ACC_ID), mPickAry[mCurIndex].mGrp, mPickAry[mCurIndex].mNum, mCardShowType, -mVOffsetY);
       }
   }
}

void PageTurn2::calculateHorizontalVertexPoints(float offsetX,bool flag)
{
    
    float R = 50;
    
    if (flag)
    {
        float theta = (GLfloat)(M_PI / 6.0f);
        float b = (m_pBgSprite->getContentSize().width - offsetX * 1.4f) * sinf(theta);
        
        for (int i = 0; i <= m_sGridSize.width; ++i)
        {
            for (int j = 0; j <= m_sGridSize.height; ++j)
            {
                // Get original vertex
                ccVertex3F p = originalVertex(ccp(i ,j),m_pForeSprite);
                
                float x = (p.y + b) / tanf(theta);
                
                float pivotX = x + (p.x - x) * cosf(theta) * cosf(theta);
                float pivotY = pivotX * tanf(theta) - b;
                
                float l = (p.x - pivotX) / sinf(theta);
                float alpha = l / R;
                if (l >= 0) {
                    if (alpha > M_PI) {
                        p.x = (GLfloat)(mHOffsetX + pivotX - R * (alpha - M_PI) * sinf(theta));
                        p.y = (GLfloat)(mHOffsetY + pivotY + R * (alpha - M_PI) * cosf(theta));
                        p.z = (GLfloat)(2 * R / 9);
                    }
                    else if (alpha <= M_PI)
                    {
                        p.x = (GLfloat)(mHOffsetX + pivotX + R * sinf(alpha) * sinf(theta));
                        p.y = (GLfloat)(mHOffsetY + pivotY - R * sinf(alpha) * cosf(theta));
                        p.z = (GLfloat)((R - R * cosf(alpha)) / 9);
                    }
                }
                else
                {
                    p.x += mHOffsetX;
                    p.y += mHOffsetY;
                }
                
                // Set new coords
                setVertex(ccp(i, j), p,m_pForeSprite);
                
                
            }
        }
        
        for (int i = 0; i <= m_sGridSize.width; ++i)
        {
            for (int j = 0; j <= m_sGridSize.height; ++j)
            {
                // Get original vertex
                ccVertex3F p = originalVertex(ccp(i ,j),m_pBgSprite);
                float x = (p.y + b) / tanf(theta);
                
                float pivotX = x + (p.x - x) * cosf(theta) * cosf(theta);
                float pivotY = pivotX * tanf(theta) - b;
                
                float l = (p.x - pivotX) / sinf(theta);
                float alpha = l / R;
                if (l >= 0) {
                    if (alpha > M_PI) {
                        p.x = (GLfloat)(mHOffsetX + pivotX - R * (alpha - M_PI) * sinf(theta));
                        p.y = (GLfloat)(mHOffsetY + pivotY + R * (alpha - M_PI) * cosf(theta));
                        p.z = (GLfloat)(2 * R / 9);
                    }
                    else if (alpha <= M_PI)
                    {
                        p.x = (GLfloat)(mHOffsetX + pivotX + R * sinf(alpha) * sinf(theta));
                        p.y = (GLfloat)(mHOffsetY + pivotY - R * sinf(alpha) * cosf(theta));
                        p.z = (GLfloat)((R - R * cosf(alpha)) / 9);
                    }
                }
                else
                {
                    p.x += mHOffsetX;
                    p.y += mHOffsetY;
                }
                
                setVertex(ccp(i, j), p,m_pBgSprite);
                
                
                
            }
        }
        
    }
    else
    {
        float theta = (GLfloat)(M_PI / 6.0f);
        float b = fabsf(offsetX * 0.8f);
        for (int i = 0; i <= m_sGridSize.width; ++i)
        {
            for (int j = 0; j <= m_sGridSize.height; ++j)
            {
                // Get original vertex
                ccVertex3F p = originalVertex(ccp(i ,j),m_pForeSprite);
                
                float x = (p.y - b) / -tanf(theta);
                
                float pivotX = p.x + (x - p.x) * sinf(theta) * sinf(theta);
                float pivotY = pivotX * -tanf(theta) + b;
                
                float l = (pivotX - p.x) / sinf(theta);
                float alpha = l / R;
                if (l >= 0) {
                    if (alpha > M_PI) {
                        p.x = (GLfloat)(mHOffsetX + pivotX + R * (alpha - M_PI) * sinf(theta));
                        p.y = (GLfloat)(mHOffsetY + pivotY + R * (alpha - M_PI) * cosf(theta));
                        p.z = (GLfloat)(2 * R / 9);
                    }
                    else if (alpha <= M_PI)
                    {
                        p.x = (GLfloat)(mHOffsetX + pivotX - R * sinf(alpha) * sinf(theta));
                        p.y = (GLfloat)(mHOffsetY + pivotY - R * sinf(alpha) * cosf(theta));
                        p.z = (GLfloat)((R - R * cosf(alpha)) / 9);
                    }
                }
                else
                {
                    p.x += mHOffsetX;
                    p.y += mHOffsetY;
                }
                
                // Set new coords
                setVertex(ccp(i, j), p,m_pForeSprite);
                
                
            }
        }
        
        for (int i = 0; i <= m_sGridSize.width; ++i)
        {
            for (int j = 0; j <= m_sGridSize.height; ++j)
            {
                // Get original vertex
                ccVertex3F p = originalVertex(ccp(i ,j),m_pBgSprite);
                
                float x = (p.y - b) / -tanf(theta);
                
                float pivotX = p.x + (x - p.x) * sinf(theta) * sinf(theta);
                float pivotY = pivotX * -tanf(theta) + b;
                
                float l = (pivotX - p.x) / sinf(theta);
                float alpha = l / R;
                if (l >= 0) {
                    if (alpha > M_PI) {
                        p.x = (GLfloat)(mHOffsetX + pivotX + R * (alpha - M_PI) * sinf(theta));
                        p.y = (GLfloat)(mHOffsetY + pivotY + R * (alpha - M_PI) * cosf(theta));
                        p.z = (GLfloat)(2 * R / 9);
                    }
                    else if (alpha <= M_PI)
                    {
                        p.x = (GLfloat)(mHOffsetX + pivotX - R * sinf(alpha) * sinf(theta));
                        p.y = (GLfloat)(mHOffsetY + pivotY - R * sinf(alpha) * cosf(theta));
                        p.z = (GLfloat)((R - R * cosf(alpha)) / 9);
                    }
                }
                else
                {
                    p.x += mHOffsetX;
                    p.y += mHOffsetY;
                }

                
                setVertex(ccp(i, j), p,m_pBgSprite);
            }
        }
    }
    
    
    //    float R2 = 50;
    //    float offsetX2 = mTouchBegin.x - pTouch->getLocation().x;
    //    float pivotX2 = m_pForeSpriteVertical->getContentSize().height - offsetX2;
    //
    //
    //    for (int i = 0; i <= m_sGridSize.width; ++i)
    //    {
    //        for (int j = 0; j <= m_sGridSize.height; ++j)
    //        {
    //            // Get original vertex
    //            ccVertex3F p = originalVertex(ccp(i ,j),m_pForeSpriteVertical);
    //            float l = p.x - pivotX2;
    //            float alpha = l / R2;
    //            if (l >= 0) {
    //                if (alpha > M_PI) {
    //                    p.x = mVOffsetX + pivotX2 - R2 * (alpha - M_PI);
    //                    p.z = 2 * R2 / 9;
    //                    p.y = p.y + mVOffsetY;
    //                }
    //                else if (alpha <= M_PI)
    //                {
    //                    p.x = mVOffsetX + pivotX2 + R2 * sinf(alpha);
    //                    p.z = (R2 - R2 * cosf(alpha))/9;
    //                    p.y = p.y + mVOffsetY;
    //                }
    //            }
    //            else
    //            {
    //                p.x = p.x + mVOffsetX;
    //                p.y = p.y + mVOffsetY;
    //            }
    //
    //
    //            // Set new coords
    //            setVertex(ccp(i, j), p,m_pForeSpriteVertical);
    //
    //
    //        }
    //    }
    //
    //    for (int i = 0; i <= m_sGridSize.width; ++i)
    //    {
    //        for (int j = 0; j <= m_sGridSize.height; ++j)
    //        {
    //            // Get original vertex
    //            ccVertex3F p = originalVertex(ccp(i ,j),m_pBgSpriteVertical);
    //            float l = p.x - pivotX2;
    //            float alpha = l / R2;
    //            if (l >= 0) {
    //                if (alpha > M_PI) {
    //                    p.x = mVOffsetX + pivotX2 - R2 * (alpha - M_PI);
    //                    p.z = 2 * R2 / 9;
    //                    p.y = p.y + mVOffsetY;
    //                }
    //                else if (alpha <= M_PI)
    //                {
    //                    p.x = mVOffsetX + pivotX2 + R2 * sinf(alpha);
    //                    p.z = (R2 - R2 * cosf(alpha))/9;
    //                    p.y = p.y + mVOffsetY;
    //                }
    //            }
    //            else
    //            {
    //                p.x = p.x + mVOffsetX;
    //                p.y = p.y + mVOffsetY;
    //            }
    //
    //            // Set new coords
    //            setVertex(ccp(i, j), p,m_pBgSpriteVertical);
    //            
    //            
    //            
    //        }
    //    }
}

void PageTurn2::calculateVerticalVertexPoints(float offsetY)
{
    float R2 = 50;
    float pivotY = offsetY + mVOffsetY;
    
    
    for (int i = 0; i <= m_sGridSize.width; ++i)
    {
        for (int j = 0; j <= m_sGridSize.height; ++j)
        {
            // Get original vertex
            ccVertex3F p = originalVertex(ccp(i ,j),m_pForeSpriteVertical);
            float l = pivotY - p.y;
            float alpha = l / R2;
            if (l >= 0) {
                if (alpha > M_PI) {
                    p.z = (GLfloat)(2 * R2 / 9);
                    p.y = (GLfloat)(mVOffsetY + pivotY + R2 * (alpha - M_PI));
                    p.x += mVOffsetX;
                }
                else if (alpha <= M_PI)
                {
                    p.z = (GLfloat)((R2 - R2 * cosf(alpha))/9);
                    p.y = (GLfloat)(mVOffsetY + pivotY - R2 * sinf(alpha));
                    
                    p.x += mVOffsetX;
                }
            }
            else
            {
                p.x += mVOffsetX;
                p.y += mVOffsetY;
            }
            
            
            // Set new coords
            setVertex(ccp(i, j), p,m_pForeSpriteVertical);
            
            
        }
    }
    
    for (int i = 0; i <= m_sGridSize.width; ++i)
    {
        for (int j = 0; j <= m_sGridSize.height; ++j)
        {
            // Get original vertex
            ccVertex3F p = originalVertex(ccp(i ,j),m_pBgSpriteVertical);
            float l = pivotY - p.y;
            float alpha = l / R2;
            if (l >= 0) {
                if (alpha > M_PI) {
                    p.z = (GLfloat)(2 * R2 / 9);
                    p.y = (GLfloat)(mVOffsetY + pivotY + R2 * (alpha - M_PI));
                    p.x += mVOffsetX;
                }
                else if (alpha <= M_PI)
                {
                    p.z = (GLfloat)((R2 - R2 * cosf(alpha))/9);
                    p.y = (GLfloat)(mVOffsetY + pivotY - R2 * sinf(alpha));
                    
                    p.x += mVOffsetX;
                }
            }
            else
            {
                p.x += mVOffsetX;
                p.y += mVOffsetY;
            }            // Set new coords
            setVertex(ccp(i, j), p,m_pBgSpriteVertical);
            
            
            
        }
    }
}

void PageTurn2::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    
}

void PageTurn2::OnEnterEvn(CCNode*)				// 进入动画结束执行的事件
{
    
}
void PageTurn2::OnExitEvn(CCNode*)					// 退出动画结束执行的事件
{
    removeFromParent();
}

// 返回
void PageTurn2::OnClickBack(CCObject* pObject)
{
    NtfPlayClose();//关闭的音效
    removeFromParent();
}

void PageTurn2::OnClickHorizontal(cocos2d::CCObject *pObject)
{
    NtfPlayDefBtnSnd();
    if (!mbIsFliped) {
        
		if (mCardShowType != Horizontal && mCardShowType == VerticalE) {
            mFlipDemoOffset = 0;
            schedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
			mCardShowType = Horizontal;
			m_pForeSprite->setVisible(false);
			m_pForeSpriteMirror->setVisible(true);
			m_pBgSprite->setVisible(false);
			m_pBgSpriteMirror->setVisible(true);

			m_pForeSpriteVertical->setVisible(false);
			m_pForeSpriteMirrorVertical->setVisible(false);
			m_pBgSpriteVertical->setVisible(false);
			m_pBgSpriteMirrorVertical->setVisible(false);
            
            m_pForeSprite->setRotation(0);
            m_pForeSpriteMirror->setRotation(0);
            m_pBgSprite->setRotation(0);
            m_pBgSpriteMirror->setRotation(0);

		}
        else if (mCardShowType == Horizontal)
        {
            mFlipDemoOffset = 0;
            unschedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
            mCardShowType = VerticalA;
            m_pForeSprite->setVisible(false);
            m_pForeSpriteMirror->setVisible(false);
            m_pBgSprite->setVisible(false);
            m_pBgSpriteMirror->setVisible(false);
            
            m_pForeSpriteVertical->setVisible(false);
            m_pForeSpriteMirrorVertical->setVisible(true);
            m_pBgSpriteVertical->setVisible(false);
            m_pBgSpriteMirrorVertical->setVisible(true);
            
            m_pForeSpriteVertical->setRotation(-90);
            m_pForeSpriteMirrorVertical->setRotation(-90);
            m_pBgSpriteVertical->setRotation(-90);
            m_pBgSpriteMirrorVertical->setRotation(-90);
        }
        else if (mCardShowType == VerticalA)
        {
            mFlipDemoOffset = 0;
            schedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
            mCardShowType = Horizontal2;
            m_pForeSprite->setVisible(false);
            m_pForeSpriteMirror->setVisible(true);
            m_pBgSprite->setVisible(false);
            m_pBgSpriteMirror->setVisible(true);
            
            m_pForeSpriteVertical->setVisible(false);
            m_pForeSpriteMirrorVertical->setVisible(false);
            m_pBgSpriteVertical->setVisible(false);
            m_pBgSpriteMirrorVertical->setVisible(false);
            
            m_pForeSprite->setRotation(180);
            m_pForeSpriteMirror->setRotation(180);
            m_pBgSprite->setRotation(180);
            m_pBgSpriteMirror->setRotation(180);
            
        }
        else if(mCardShowType == Horizontal2)
        {
            mFlipDemoOffset = 0;
            unschedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
            mCardShowType = VerticalE;
            m_pForeSprite->setVisible(false);
            m_pForeSpriteMirror->setVisible(false);
            m_pBgSprite->setVisible(false);
            m_pBgSpriteMirror->setVisible(false);
            
            m_pForeSpriteVertical->setVisible(false);
            m_pForeSpriteMirrorVertical->setVisible(true);
            m_pBgSpriteVertical->setVisible(false);
            m_pBgSpriteMirrorVertical->setVisible(true);
            
            m_pForeSpriteVertical->setRotation(90);
            m_pForeSpriteMirrorVertical->setRotation(90);
            m_pBgSpriteVertical->setRotation(90);
            m_pBgSpriteMirrorVertical->setRotation(90);
        }
    }
    
}

void PageTurn2::OnClickVerticalA(CCObject* pObject)
{
	NtfPlayDefBtnSnd();
	if (!mbIsFliped) {
		if (mCardShowType != VerticalA) {
			mCardShowType = VerticalA;
			m_pForeSprite->setVisible(false);
			m_pForeSpriteMirror->setVisible(false);
			m_pBgSprite->setVisible(false);
			m_pBgSpriteMirror->setVisible(false);

			m_pForeSpriteVertical->setVisible(false);
			m_pForeSpriteMirrorVertical->setVisible(true);
			m_pBgSpriteVertical->setVisible(false);
			m_pBgSpriteMirrorVertical->setVisible(true);

			m_pForeSpriteVertical->setRotation(-90);
			m_pForeSpriteMirrorVertical->setRotation(-90);
			m_pBgSpriteVertical->setRotation(-90);
			m_pBgSpriteMirrorVertical->setRotation(-90);

//			if (pHorizontalItem && pVerticalAItem && pVerticalEItem)
//			{
//				pHorizontalItem->unselected();
//				pVerticalAItem->selected();
//				pVerticalEItem->unselected();
//			}
		}
		
		
	}
}

void PageTurn2::OnClickVerticalE(CCObject* pObject)
{
	NtfPlayDefBtnSnd();
	if (!mbIsFliped) {
		if (mCardShowType != VerticalE) {
			mCardShowType = VerticalE;
			m_pForeSprite->setVisible(false);
			m_pForeSpriteMirror->setVisible(false);
			m_pBgSprite->setVisible(false);
			m_pBgSpriteMirror->setVisible(false);

			m_pForeSpriteVertical->setVisible(false);
			m_pForeSpriteMirrorVertical->setVisible(true);
			m_pBgSpriteVertical->setVisible(false);
			m_pBgSpriteMirrorVertical->setVisible(true);

			m_pForeSpriteVertical->setRotation(90);
			m_pForeSpriteMirrorVertical->setRotation(90);
			m_pBgSpriteVertical->setRotation(90);
			m_pBgSpriteMirrorVertical->setRotation(90);

//			if (pHorizontalItem && pVerticalAItem && pVerticalEItem)
//			{
//				pHorizontalItem->unselected();
//				pVerticalAItem->unselected();
//				pVerticalEItem->selected();
//			}
		}
		

	}
}

void PageTurn2::OnClickFlip(cocos2d::CCObject *pObject)
{
    NtfPlayDefBtnSnd();
    if (!mbIsFliped) {
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();
        
        judgeIsFlipCard(winSize.width/2 + 300,mCardShowType,true);
        mCurIndex = 3;
        for (int i = 0; i < sizeof(pos) / sizeof(SuitPosInfo); i++) {
            CCNode* pNode = (CCNode*)getChildByTag(i);
            if (pNode) {
                pNode->removeFromParentAndCleanup(true);
                String imgName = GetCardFace(mPickAry[i].mGrp, mPickAry[i].mNum);
                CCSprite* sprite = NtfCreateSprite(imgName.c_str());
                sprite->setPosition(ccp(pos[i].fx, pos[i].fy));
                this->addChild(sprite,1,i);
            }
        }
        
    }
    
}


CCSprite* PageTurn2::createPokerCard(CCrdGrp type, CCrdNum num, bool isShowNum)
{
    CCSize size = CCSizeMake(778, 521);
    //牌类型图标的位置信息
    static SuitPosInfo s_spi1[] = {{389,260,-90}};
    static SuitPosInfo s_spi2[] = {{165,260,-90},{615,260,90}};
    static SuitPosInfo s_spi3[] = {{165,260,-90},{615,260,90},{389,260,-90}};
    static SuitPosInfo s_spi4[] = {{165,400,-90},{165,125,-90},{620,400,90},{620,125,90}};
    static SuitPosInfo s_spi5[] = {{165,400,-90},{165,125,-90},{620,400,90},{620,125,90},{389,260,-90}};
    static SuitPosInfo s_spi6[] = {{165,400,-90},{165,125,-90},{620,400,90},{620,125,90},{389,400,90},{409,125,90}};
    static SuitPosInfo s_spi7[] = {{165,400,-90},{165,125,-90},{620,400,90},{620,125,90},{389,400,-90},{409,125,-90},{290,260,-90}};
    static SuitPosInfo s_spi8[] = {{165,400,-90},{165,125,-90},{620,400,90},{620,125,90},{389,400,90},{409,125,90},{290,260,-90},{503,260,90}};
    static SuitPosInfo s_spi9[] = {{165,400,-90},{165,125,-90},{620,400,90},{620,125,90},{475,400,90},{475,125,90},{308,400,-90},{308,125,-90},{389,260,-90}};
    static SuitPosInfo s_spi10[] = {{165,400,-90},{165,125,-90},{620,400,90},{620,125,90},{475,400,90},{475,125,90},{308,400,-90},{308,125,-90},{250,260,-90},{542,260,90}};
    static SuitPosInfo s_spiS[] = {{389,260,-90},{399,260,90},{177,135,-90},{596,385,90}};
    
    //牌数字图标的位置信息
    static SuitPosInfo s_spiNumPos[] = {{100,42,-90},{680,480,90}};
    
    std::string imageName;
    std::string numImgName;
    int nCardNum;
    CCSprite* pForeBg = NtfCreateSprite("Cards/card_fore.png");
    
    
    switch (type) {
        case CRDG_SPADE:
            imageName = "Cards/spade.png";
            numImgName = "Cards/spade_";
            break;
        case CRDG_HEART:
            imageName = "Cards/heart.png";
            numImgName = "Cards/heart_";
            break;
        case CRDG_CLUB:
            imageName = "Cards/club.png";
            numImgName = "Cards/club_";
            break;
        case CRDG_DIAMOND:
            imageName = "Cards/diamond.png";
            numImgName = "Cards/diamond_";
            break;
            
        default:
            break;
    }
    
    String centerImgName;
    //添加牌型ICON
    switch (num) {
        case CRDN_A:
            nCardNum = 1;
            if (type == CRDG_SPADE) {
                imageName = "Cards/spade_a_center.png";
            }
            for (int i = 0; i < nCardNum; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spi1[i].fx,s_spi1[i].fy));
                pSprite->setRotation(s_spi1[i].fRotate);
                pForeBg->addChild(pSprite);
                
            }
            
            numImgName.append("a.png");
            break;
        case CRDN_N2:
            nCardNum = 2;
            for (int i = 0; i < nCardNum; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spi2[i].fx,s_spi2[i].fy));
                pSprite->setRotation(s_spi2[i].fRotate);
                pForeBg->addChild(pSprite);
                
            }
            
            numImgName.append("2.png");
            break;
        case CRDN_N3:
            nCardNum = 3;
            for (int i = 0; i < nCardNum; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spi3[i].fx,s_spi3[i].fy));
                pSprite->setRotation(s_spi3[i].fRotate);
                pForeBg->addChild(pSprite);
                
            }
            
            numImgName.append("3.png");
            break;
        case CRDN_N4:
            nCardNum = 4;
            for (int i = 0; i < nCardNum; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spi4[i].fx,s_spi4[i].fy));
                pSprite->setRotation(s_spi4[i].fRotate);
                pForeBg->addChild(pSprite);
                
            }
            
            numImgName.append("4.png");
            break;
        case CRDN_N5:
            nCardNum = 5;
            for (int i = 0; i < nCardNum; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spi5[i].fx,s_spi5[i].fy));
                pSprite->setRotation(s_spi5[i].fRotate);
                pForeBg->addChild(pSprite);
                
            }
            
            numImgName.append("5.png");
            break;
        case CRDN_N6:
            nCardNum = 6;
            for (int i = 0; i < nCardNum; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spi6[i].fx,s_spi6[i].fy));
                pSprite->setRotation(s_spi6[i].fRotate);
                pForeBg->addChild(pSprite);
                
            }
            
            numImgName.append("6.png");
            break;
        case CRDN_N7:
            nCardNum = 7;
            for (int i = 0; i < nCardNum; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spi7[i].fx,s_spi7[i].fy));
                pSprite->setRotation(s_spi7[i].fRotate);
                pForeBg->addChild(pSprite);
                
            }
            
            numImgName.append("7.png");
            break;
        case CRDN_N8:
            nCardNum = 8;
            for (int i = 0; i < nCardNum; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spi8[i].fx,s_spi8[i].fy));
                pSprite->setRotation(s_spi8[i].fRotate);
                pForeBg->addChild(pSprite);
                
            }
            
            numImgName.append("8.png");
            break;
        case CRDN_N9:
            nCardNum = 9;
            for (int i = 0; i < nCardNum; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spi9[i].fx,s_spi9[i].fy));
                pSprite->setRotation(s_spi9[i].fRotate);
                pForeBg->addChild(pSprite);
                
            }
            
            numImgName.append("9.png");
            break;
        case CRDN_N10:
            nCardNum = 10;
            for (int i = 0; i < nCardNum; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spi10[i].fx,s_spi10[i].fy));
                pSprite->setRotation(s_spi10[i].fRotate);
                pForeBg->addChild(pSprite);
                
            }
            
            numImgName.append("10.png");
            break;
        case CRDN_J:
            nCardNum = 11;
            if (type == CRDG_HEART || type == CRDG_DIAMOND) {
                centerImgName = "Cards/red_j.png";
            }
            else if(type == CRDG_SPADE || type == CRDG_CLUB)
            {
                centerImgName = "Cards/black_j.png";
            }
            for (int i = 0; i < 1; i++) {
                CCSprite* pSprite = NtfCreateSprite(centerImgName.c_str());
                if (i == 0) {
                    pSprite->setAnchorPoint(ccp(0.5, 0.5));
                }
                else
                {
                    pSprite->setAnchorPoint(ccp(0.5, 0));
                }
                pSprite->setPosition(ccp(s_spiS[i].fx,s_spiS[i].fy));
                pSprite->setRotation(s_spiS[i].fRotate);
                pForeBg->addChild(pSprite);
            }
            
            for (int i = 2; i < 4; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spiS[i].fx,s_spiS[i].fy));
                pSprite->setRotation(s_spiS[i].fRotate);
                pSprite->setScale(0.8f);
                pForeBg->addChild(pSprite);
            }
            
            numImgName.append("j.png");
            break;
        case CRDN_Q:
            nCardNum = 12;
            if (type == CRDG_HEART || type == CRDG_DIAMOND) {
                centerImgName = "Cards/red_q.png";
            }
            else if(type == CRDG_SPADE || type == CRDG_CLUB)
            {
                centerImgName = "Cards/black_q.png";
            }
            for (int i = 0; i < 1; i++) {
                CCSprite* pSprite = NtfCreateSprite(centerImgName.c_str());
                if (i == 0) {
                    pSprite->setAnchorPoint(ccp(0.5, 0.5));
                }
                else
                {
                    pSprite->setAnchorPoint(ccp(0.5, 0));
                }
                pSprite->setPosition(ccp(s_spiS[i].fx,s_spiS[i].fy));
                pSprite->setRotation(s_spiS[i].fRotate);
                pForeBg->addChild(pSprite);
            }
            for (int i = 2; i < 4; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spiS[i].fx,s_spiS[i].fy));
                pSprite->setRotation(s_spiS[i].fRotate);
                pSprite->setScale(0.8f);
                pForeBg->addChild(pSprite);
            }
            
            numImgName.append("q.png");
            break;
        case CRDN_K:
            nCardNum = 13;
            if (type == CRDG_HEART || type == CRDG_DIAMOND) {
                centerImgName = "Cards/red_k.png";
            }
            else if(type == CRDG_SPADE || type == CRDG_CLUB)
            {
                centerImgName = "Cards/black_k.png";
            }
            for (int i = 0; i < 1; i++) {
                CCSprite* pSprite = NtfCreateSprite(centerImgName.c_str());
                if (i == 0) {
                    pSprite->setAnchorPoint(ccp(0.5, 0.5));
                }
                else
                {
                    pSprite->setAnchorPoint(ccp(0.5, 0));
                }
                pSprite->setPosition(ccp(s_spiS[i].fx,s_spiS[i].fy));
                pSprite->setRotation(s_spiS[i].fRotate);
                pForeBg->addChild(pSprite);
            }
            for (int i = 2; i < 4; i++) {
                CCSprite* pSprite = NtfCreateSprite(imageName.c_str());
                pSprite->setPosition(ccp(s_spiS[i].fx,s_spiS[i].fy));
                pSprite->setRotation(s_spiS[i].fRotate);
                pSprite->setScale(0.8f);
                pForeBg->addChild(pSprite);
                
            }
            
            numImgName.append("k.png");
            break;
            
        default:
            break;
    }
    //添加牌型数字
    if (isShowNum) {
        for (int i = 0; i < 2; i++) {
            CCSprite* pSprite = NtfCreateSprite(numImgName.c_str());
            pSprite->setPosition(ccp(s_spiNumPos[i].fx,s_spiNumPos[i].fy));
            pSprite->setRotation(s_spiNumPos[i].fRotate);
            pForeBg->addChild(pSprite);
        }
    }
    
    return pForeBg;
}


void PageTurn2::onEventDone(int event, void *data)
{
    if (event == EventTurnCard) {
        CTurnCrd* pTurnCrd = static_cast<CTurnCrd*>(data);
        if (pTurnCrd) {
            if (pTurnCrd->mRubAc != g_pSelf->GetValue(RVT_ACC_ID) && !mbIsFliped) {
                if (pTurnCrd->mPlace == Horizontal)
                {
                    mCardShowType = Horizontal;
                    m_pForeSprite->setVisible(false);
                    m_pForeSpriteMirror->setVisible(true);
                    m_pBgSprite->setVisible(false);
                    m_pBgSpriteMirror->setVisible(true);
                    
                    m_pForeSpriteVertical->setVisible(false);
                    m_pForeSpriteMirrorVertical->setVisible(false);
                    m_pBgSpriteVertical->setVisible(false);
                    m_pBgSpriteMirrorVertical->setVisible(false);
                    
                    if (!m_pBgSprite->isVisible()) {
                        m_pBgSprite->setVisible(true);
                        m_pBgSpriteMirror->setVisible(false);
                    }
                    if (!m_pForeSprite->isVisible()) {
                        m_pForeSprite->setVisible(true);
                        m_pForeSpriteMirror->setVisible(false);
                    }
                    
                    calculateHorizontalVertexPoints(pTurnCrd->mOffset / cosf(M_PI / 4),true);
                    judgeIsFlipCard(pTurnCrd->mOffset / cosf(M_PI / 4),mCardShowType,false);
                }
                else
                {
                    mCardShowType = VerticalA;
                    m_pForeSprite->setVisible(false);
                    m_pForeSpriteMirror->setVisible(false);
                    m_pBgSprite->setVisible(false);
                    m_pBgSpriteMirror->setVisible(false);
                    
                    m_pForeSpriteVertical->setVisible(false);
                    m_pForeSpriteMirrorVertical->setVisible(true);
                    m_pBgSpriteVertical->setVisible(false);
                    m_pBgSpriteMirrorVertical->setVisible(true);
                    
                    if (!m_pBgSpriteVertical->isVisible()) {
                        m_pBgSpriteVertical->setVisible(true);
                        m_pBgSpriteMirrorVertical->setVisible(false);
                    }
                    if (!m_pForeSpriteVertical->isVisible()) {
                        m_pForeSpriteVertical->setVisible(true);
                        m_pForeSpriteMirrorVertical->setVisible(false);
                    }
                    
                    calculateVerticalVertexPoints(pTurnCrd->mOffset / cosf(M_PI / 4));
                    judgeIsFlipCard(pTurnCrd->mOffset / cosf(M_PI / 4),mCardShowType,false);
                }
                
            }
        }
    }
    else if (event == EventOpenAddTableView)
    {
        CCTouchDispatcher* td = CCDirector::sharedDirector()->getTouchDispatcher();
        if (mpMenu) {
            td->setPriority(10000, mpMenu);
        }
        if (mpHideBtn) {
            td->setPriority(10000, mpHideBtn);
        }
    }
    else if (event == EventCloseAddTableView)
    {
        CCTouchDispatcher* td = CCDirector::sharedDirector()->getTouchDispatcher();
        if (mpMenu) {
            td->setPriority(0, mpMenu);
        }
        if (mpHideBtn) {
            td->setPriority(0, mpHideBtn);
        }

    }
    else if(event == EventUpdateAvatar)
    {
        EVENT_UPDATEAVATAR_DATA* peud = (EVENT_UPDATEAVATAR_DATA*)data;
        if (!peud) {
            return;
        }
        if (peud->nAccId == g_pSelf->GetValue(RVT_ACC_ID)) {
            CCNode* pAvatar = this->getChildByTag(TAG_AVATAR);
            if (pAvatar) {
                pAvatar->removeFromParent();
            }
            CCSize winSize = CCDirector::sharedDirector()->getWinSize();
            CCSprite* sprite = CCSprite::createWithTexture(peud->texture);
            CCClippingNode* clipA = NtfSetHeadIcon(sprite, CCSize(56, 56));
            clipA->setAnchorPoint(ccp(0.5, 0.5));
            clipA->setPosition(ccp(60, winSize.height - 118));
            this->addChild(clipA, 30,TAG_AVATAR);
        }
        
        
        
    }
    
}

void PageTurn2::onFlipAnimFinished(cocos2d::CCNode *pNode)
{
//    CMsgTurnCrd::PostToSever(mBacId,g_pSelf->GetValue(RVT_ACC_ID), mCurType, mCurNum, TurnOver, 0);
//    
//    mCurIndex++;
    
    
    if (mCurIndex < mPickAry.size()) {
        
        CCNode* node = (CCNode*)getChildByTag(mCurIndex);
        if (node) {
            node->removeFromParentAndCleanup(true);
            cocos2d::extension::CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("BuilderAnimate/fanpaidonghuazuixin0.png", "BuilderAnimate/fanpaidonghuazuixin0.plist", "BuilderAnimate/fanpaidonghuazuixin.ExportJson");
            CCArmature* armatureTriangle = cocos2d::extension::CCArmature::create("fanpaidonghuazuixin");
            armatureTriangle->setAnchorPoint(ccp(0.5, 0.5));
            armatureTriangle->setPosition(ccp(pos[mCurIndex].fx, pos[mCurIndex].fy));
            armatureTriangle->getAnimation()->playWithIndex(0);
            this->addChild(armatureTriangle,1,mCurIndex);
        }
        
        if (m_pForeSprite) {
            m_pForeSprite->removeFromParentAndCleanup(true);
        }
        if (m_pForeSpriteMirror) {
            m_pForeSpriteMirror->removeFromParentAndCleanup(true);
        }
        if (m_pBgSprite) {
            m_pBgSprite->removeFromParentAndCleanup(true);
        }
        if (m_pBgSpriteMirror) {
            m_pBgSpriteMirror->removeFromParentAndCleanup(true);
        }
        if (m_pForeSpriteVertical) {
            m_pForeSpriteVertical->removeFromParentAndCleanup(true);
        }
        if (m_pForeSpriteMirrorVertical) {
            m_pForeSpriteMirrorVertical->removeFromParentAndCleanup(true);
        }
        if (m_pBgSpriteVertical) {
            m_pBgSpriteVertical->removeFromParentAndCleanup(true);
        }
        if (m_pBgSpriteMirrorVertical) {
            m_pBgSpriteMirrorVertical->removeFromParentAndCleanup(true);
        }
        if (m_pShowPokerCard) {
            m_pShowPokerCard->removeFromParentAndCleanup(true);
        }
        mCardShowType = Horizontal;
        createPokerSprite(mPickAry[mCurIndex].mGrp, mPickAry[mCurIndex].mNum);
        mFlipDemoOffset = 0;
        schedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
        mbIsFliped = false;
    }
    else
    {
        g_stage->mFlipProgress[mTableId] = 0;
        removeFromParentAndCleanup(true);
        EventManager::sharedEventManager()->notifyEventFinished(EventShowLastThreeCard);
    }
}

void PageTurn2::judgeIsFlipCard(float offset,CardShowType showType,bool flag)
{
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    //判断是否已经翻牌了
    if ((((showType == Horizontal || showType == Horizontal2) && offset > (winSize.width/2 + 250)) || ((showType == VerticalA || showType == VerticalE) && offset > winSize.height/2 + 250)) && !mbIsFliped) {
        mbIsFliped = true;
        
        unschedule(schedule_selector(PageTurn2::onFlipDemoUpdate));
        m_pBgSprite->setVisible(false);
        m_pForeSprite->setVisible(false);
        m_pBgSpriteVertical->setVisible(false);
        m_pForeSpriteVertical->setVisible(false);
        m_pBgSpriteMirror->setVisible(false);
        m_pForeSpriteMirror->setVisible(false);
        m_pBgSpriteMirrorVertical->setVisible(false);
        m_pForeSpriteMirrorVertical->setVisible(false);
        
        //添加盘牌动画
        m_pShowPokerCard = createPokerCard(mPickAry[mCurIndex].mGrp, mPickAry[mCurIndex].mNum,true);
        m_pShowPokerCard->setAnchorPoint(ccp(0.5, 0.5));
        m_pShowPokerCard->setPosition(ccp(winSize.width/2, winSize.height/2));
        this->addChild(m_pShowPokerCard,2);
        m_pShowPokerCard->setScale(2.0f);
        
        CCScaleTo* scale = CCScaleTo::create(0.1f, 1.0f);
        CCDelayTime* delay = CCDelayTime::create(2.0f);
        CCArray* ary = CCArray::create();
        
        ary->addObject(scale);
        ary->addObject(delay);
        if (flag) {
            SEL_CallFuncN func = callfuncN_selector(PageTurn2::onFlipAnimFinished);
            ary->addObject(CCCallFuncN::create(this, func));
        }
        CCSequence* action = CCSequence::create(ary);
        m_pShowPokerCard->runAction(action);
        
    
        

        String imgName = GetCardFace(mPickAry[mCurIndex].mGrp, mPickAry[mCurIndex].mNum);
        CCNode* node = (CCNode*)getChildByTag(mCurIndex);
        if (node) {
            node->removeFromParentAndCleanup(true);
            CCSprite* sprite = NtfCreateSprite(imgName.c_str());
            sprite->setPosition(ccp(pos[mCurIndex].fx,pos[mCurIndex].fy));
            this->addChild(sprite,1,mCurIndex);
        }
        
        mCurIndex++;
        g_stage->mFlipProgress[mTableId] = mCurIndex;
    }
}

//--------------------------------------------------------------------------------
bool PageTurn2::OnTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    ccTouchBegan(pTouch, pEvent);

    TouchLyr::iterator it = mTouchLyr.begin();
    while(it != mTouchLyr.end())
    {
        CRayLayer* vLyr = *it;
        if(vLyr->OnTouchBegan(pTouch, pEvent))
        {
            mCurLyr = vLyr;
            break;
        }
        ++it;
    }
    return true;
}

//--------------------------------------------------------------------------------
bool PageTurn2::OnTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
    ccTouchMoved(pTouch, pEvent);
    if (mCurLyr)
    {
        mCurLyr->OnTouchMoved(pTouch, pEvent);
    }
    return true;
}

//--------------------------------------------------------------------------------
bool PageTurn2::OnTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
    ccTouchEnded(pTouch, pEvent);
    if (mCurLyr)
    {
        mCurLyr->OnTouchEnded(pTouch, pEvent);
    }
    mCurLyr = NULL;
    return true;
    
}

 

 

 

    float deltaAy = (tt * tt *500);

    float ay = -100 - deltaAy;

    

    float deltaTheta = - (float)M_PI_2 *sqrtf( time) ;

    float theta =/*0.01f */ + (float)M_PI_2 +deltaTheta;

    

    float sinTheta =sinf(theta);

    float cosTheta =cosf(theta);

    

    for (int i =0; i <=m_sGridSize.width; ++i)

    {

        for (int j =0; j <=m_sGridSize.height; ++j)

        {

           // Get original vertex

            ccVertex3F p = originalVertex(ccp(i ,j));

            

            float R = sqrtf((p.x * p.x) + ((p.y - ay) * (p.y - ay)));

            float r = R * sinTheta;

            float alpha = asinf( p.x / R );

            float beta = alpha / sinTheta;

            float cosBeta = cosf( beta );

            

           // If beta > PI then we've wrapped around the cone

           // Reduce the radius to stop these points interfering with others

            if (beta <= M_PI)

            {

                p.x = ( r *sinf(beta));

            }

            else

            {

               // Force X = 0 to stop wrapped

                // points

                p.x =0;

            }

 

            p.y = ( R + ay - ( r * (1 - cosBeta) * sinTheta));

 

           // We scale z here to avoid the animation being

           // too much bigger than the screen due to perspective transform

            p.z = (r * (1 - cosBeta ) * cosTheta) /7;// "100" didn't work for

 

           //    Stop z coord from dropping beneath underlying page in a transition

           // issue #751

            if( p.z < 0.5f )

            {

                p.z =0.5f;

            }

            

           // Set new coords

            setVertex(ccp(i, j), p);

            

        }

    }

}

刚开始看这个,完全不知所云,一堆三角函数,抓狂,简直了,后来找了好久,找到一篇论文

正好把源码解释得一清二楚,论文的链接为:http://www.parc.com/content/attachments/turning-pages-3D.pdf

 

 

 

看完之后才明白,原来是建立了一个数学模型,通过数学模型去计算每个顶点在变换过程中的位置,明白了。到现在才理解大学时老师说的那句话,数学对编程来说很重要。

 

回到主题,我们要实现的是类似翻书的效果,通过上面的算法,得到的效果和我的需求有点差异,既然他是想象成一个锥体的运到,我们可以想象成一个圆柱体的运到,通过改变圆柱体轴心的位置,来实现翻动的效果,不多说了,直接上源码:

 

voidPageTurn::calculateHorizontalVertexPoints(float offsetX)

{

    float theta = (GLfloat)(M_PI /6.0f);

    float R =50;

    float b = (m_pBgSprite->getContentSize().width - offsetX *1.4f) * sinf(theta);

    

    

    

    for (int i =0; i <=m_sGridSize.width; ++i)

    {

        for (int j =0; j <=m_sGridSize.height; ++j)

        {

           // Get original vertex

           ccVertex3F p =originalVertex(ccp(i ,j),m_pForeSprite);

            

            float x = (p.y + b) / tanf(theta);

            

            float pivotX = x + (p.x - x) * cosf(theta) * cosf(theta);

            float pivotY = pivotX * tanf(theta) - b;

            

            float l = (p.x - pivotX) / sinf(theta);

            float alpha = l / R;

            if (l >= 0) {

                if (alpha > M_PI) {

                    p.x = (GLfloat)(mHOffsetX + pivotX - R * (alpha -M_PI) * sinf(theta));

                    p.y = (GLfloat)(mHOffsetY + pivotY + R * (alpha -M_PI) * cosf(theta));

                    p.z = (GLfloat)(2 * R /9);

                }

                else if (alpha <= M_PI)

                {

                    p.x = (GLfloat)(mHOffsetX + pivotX + R *sinf(alpha) *sinf(theta));

                    p.y = (GLfloat)(mHOffsetY + pivotY - R *sinf(alpha) *cosf(theta));

                    p.z = (GLfloat)((R - R *cosf(alpha))/9);

                }

            }

            else

            {

                p.x +=mHOffsetX;

                p.y +=mHOffsetY;

            }

            

           // Set new coords

            setVertex(ccp(i, j), p,m_pForeSprite);

            

            

        }

    }

    

    for (int i =0; i <=m_sGridSize.width; ++i)

    {

        for (int j =0; j <=m_sGridSize.height; ++j)

        {

           // Get original vertex

           ccVertex3F p =originalVertex(ccp(i ,j),m_pBgSprite);

            float x = (p.y + b) / tanf(theta);

            

            float pivotX = x + (p.x - x) * cosf(theta) * cosf(theta);

            float pivotY = pivotX * tanf(theta) - b;

            

            float l = (p.x - pivotX) / sinf(theta);

            float alpha = l / R;

            if (l >= 0) {

                if (alpha > M_PI) {

                    p.x = (GLfloat)(mHOffsetX + pivotX - R * (alpha -M_PI) * sinf(theta));

                    p.y = (GLfloat)(mHOffsetY + pivotY + R * (alpha -M_PI) * cosf(theta));

                    p.z = (GLfloat)(2 * R /9);

                }

                else if (alpha <= M_PI)

                {

                    p.x = (GLfloat)(mHOffsetX + pivotX + R *sinf(alpha) *sinf(theta));

                    p.y = (GLfloat)(mHOffsetY + pivotY - R *sinf(alpha) *cosf(theta));

                    p.z = (GLfloat)((R - R *cosf(alpha))/9);

                }

            }

            else

            {

                p.x +=mHOffsetX;

                p.y +=mHOffsetY;

            }

            

            setVertex(ccp(i, j), p,m_pBgSprite);

            

            

            

        }

    }

    

    //    float R2 = 50;

    //    float offsetX2 = mTouchBegin.x - pTouch->getLocation().x;

    //    float pivotX2 = m_pForeSpriteVertical->getContentSize().height - offsetX2;

    //

    //

    //    for (int i = 0; i <= m_sGridSize.width; ++i)

    //    {

    //        for (int j = 0; j <= m_sGridSize.height; ++j)

    //        {

    //            // Get original vertex

    //            ccVertex3F p = originalVertex(ccp(i ,j),m_pForeSpriteVertical);

    //            float l = p.x - pivotX2;

    //            float alpha = l / R2;

    //            if (l >= 0) {

    //                if (alpha > M_PI) {

    //                    p.x = mVOffsetX + pivotX2 - R2 * (alpha - M_PI);

    //                    p.z = 2 * R2 / 9;

    //                    p.y = p.y + mVOffsetY;

    //                }

    //                else if (alpha <= M_PI)

    //                {

    //                    p.x = mVOffsetX + pivotX2 + R2 * sinf(alpha);

    //                    p.z = (R2 - R2 * cosf(alpha))/9;

    //                    p.y = p.y + mVOffsetY;

    //                }

    //            }

    //            else

    //            {

    //                p.x = p.x + mVOffsetX;

    //                p.y = p.y + mVOffsetY;

    //            }

    //

    //

    //            // Set new coords

    //            setVertex(ccp(i, j), p,m_pForeSpriteVertical);

    //

    //

    //        }

    //    }

    //

    //    for (int i = 0; i <= m_sGridSize.width; ++i)

    //    {

    //        for (int j = 0; j <= m_sGridSize.height; ++j)

    //        {

    //            // Get original vertex

    //            ccVertex3F p = originalVertex(ccp(i ,j),m_pBgSpriteVertical);

    //            float l = p.x - pivotX2;

    //            float alpha = l / R2;

    //            if (l >= 0) {

    //                if (alpha > M_PI) {

    //                    p.x = mVOffsetX + pivotX2 - R2 * (alpha - M_PI);

    //                    p.z = 2 * R2 / 9;

    //                    p.y = p.y + mVOffsetY;

    //                }

    //                else if (alpha <= M_PI)

    //                {

    //                    p.x = mVOffsetX + pivotX2 + R2 * sinf(alpha);

    //                    p.z = (R2 - R2 * cosf(alpha))/9;

    //                    p.y = p.y + mVOffsetY;

    //                }

    //            }

    //            else

    //            {

    //                p.x = p.x + mVOffsetX;

    //                p.y = p.y + mVOffsetY;

    //            }

    //

    //            // Set new coords

    //            setVertex(ccp(i, j), p,m_pBgSpriteVertical);

    //            

    //            

    //            

    //        }

    //    }

}

3d节点的渲染我用的是CCGridBase的子类CCGrid3D,只需要把CCGrid3DAction中渲染的部分摘出来即可,代码在cocos中都有(补充下,我用的是cocos2dx2.2.6),以下是最终效果:

 

 

 

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值