</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;
}
原文链接:/cocos2dx/347141.html