Since mirror reflection involves openGL, no.
H file:
# 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 rolling size * @ param card distance * @ param card scaling */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 compute (CCTouch * pTouch, CCEvent * pEvent); virtual void ccTouchMoved (CCTouch * pTouch, CCEvent * pEvent); virtual void ccTouchEnded (CCTouch * pTouch, CCEvent * pEvent ); void initData (); void Preview (CCScrollView * view); void adjustCardScale (CCPoint adjustPoint); void adjustScrollView (CCPoint adjustPoint); void Preview (); void cardViewEnd_callBack (CCNode * pSender); int getCurCardIndex (); // The current intermediate card index starts from 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 position CC_SYNTHESIZE (CCSize, swSize, SwSize ); // scrollView size CC_SYNTHESIZE (CCSize, slSize, SlSize); // scrollLayer size CC_SYNTHESIZE (float, disDistance, DisDistance); // card distance between CC_SYNTHESIZE (float, disScale, DisScale ); // crad zoom interval CC_SYNTHESIZE (CCRect, swBox, SwBox); // scrollview border CC_SYNTHESIZE (CCLayer *, scrollLayer, scrollLayer); // containLayerCC_SYNTHESIZE (int, cardNum, cardNum); // card index CC_PROPERTY (CCPoint, offsetPosition, OffsetPosition); // card start position private: CCSize wSize; CCArray * cardArray; CCScrollView * scrollView;}; # endif. Cpp File
# 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: shareddire()-> 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: shareddire () -> 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-> getpreviuslocation (); CCPoint cursor = pTouch-> getLocation (); if (swBox. containsPoint (volumes) {CCPoint adjustPoint = scroll_movepoint-scroll_prepoint; adjustScrollView (adjustPoint); adjustCardScale (adjustPoint) ;}} void CoverView: ccTouchEnded (CCTouch * pTouch, CCEvent * pEvent) {CCPoint scroll_prepoint = pTouch-> getpreviuslocation (); CCPoint scroll_endpoint = pTouch-> getLocation (); float disX = scroll_endpoint.x-scroll_endpoint.x; callback ();} 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; // obtain cardCCARRAY_FOREACH (cardArray, obj) {CCNode * card = (CCNode *) obj; float offset = scrollView-> getContentOffset (). x; // convert parent class coordinates float posX = card-> getPositionX () + offset; float disMid = midX-posX; if (abs (disMid) <abs (minX )) minX = disMid;} CCARRAY_FOREACH (cardArray, obj) {CCNode * item = (CCNode *) obj; // convert the parent class coordinate float offset = scrollView-> getContentOffset (). x; float posX = item-> getPositionX () + offset; // float disMid = abs (midX-posX-minX ); // target scalefloat 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: callback (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 floating point number error 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 ;}
Call in HelloWorld:
Bool HelloWorld: init () {if (! CCLayer: init () {return false;} CCSpriteFrameCache: sharedSpriteFrameCache ()-> addSpriteFramesWithFile ("image/logoLayer. plist "); float winWidth = CCDirector: shareddire()-> getWinSize (). width; float winHeight = CCDirector: shareddire()-> 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 by default, the first one in the middle of coverView coverflow2.png changes the position of the first one. Some cards do not need to be manually adjusted at the beginning. // coverView-> setOffsetPosition (ccp (0.1f * winWidth, swRect. size. height/2); coverView-> setPosition (swRect. origin); addChild (coverView); return true ;}