//============================================================= //============================================================= void CC3DCircleListLayer::initDataCircle(float fEllipseA,float fEllipseB,CCSize itemSize,CCArray* pArray,bool bFlipY) { if(!pArray) return; m_itemSize = itemSize; m_fEllipseA = fEllipseA; m_fEllipseB = fEllipseB; int nAllItemCount = pArray->count(); float fCircleStepDegree = (2*M_PI)/nAllItemCount; float fMoveX = getContentSize().width*0.5; float fMoveY = getContentSize().height*0.5; m_pButtonArray->removeAllObjects(); for(int i=0;i<nAllItemCount;i++) { float fCurDegree = fCircleStepDegree * (i+1); float fCircleX = m_fEllipseA * cosf(fCurDegree); float fCircleY = m_fEllipseB * sinf(fCurDegree); fCircleX += fMoveX; fCircleY += fMoveY; CCSprite* pSprite = (CCSprite*)pArray->objectAtIndex(i); CCScale9Sprite* pScaleSprite = CCScale9Sprite::createWithSpriteFrame(pSprite->displayFrame()); CCButton* pButton = CCButton::create( pScaleSprite); pButton->setTag(i); pButton->setZoomOnTouchDown(false); CCPoint point = ccp(fCircleX,fCircleY); pButton->setPosition(point); CCString* pString = new CCString(); pString->initWithFormat("%f",fCurDegree); pButton->setUserData(pString); pButton->addTargetWithActionForControlEvents(this, cccontrol_selector(CC3DCircleListLayer::clickButton), CCControlEventTouchUpInside); addChild(pButton); m_pButtonArray->addObject(pButton); if(bFlipY) { CCSize buttonSize = pButton->getContentSize(); CCSprite* pFlipYSprite = CCSprite::createWithTexture(pSprite->getTexture()); CCRect oldRect = pSprite->getTextureRect(); pFlipYSprite->setFlipY(true); pFlipYSprite->setOpacity(255*0.5); pFlipYSprite->setAnchorPoint(ccp(0.5,1)); pFlipYSprite->setPosition(ccp(buttonSize.width*0.5,0)); pButton->addChild(pFlipYSprite); } // CCSize buttonSize = pButton->getContentSize(); // char testChr[32]; // sprintf(testChr, "%d",i); // CCLabelTTF* pTestLabel = CCLabelTTF::create(testChr, "Arial", 52); // pTestLabel->setColor(ccRED); // pTestLabel->setPosition(ccp(buttonSize.width*0.5,buttonSize.height*0.5)); // pButton->addChild(pTestLabel); } refreshItemWithMoveDegree(0); }
//============================================================= //============================================================= void CC3DCircleListLayer::refreshItemWithMoveDegree(float fMoveDegree) { float fMoveX = getContentSize().width*0.5; float fMoveY = getContentSize().height*0.5; float fScaleMax = 1; float fScaleMin = 0.5; int zOrderMax = 1000; // float fCameraDegreeMax = 45; // float fCameraDegreeMin = 0; for(int i=0;i<m_pButtonArray->count();i++) { CCButton* pButton = (CCButton*)m_pButtonArray->objectAtIndex(i); CCString* pFOldDegree = (CCString*)pButton->getUserData(); float fOldDegree = pFOldDegree->floatValue(); fOldDegree = fabsf(fOldDegree); float fCurDegree = fOldDegree + fMoveDegree; if(fCurDegree < 0) { fCurDegree = 2*M_PI - fabsf(fCurDegree); } int nCircleCount = (int)fCurDegree/(2*M_PI); fCurDegree = fCurDegree - nCircleCount*(2*M_PI); //============================================================= //============================================================= delete pFOldDegree; CCString* pString = new CCString(); pString->initWithFormat("%f",fabs(fCurDegree)); pButton->setUserData(pString); //============================================================= //============================================================= // // // //============================================================= //============================================================= float fCircleX = m_fEllipseA * cosf(fCurDegree); float fCircleY = m_fEllipseB * sinf(fCurDegree); fCircleX += fMoveX; fCircleY += fMoveY; CCPoint buttonPos = ccp(fCircleX,fCircleY); pButton->setPosition(buttonPos); //============================================================= //============================================================= // // // //============================================================= //============================================================= float fScaleDegree = fCurDegree - M_PI_2; float fScalePercent = (1-cosf(fScaleDegree))/2.0; float fScale = fScaleMin + (fScaleMax - fScaleMin)*fScalePercent; pButton->setScale(fScale); int nOrder = zOrderMax * fScalePercent + 1; pButton->setZOrder(nOrder); //============================================================= //============================================================= m_pSelectedButton = getSelectedButton(); if(m_pSelectedButton) { if(m_pDelegate) { int nIndex = m_pSelectedButton->getTag(); m_pDelegate->onCC3DCircleListLayerSelectIndex(nIndex); } } // //============================================================= // //camera // //============================================================= // int flagMove = 1; // if(buttonPos.x > getContentSize().width*0.5) // { // flagMove = 1; // } // else // { // flagMove = -1; // } // float fCameraDegree = fCameraDegreeMin + (fCameraDegreeMax - fCameraDegreeMin)*(1-fScalePercent); // fCameraDegree *= -flagMove; // float radians = (float)CC_DEGREES_TO_RADIANS(fCameraDegree); // float fSin = sinf(radians) * CCCamera::getZEye(); // CCCamera* pCamera = pButton->getCamera(); // pCamera->setCenterXYZ(fSin, 0, 0); // //============================================================= // //============================================================= } }