• 摇杆程序


    #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;
    }

  • 相关阅读:
    hdu1180奇怪的楼梯……bfs迷阵……wa该16二级,我太渣滓
    Android新闻案例clientserver达到,完全自己的新闻节目平台
    xcode代码统计行
    linux每个路由表的系统研究
    Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)
    《网络编程》ioctl 操作
    Android framework召回(3)binder使用和IBinder BpRefbase IInterface INTERFACE 之间的关系
    使用关节型
    leetcode 218: The Skyline Problem
    删除依赖命令
  • 原文地址:https://www.cnblogs.com/newlist/p/3131899.html
Copyright © 2020-2023  润新知