注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

遥杆的使用  

2013-05-25 23:48:56|  分类: ios游戏开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#include "cocos2d.h"

using namespace cocos2d;


//用于标识摇杆与摇杆的背景

typedef enum{

    tag_rocker,

    tag_rockerBG,


}tagForHRocker;


class HRocker:public CCLayer{

    

public:

    //创建摇杆(摇杆的操作体图片资源名,摇杆背景图片资源名,起始坐标)

    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);

    

};


--------------

#include "HRocker.h"


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;

}


//得到半径为r的圆周运动上一个角度应对应的xy坐标

CCPoint getAnglePosition(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(getAnglePosition(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;

}

-----------
调用摇杆类,代码如下:

#include "SimpleAudioEngine.h"

#include "HRocker.h"


using namespace cocos2d;

using namespace CocosDenshion;


CCScene* HelloWorld::scene()

{

    CCScene *scene = CCScene::create();

    HelloWorld *layer = HelloWorld::create();

    scene->addChild(layer);

    return scene;

}


bool HelloWorld::init()

{

    if ( !CCLayer::init() )

    {

        return false;

    }

    CCSize size = CCDirector::sharedDirector()->getWinSize();

    CCLayerColor * colorLayer = CCLayerColor::create(ccc4(200,200,200,200), size.width, size.height);

    addChild(colorLayer);

    

    

    HRocker* rocker = HRocker::createHRocker("rocker.png", "rockerBG.png", ccp(240,160));

    addChild(rocker);

    rocker->startRocker(true);

    

    return true;

}



  评论这张
 
阅读(54)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017