摇杆程序

#ifndef HROCKER_H
#define HROCKER_H

#include "cocos2d.h"

using namespace cocos2d;

//用于标识摇杆与摇杆的背景
typedef enum{
    tag_rocker,
    tag_rockerBG,
}tagForHRocker;


class HRocker:public CCLayer
{
public:
    HRocker(void);
    ~HRocker(void);
    
    //创建摇杆(摇杆的操作题图片资源名,摇杆背景图片资源名,起始坐标)
    static HRocker* createHRocker(const char *rockerImageName,const char *rockerBGImageName,CCPoint position);
    //启动摇杆(显示摇杆、监听摇杆触屏事件)
    void startRocker(bool _isStopOther);
    //停止摇杆(隐藏摇杆,取消摇杆的触屏监听)
    void stopRocker();
    CREATE_FUNC(HRocker);
private:
    //自定义初始化函数
    void rockerInit(const char* rockerImageName,const char* rockerBGImageName,CCPoint position);
    //是否可操作摇杆
    bool isCanMove;
    //获取当前摇杆与用户触屏点的角度
    float getRad(CCPoint pos1,CCPoint pos2);
    //摇杆背景的坐标
    CCPoint rockerBGPosition;
    //摇杆背景的半径
    float rockerBGR;
    //触屏事件
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

};

#endif
#include "HRocker.h"

HRocker::HRocker(void)
{
}

HRocker::~HRocker(void)
{
}

//创建摇杆(摇杆的操作题图片资源名,摇杆背景图片资源名,起始坐标)
HRocker* HRocker::createHRocker(const char *rockerImageName,const char *rockerBGImageName,CCPoint position)
{
    HRocker *layer = HRocker::create();
    if (layer)
    {
        layer->rockerInit(rockerImageName,rockerBGImageName,position);
        return layer;
    }
    CC_SAFE_DELETE(layer);
    return NULL;
}

//自定义初始化函数
void HRocker::rockerInit(const char* rockerImageName,const char* rockerBGImageName,CCPoint position)
{
    CCSprite *spRockerBG = CCSprite::create(rockerBGImageName);
    spRockerBG->setPosition(position);
    spRockerBG->setVisible(false);
    addChild(spRockerBG,0,tag_rockerBG);

    CCSprite *spRocker = CCSprite::create(rockerImageName);
    spRocker->setPosition(position);
    spRocker->setVisible(false);
    addChild(spRocker,1,tag_rocker);

    rockerBGPosition = position;

    rockerBGR = spRockerBG->getContentSize().width*0.5;
}

//启动摇杆(显示摇杆、监听摇杆触屏事件)
void HRocker::startRocker(bool _isStopOther)
{
    CCSprite *rocker = (CCSprite*)this->getChildByTag(tag_rocker);
    rocker->setVisible(true);

    CCSprite *rockerBG = (CCSprite *)this->getChildByTag(tag_rockerBG);
    rockerBG->setVisible(true);

    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-1,_isStopOther);
}

//停止摇杆(隐藏摇杆,取消摇杆的触屏监听)
void HRocker::stopRocker()
{
    CCSprite *rocker = (CCSprite *)this->getChildByTag(tag_rocker);
    rocker->setVisible(false);

    CCSprite * rockerBG = (CCSprite *)this->getChildByTag(tag_rockerBG);
    rockerBG->setVisible(false);

    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}


//获取当前摇杆与用户触屏点的角度
float HRocker::getRad(CCPoint pos1,CCPoint pos2)
{
    float px1 = pos1.x;
    float py1 = pos1.y;
    float px2 = pos2.x;
    float py2 = pos2.y;

    //得到两点x的距离
    float x = px2 - px1;
    //得到两点y的距离
    float y = py1 - py2;
    //算出斜边长度
    float xie = sqrt(pow(x,2) + pow(y,2));
    //得到这个角度的余弦值(通过三角函数中的店里:角度余弦值=斜边/斜边)
    float cosAngle = x / xie;
    //通过反余弦定理获取到期角度的弧度
    float rad = acos(cosAngle);
    //注意:当触屏的位置Y坐标<摇杆的Y坐标,我们要去反值-0~-180
    if (py2 < py1)
    {
        rad = -rad;
    }
    return rad;
}

CCPoint getAngelePosition(float r,float angle){
    return ccp(r*cos(angle),r*sin(angle));
}

//抬起事件
bool HRocker::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    CCPoint point = pTouch->getLocation();
    CCSprite *rocker = (CCSprite *)this->getChildByTag(tag_rocker);
    if (rocker->boundingBox().containsPoint(point))
    {
        isCanMove = true;
    }
    return true;
}
//移动事件
void HRocker::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
    if (!isCanMove)
    {
        return;
    }
    CCPoint point = pTouch->getLocation();
    CCSprite *rocker = (CCSprite *)this->getChildByTag(tag_rocker);

    //判断两个圆的圆心距是否大于摇杆背景的半径
    if (sqrt(pow((rockerBGPosition.x - point.x),2) + pow((rockerBGPosition.y - point.y),2)) >= rockerBGR)
    {
        //得到摇杆与触屏点所形成的角度
        float angle = getRad(rockerBGPosition,point);
        //保证内部小圆运动的长度限制
        rocker->setPosition(ccpAdd(getAngelePosition(rockerBGR,angle),ccp(rockerBGPosition.x,rockerBGPosition.y)));
    }
    else
    {
        //当没有超过,让摇杆跟随用户触屏点移动即可
        rocker->setPosition(point);
    }
}
//离开事件
void HRocker::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
    if (!isCanMove)
    {
        return;
    }
    CCSprite *rockerBG = (CCSprite*)this->getChildByTag(tag_rockerBG);
    CCSprite *rocker = (CCSprite*)this->getChildByTag(tag_rocker);
    rocker->stopAllActions();
    rocker->runAction(CCMoveTo::create(0.08,rockerBG->getPosition()));
    isCanMove = false;
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        HRocker* rocker = HRocker::createHRocker("rocker.png","rockerBG.png",ccp(240,160));
        addChild(rocker);
        rocker->startRocker(true);

        bRet = true;
    } while (0);

    return bRet;
}

原文地址:https://www.cnblogs.com/newlist/p/3131899.html