由于镜面反射涉及到openGL,不会。
h文件:
#ifndef __CoverView_H__ #define __CoverView_H__ #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC; USING_NS_CC_EXT; class CoverView : public CCNode , public CCScrollViewDelegate , public CCTouchDelegate { public: CoverView(); ~CoverView(); /** * * @param scrollView的rect * @param scrollView滚动size * @param card之间的距离 * @param card之间的缩放 */ static CoverView* create(CCRect swBox, CCSize slSize ,float disDistance , float disScale ); virtual bool init(CCRect swBox , CCSize slSize , float disDistance , float disScale); virtual void onEnter(); virtual void onExit(); virtual bool ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent); virtual void ccTouchMoved(CCTouch* pTouch, CCEvent* pEvent); virtual void ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent); void initData(); void scrollViewDidScroll(CCScrollView* view); void scrollViewDidZoom(CCScrollView* view); void adjustCardScale(CCPoint adjustPoint); void adjustScrollView(CCPoint adjustPoint); void adjusetEndScrollView(); void cardViewEnd_callBack(CCNode* pSender); int getCurCardIndex();//当前中间card索引 从0开始 void addCard(CCNode * card); void addCard(CCNode * card, int zOrder); void addCard(CCNode* card, int zOrder, int tag); CC_SYNTHESIZE(CCPoint , swPosition , SwPosition);//scrollView 位置 CC_SYNTHESIZE(CCSize , swSize , SwSize);//scrollView大小 CC_SYNTHESIZE(CCSize , slSize , SlSize);//scrollLayer 大小 CC_SYNTHESIZE(float , disDistance , DisDistance);//card距离间隔 CC_SYNTHESIZE(float , disScale , DisScale);//crad缩放间隔 CC_SYNTHESIZE(CCRect , swBox , SwBox);//scrollview 边框 CC_SYNTHESIZE(CCLayer* , scrollLayer , scrollLayer);//scrollView的containLayer CC_SYNTHESIZE(int , cardNum , CardNum);//card索引 CC_PROPERTY(CCPoint , offsetPosition , OffsetPosition);//card起始位置 private: CCSize wSize; CCArray* cardArray; CCScrollView* scrollView; }; #endif.cpp文件
#include "CoverView.h" CoverView::CoverView() { } CoverView::~CoverView() { CC_SAFE_RELEASE_NULL(cardArray); } CoverView* CoverView::create(CCRect swBox, CCSize slSize , float disDistance , float disScale) { CoverView* cover = new CoverView(); if(cover && cover->init(swBox,slSize,disDistance,disScale)) { cover->autorelease(); return cover; } CC_SAFE_DELETE(cover); return NULL; } bool CoverView::init(CCRect swBox , CCSize slSize , float disDistance , float disScale) { if(!CCNode::init()) return false; this->swBox = swBox; this->swPosition = swBox.origin; this->swSize = swBox.size; this->slSize = slSize; this->disDistance = disDistance; this->disScale = disScale; initData(); return true; } void CoverView::initData() { wSize = CCDirector::sharedDirector()->getWinSize(); cardArray = CCArray::create(); cardArray->retain(); cardNum = 0; offsetPosition = ccp(swSize.width/2,swSize.height/2); scrollLayer = CCLayer::create(); scrollLayer->setAnchorPoint(CCPointZero); scrollLayer->setPosition(CCPointZero); scrollLayer->setContentSize(slSize); scrollView = CCScrollView::create(swSize,scrollLayer); scrollView->setAnchorPoint(CCPointZero); scrollView->setContentOffset(ccp(0,0)); scrollView->setTouchEnabled(false); scrollView->setDelegate(this); scrollView->setDirection(kCCScrollViewDirectionHorizontal); addChild(scrollView,1); } void CoverView::onEnter() { CCNode::onEnter(); CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0 , false); } void CoverView::onExit() { CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this); removeAllChildren(); CCNode::onExit(); } bool CoverView::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent) { return true; } void CoverView::ccTouchMoved(CCTouch* pTouch, CCEvent* pEvent) { CCPoint scroll_prepoint = pTouch->getPreviousLocation(); CCPoint scroll_movepoint = pTouch->getLocation(); if(swBox.containsPoint(scroll_movepoint)) { CCPoint adjustPoint = scroll_movepoint-scroll_prepoint; adjustScrollView(adjustPoint); adjustCardScale(adjustPoint); } } void CoverView::ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent) { CCPoint scroll_prepoint = pTouch->getPreviousLocation(); CCPoint scroll_endpoint = pTouch->getLocation(); float disX = scroll_endpoint.x - scroll_endpoint.x; adjusetEndScrollView(); } void CoverView::adjustCardScale(CCPoint adjustPoint) { float disX = adjustPoint.x; CCObject* obj = NULL; CCARRAY_FOREACH(cardArray,obj) { CCNode* card = (CCNode*) obj; float offset = scrollView->getContentOffset().x; float posX = card->getPositionX() + offset; float disMid = abs(swSize.width/2-posX); float scale = 1- disMid/disDistance*disScale; card->setScale(scale); int zOr = (int) (1000-disMid*0.1); card->setZOrder(zOr); } } void CoverView::adjustScrollView(CCPoint adjustPoint) { CCPoint endPoint = ccpAdd(scrollView->getContentOffset(),ccp(adjustPoint.x,0)); scrollView->unscheduleAllSelectors(); scrollView->setContentOffset(endPoint,false); } void CoverView::adjusetEndScrollView() { CCObject* obj = NULL; float minX = wSize.height; float midX = swSize.width/2; //获取距离中间最小值的card CCARRAY_FOREACH(cardArray,obj) { CCNode* card = (CCNode*) obj; float offset = scrollView->getContentOffset().x; //转化父类坐标 float posX = card->getPositionX() + offset; float disMid = midX-posX; if(abs(disMid) < abs(minX)) minX = disMid; } CCARRAY_FOREACH(cardArray,obj) { CCNode* item = (CCNode*) obj; //转化父类坐标 float offset = scrollView->getContentOffset().x; float posX = item->getPositionX() + offset ; //距离中间长度 float disMid = abs(midX - posX - minX); //目标scale float scale = 1- disMid/disDistance*disScale; CCScaleTo* scaleBy = CCScaleTo::create(0.2f,scale); item->runAction(scaleBy); int zOr = (int) (1000-disMid*0.1); item->setZOrder(zOr); } CCLayer* scrollLayer = (CCLayer*)scrollView->getContainer(); CCMoveBy* moveBy = CCMoveBy::create(0.2f,ccp(minX,0)); //CCCallFuncN* callFuncN = CCCallFuncN::create(this,callfuncN_selector(CoverView::cardViewEnd_callBack)); //CCSequence* seq = CCSequence::create(moveBy,callFuncN,NULL); //scrollLayer->runAction(seq); scrollLayer->runAction(moveBy); } void CoverView::cardViewEnd_callBack(CCNode* pSender) { getCurCardIndex(); } void CoverView::scrollViewDidScroll(CCScrollView* view) { } void CoverView::scrollViewDidZoom(CCScrollView* view) { } void CoverView::addCard(CCNode * card) { int zOrder = 1000 - cardNum; this->addCard(card, zOrder, 0); } void CoverView::addCard(CCNode * card, int zOrder) { this->addCard(card, zOrder,0); } void CoverView::addCard(CCNode* card, int zOrder, int tag) { float positionX = offsetPosition.x + disDistance*cardNum; float scale = 1 - disScale*cardNum; card->setPosition(ccp(positionX,offsetPosition.y)); card->setScale(scale); cardArray->addObject(card); scrollLayer->addChild(card , zOrder,tag); cardNum++; //CCLog("crad%d:[%f , %f]",cardNum,card->getPositionX(),card->getPositionY()); } int CoverView::getCurCardIndex() { float distance1 = - scrollLayer->getPositionX(); float distance2 = swSize.width/2 - offsetPosition.x; //+5 浮点数误差 int index = (distance1 + distance2 + 5) / (disDistance); //CCLog("card index:%d distance1:%f",index,distance1); return index; } void CoverView::setOffsetPosition(CCPoint var) { offsetPosition = var; CCObject* obj = NULL; cardNum = 0; CCARRAY_FOREACH(cardArray,obj) { CCNode* card = (CCNode*) obj; float positionX = offsetPosition.x + disDistance*cardNum; card->setPosition(ccp(positionX,offsetPosition.y)); cardNum++; } adjustCardScale(CCPointZero); } CCPoint CoverView::getOffsetPosition() { return offsetPosition; }
bool HelloWorld::init() { if ( !CCLayer::init() ) { return false; } CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("image/logoLayer.plist"); float winWidth = CCDirector::sharedDirector()->getWinSize().width; float winHeight = CCDirector::sharedDirector()->getWinSize().height; CCRect swRect = CCRectMake(0.01f*winWidth,0.4f*winHeight,0.98f*winWidth,0.33f*winHeight); CCSize slSize = CCSizeMake(2.3f*winWidth,0.33f*winHeight); float disDistance = 0.2f*winWidth; float disScale = 0.25f; CoverView* coverView = CoverView::create(swRect,slSize,disDistance,disScale); CCLog("add card"); for(int i = 0 ; i< 11 ; i++) { CCSprite* player = CCSprite::createWithSpriteFrameName("hero_bg.png"); coverView->addCard(player); } //coverflow1.png默认第一张在coverView的正中间 coverflow2.png改变第一张的位置有卡片初始不一定在最中间 需要手动调整 //coverView->setOffsetPosition(ccp(0.1f*winWidth,swRect.size.height/2)); coverView->setPosition(swRect.origin); addChild(coverView); return true; }
cocos2dx 类似 coverflow效果,布布扣,bubuko.com
原文:http://blog.csdn.net/skillart/article/details/21973799