- </pre><pre name="code" class="cpp">用于环形滑动,选择英雄
- <img src="http://img.blog.csdn.net/20141008203419127?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHl6MTQ1MTc4NDE0NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
- </pre><pre name="code" class="cpp">//MyRoleScrollView.h
-
- #pragma once
-
- #include "cocos2d.h"
- USING_NS_CC;
-
- class nodeAndPt:public CCObject
- {
- public:
- nodeAndPt(CCNode *node,int ptindex)
- {
- this->node = node;
- this->ptIndex = ptindex;
- }
- ~nodeAndPt()
- {
- }
- int ptIndex;
- CCNode *node;
- };
-
- class MyRoleScrollView:public CCNode,public CCTouchDelegate
- {
- public:
- MyRoleScrollView():maxNum(6),isTouchDown(false),isMoveTimeOut(true)
- {}
- ~MyRoleScrollView()
- {
-
- }
- static MyRoleScrollView * create(CCArray * nodeArr = NULL,int cgm = 60,int radius = 200);
- void addRole(CCNode * node);
-
- private:
- bool init(CCArray * nodeArr,int cgm,int radius);
- void initData(CCArray * nodeArr,int radius);
- void initView();
-
- 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);
- virtual void ccTouchCancelled(CCTouch *pTouch,CCEvent *pEvent);
-
- void setPt(nodeAndPt * p,int i);
-
- void refreshPt();
-
- void updateOnce(float t);
- private:
- CC_SYNTHESIZE(CCNode *,_currentNode,CurrentNode);
- const int maxNum;
- int roleNum;
-
- CCArray * _nodeArr;
-
- bool isTouchDown;
-
- CCPoint beginPt;
-
- void blackSprite(CCNode* sprite);
- void recoverFromBalck(CCNode* sprite);
-
- std::vector<CCPoint> ptVec;
-
- int cgm;//椭圆的倾斜角度
- int radius;//半径
-
- bool isMoveTimeOut;//一次滑动结束,才能开启下一次滑动
- };
- </pre><pre name="code" class="cpp"><pre name="code" class="cpp">两个类,<span style="font-family: Arial,Helvetica,sans-serif;">nodeAndPt 绑定每个节点和坐标。</span>
- <span style="font-family: Arial,sans-serif;"></span><pre name="code" class="cpp">MyRoleScrollView负责滑动
- create函数有三个参数,第一个是数组,每一个都是节点,可以是精灵或者panel,可以包含子节点。
- 第二参数和第三参数分别是圆的半径和圆的倾斜度数
- </pre><pre name="code" class="cpp">接下来,大家自己看cpp文件吧。
- </pre><pre name="code" class="cpp">
- </pre><pre name="code" class="cpp">
- //MyRoleScrollView.cpp
-
- #include "MyRoleScrollView.h"
-
- #define SHADE_TAG 1234
- #define induration 0.2f
- #define _scale 0.6f
-
- #define PIE 3.141592653
-
-
-
-
- MyRoleScrollView * MyRoleScrollView::create(CCArray * nodeArr,int radius)
- {
- MyRoleScrollView * node = new MyRoleScrollView;
- if(node&&node->init(nodeArr,cgm,radius))
- {
- node->autorelease();
- }
- else
- delete node;
-
- return node;
- }
- void MyRoleScrollView::addRole(CCNode * node)
- {
- if(!node)
- return;
-
- if(_nodeArr->count()<this->maxNum)
- {
- nodeAndPt * p = new nodeAndPt(node,roleNum);
- _nodeArr->addObject(p);
- roleNum++;
- }
-
- refreshPt();
- }
-
- bool MyRoleScrollView::init(CCArray * nodeArr,int radius)
- {
- if(!CCNode::init())
- return false;
- initData(nodeArr,radius);
- initView();
- return true;
- }
-
- void MyRoleScrollView::initData(CCArray * nodeArr,int radius)
- {
- if(!nodeArr||nodeArr->count()<1)
- return;
-
- this->cgm = cgm;
- this->radius = radius;
-
- _nodeArr = CCArray::create();
- _nodeArr->retain();
-
- for(int i = 0;i<nodeArr->count();i++)
- {
- CCNode * node = dynamic_cast<CCNode*>(nodeArr->objectAtIndex(i));
- nodeAndPt * p = new nodeAndPt(node,i);
- _nodeArr->addObject(p);
- if(i==0)
- {
- _currentNode = node;
- }
- }
- roleNum = _nodeArr->count();
-
- refreshPt();
- }
-
- void MyRoleScrollView::initView()
- {
- CCPoint pt = this->getPosition();
-
-
- for(int i = 0;i<roleNum;i++)
- {
- nodeAndPt * p = dynamic_cast<nodeAndPt*>(_nodeArr->objectAtIndex(i));
- CCNode *node = p->node;
-
- if(i==0)
- {
- _currentNode = p->node;
- //
- this->recoverFromBalck(dynamic_cast<CCSprite*>(node));
- p->node->setScale(1.0f);
- }
- else
- {
- //
- this->blackSprite(dynamic_cast<CCSprite*>(node));
- p->node->setScale(_scale);
- }
-
- node->setPosition(ptVec[p->ptIndex]);
-
- this->addChild(node,i);
- }
-
- schedule(schedule_selector(MyRoleScrollView::updateOnce),0.8f);
- }
-
- void MyRoleScrollView::onEnter()
- {
- CCNode::onEnter();
- CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-1,true);
- }
-
- void MyRoleScrollView::onExit()
- {
- CCNode::onExit();
- CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
- }
-
- bool MyRoleScrollView::ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent)
- {
- if(roleNum<2)
- return false;
-
- CCNode * node= _currentNode;
-
- CCPoint pt = node->convertToNodeSpace(pTouch->getLocation());
-
- CCRect rect(-node->getContentSize().width,node->getContentSize().width*3,node->getContentSize().height);
- if(rect.containsPoint(pt))
- {
- isTouchDown = true;
- beginPt = pTouch->getLocation();
- }
- return true;
- }
- void MyRoleScrollView::ccTouchMoved(CCTouch *pTouch,CCEvent *pEvent)
- {
- if(!isTouchDown||!isMoveTimeOut)
- return;
-
- CCPoint pt = pTouch->getLocation();
-
- int moveX = pt.x-beginPt.x;
- if(moveX>50)//向右滑
- {
- isTouchDown = false;
- for(int i = 0;i<roleNum;i++)
- {
- nodeAndPt * p = dynamic_cast<nodeAndPt*>(_nodeArr->objectAtIndex(i));
- setPt(p,p->ptIndex+1);
-
- }
- isMoveTimeOut = false;
- scheduleOnce(schedule_selector(MyRoleScrollView::updateOnce),induration);
- }
- else if(moveX<-50)//向左划
- {
- isTouchDown = false;
- for(int i = 0;i<roleNum;i++)
- {
- nodeAndPt * p = dynamic_cast<nodeAndPt*>(_nodeArr->objectAtIndex(i));
- setPt(p,p->ptIndex-1);
- }
- isMoveTimeOut = false;
- scheduleOnce(schedule_selector(MyRoleScrollView::updateOnce),induration);
- }
- }
- void MyRoleScrollView::ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent)
- {
- isTouchDown = false;
- }
- void MyRoleScrollView::ccTouchCancelled(CCTouch *pTouch,CCEvent *pEvent)
- {
-
- }
-
- void MyRoleScrollView::refreshPt()
- {
- ptVec.clear();
- int angle = 360/roleNum;
- for(int i = 0,j = -90.0f;i<roleNum;i++)
- {
- double hudu = j*PIE/180;
- float g_sin = sin(hudu);
- float g_cos = cos(hudu);
- int x = MyRoleScrollView::radius*g_cos;
- int y = MyRoleScrollView::radius*g_sin*cos(cgm*PIE/180);
-
- ptVec.push_back(CCPoint(x,y));
-
- j+=angle;
- }
- }
-
- void MyRoleScrollView::setPt(nodeAndPt * p,int i)
- {
- if(i == -1)
- i = roleNum-1;
- else if(i == roleNum)
- i = 0;
-
-
- ccBezierConfig tr0;
-
- float a = p->node->getPosition().x;
- float b = p->node->getPosition().y;
- float c = ptVec[i].x;
- float d = ptVec[i].y;
-
- float m = (a+c)/4;
- float n = (b+d)/4;
-
- CCPoint pt1 = ccpAdd(p->node->getPosition(),ccp(m,n));
- CCPoint pt2 = ccpAdd(ptVec[i],n));
-
- tr0.endPosition=ptVec[i];
- tr0.controlPoint_1=pt1;
- tr0.controlPoint_2=pt2;
-
-
- if(i==0)
- {
- _currentNode = p->node;
- this->recoverFromBalck(dynamic_cast<CCSprite*>(p->node));
- }
- else
- {
- this->blackSprite(dynamic_cast<CCSprite*>(p->node));
- }
- CCActionInterval* bezierForward = CCBezierTo::create(induration,tr0);
-
-
-
- CCSpawn * sp=NULL;
-
-
- if(i==0)
- sp = CCSpawn::create(CCScaleTo::create(induration,1),bezierForward,NULL);
- else
- sp = CCSpawn::create(CCScaleTo::create(induration,_scale),NULL);
-
- p->node->runAction(sp);
- p->ptIndex = i;
- }
-
- void MyRoleScrollView::blackSprite(CCNode* sprite)
- {
- //unsigned int width = sprite->getTexture()->getPixelsWide();
- //unsigned int height = sprite->getTexture()->getPixelsHigh();
-
- if(sprite->getChildByTag(SHADE_TAG)!=NULL)
- return;
-
- CCPoint position = sprite->getPosition();
-
- unsigned int width = sprite->getContentSize().width;
- unsigned int height = sprite->getContentSize().height;
-
- CCRenderTexture* r = CCRenderTexture::create(width,height);
- r->beginWithClear(1,1,0);
- sprite->setPosition(ccp(width / 2.0,height/ 2.0)); // Node: set position here!
- sprite->visit();
- r->end();
-
- // create a new CCImage
- CCImage* image = r->newCCImage();
-
- width = image->getWidth();
- height= image->getHeight();
-
- // this data is the texture data in memery
- unsigned char* data = image->getData();
-
- typedef enum {
- RED = 0,GREEN = 1,BLUE = 2,ALPHA = 3
- } PIXELS;
-
- // convert unsigned char*(1 Byte) to uint_32_t(4 Bytes)
- uint32_t *pixels = (uint32_t *)data;
-
- for(int y = 0; y < height; y++) {
- for(int x = 0; x < width; x++) {
- uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x];
- uint32_t gray = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE];
- //uint32_t gray = 0.3 * rgbaPixel[RED] + 0.3 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE];
-
- // set the pixels to gray
- rgbaPixel[RED] = gray;
- rgbaPixel[GREEN] = gray;
- rgbaPixel[BLUE] = gray;
- }
- }
-
- // create a new CCTexture2D based on the CCImage data modified above
- CCTexture2D* texture = new CCTexture2D();
- texture->initWithImage(image);
-
- CCSprite * s = CCSprite::create();
- s->initWithTexture(texture);
-
- // release other resources
- r->release();
- image->release();
-
- CCArray * arrChild = sprite->getChildren();
- CCObject *obj;
- CCARRAY_FOREACH(arrChild,obj)
- {
- CCNode * node = dynamic_cast<CCNode*>(obj);
- node->setVisible(false);
- }
-
- s->setAnchorPoint(ccp(0,0));
- s->setPosition(ccp(0,0));
- s->setOpacity(200);
- s->setTag(SHADE_TAG);
- sprite->addChild(s);
-
- sprite->setPosition(position);
- }
-
- void MyRoleScrollView::recoverFromBalck(CCNode* sprite)
- {
- if(sprite->getChildByTag(SHADE_TAG)==NULL)
- return;
-
- sprite->removeChildByTag(SHADE_TAG);
-
- CCArray * arrChild = sprite->getChildren();
- CCObject *obj;
- CCARRAY_FOREACH(arrChild,obj)
- {
- CCNode * node = dynamic_cast<CCNode*>(obj);
- node->setVisible(true);
- }
- }
-
- void MyRoleScrollView::updateOnce(float t)
- {
- isMoveTimeOut = true;
- for(int i = 0;i<roleNum;i++)
- {
- nodeAndPt * p = dynamic_cast<nodeAndPt*>(_nodeArr->objectAtIndex(i));
- setPt(p,p->ptIndex+1);
-
- }
- isMoveTimeOut = false;
- }