由于镜面反射涉及到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