Rpg游戏中常用到的角色摇杆控制Cocos2d-x实现

Rpg游戏中常用到的角色摇杆控制Cocos2d-x实现


 头文件

#ifndef RockerPro_HRocker_h
#define RockerPro_HRocker_h

#ifndef HRocker_H
#define HRocker_H
#include "cocos2d.h"

using namespace cocos2d;

class HRocker : public CCLayer {

public :
	/* 使用方法
	*    第一个参数aPoint:摇杆中心点的坐标
	*    第二个参数aRadius: 摇杆的半径
	*    第三个参数:aJsSprite :摇杆的图片资源精灵
	*    第四个参数:aJsBg: 摇杆背景图片资源精灵
	*    第五个参数:isFollowRole:是否让摇杆永远跟随用户触屏点
	*/
	//初始化 aPoint是摇杆中心 aRadius是摇杆半径 aJsSprite是摇杆控制点 aJsBg是摇杆背景 isFollowRole是否让摇杆永远跟随用户触屏点
	static HRocker*  HRockerWithCenter(CCPoint aPoint, float aRadius, CCSprite* aJsSprite, CCSprite* aJsBg, bool _isFollowRole);

	//启动摇杆
	void Active();

	//解除摇杆
	void Inactive();

private:
	/* 初始化方法
	*    第一个参数aPoint:摇杆中心点的坐标
	*    第二个参数aRadius: 摇杆的半径
	*    第三个参数:aJsSprite :摇杆的图片资源精灵
	*    第四个参数:aJsBg: 摇杆背景图片资源精灵
	*    第五个参数:isFollowRole:是否让摇杆永远跟随用户触屏点
	*/
	//初始化 aPoint是摇杆中心 aRadius是摇杆半径 aJsSprite是摇杆控制点 aJsBg是摇杆背景 isFollowRole是否让摇杆永远跟随用户触屏点
	HRocker * initWithCenter(CCPoint aPoint, float aRadius, CCSprite* aJsSprite, CCSprite* aJsBg, bool _isFollowRole);

	CCPoint centerPoint;//摇杆中心

	CCPoint currentPoint;//摇杆当前位置

	bool active;//是否激活摇杆

	float radius;//摇杆半径

	CCSprite *jsSprite;

	bool isFollowRole;//是否跟随用户点击

	CCPoint getDirection();

	float getVelocity();

	void  updatePos(float dt);

	virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
	virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
	virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
	CREATE_FUNC(HRocker);
};
#endif

#endif

源文件

#include "HRocker.h"

void HRocker::updatePos(float dt){
    jsSprite->setPosition(
            ccpAdd(
                jsSprite->getPosition(), 
                ccpMult(
                        ccpSub(currentPoint, jsSprite->getPosition()), 0.5
                    )
            )
        );
}

//启动摇杆
void HRocker::Active()
{
    if (!active) {
        active = true;
        schedule(schedule_selector(HRocker::updatePos));//添加刷新函数
		CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);//添加触摸委托
    }else {
        //
    }
}

//解除摇杆
void   HRocker::Inactive()
{
    if (active) {
        active = false;
        this->unschedule(schedule_selector(HRocker::updatePos));//删除刷新
       	CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);//删除委托
    }else {
        //
    }
}

//摇杆方位
CCPoint HRocker::getDirection()
{
    return ccpNormalize(ccpSub(centerPoint, currentPoint));
}

//摇杆力度
float HRocker::getVelocity()
{
    return ccpDistance(centerPoint, currentPoint);
}


/* 使用方法
 *    第一个参数aPoint:摇杆中心点的坐标
 *    第二个参数aRadius: 摇杆的半径
 *    第三个参数:aJsSprite :摇杆的图片资源精灵
 *    第四个参数:aJsBg: 摇杆背景图片资源精灵
 *    第五个参数:isFollowRole:是否让摇杆永远跟随用户触屏点(Himi新添加的功能)
 */
HRocker* HRocker:: HRockerWithCenter(CCPoint aPoint, float aRadius, CCSprite* aJsSprite, CCSprite* aJsBg, bool _isFollowRole)
{
    HRocker *jstick = HRocker::create();
    jstick->initWithCenter(aPoint, aRadius, aJsSprite, aJsBg, _isFollowRole);
    return jstick;
}

bool HRocker::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
    if (!active)
    {
        return false;
    }
    this->setVisible(true);
    CCPoint touchPoint = touch->getLocationInView();
    touchPoint = CCDirector:: sharedDirector()->convertToGL(touchPoint);
    if(!isFollowRole){
        if (ccpDistance(touchPoint, centerPoint) > radius){
            return false;
        }
    }
    currentPoint = touchPoint;
    if(isFollowRole){
        centerPoint = currentPoint;
        jsSprite->setPosition(currentPoint);
        this->getChildByTag(88)->setPosition(currentPoint);
    }
    return true;
}

void  HRocker::ccTouchMoved(CCTouch* touch, CCEvent* event)
{
    CCPoint touchPoint = touch->getLocationInView();
    touchPoint = CCDirector:: sharedDirector()->convertToGL(touchPoint);
    if (ccpDistance(touchPoint, centerPoint) > radius)
    {
        currentPoint = ccpAdd(centerPoint, ccpMult(ccpNormalize(ccpSub(touchPoint, centerPoint)), radius));
    }else {
        currentPoint = touchPoint;
    }
}
void  HRocker::ccTouchEnded(CCTouch* touch, CCEvent* event)
{
    currentPoint = centerPoint;
    if(isFollowRole){
        this->setVisible(false);
    }
}


/* 初始化方法
 *    第一个参数aPoint:摇杆中心点的坐标
 *    第二个参数aRadius: 摇杆的半径
 *    第三个参数:aJsSprite :摇杆的图片资源精灵
 *    第四个参数:aJsBg: 摇杆背景图片资源精灵
 *    第五个参数:isFollowRole:是否让摇杆永远跟随用户触屏点(Himi新添加的功能)
 */
HRocker* HRocker::initWithCenter(CCPoint aPoint, float aRadius, CCSprite* aJsSprite, CCSprite* aJsBg, bool _isFollowRole)
{
    isFollowRole =_isFollowRole;
    active = false;
    radius = aRadius;
    if(!_isFollowRole){
        centerPoint = aPoint;
    }else{
        centerPoint = ccp(0,0);
    }

    currentPoint = centerPoint;
    jsSprite = aJsSprite;
    jsSprite->setPosition(centerPoint);
    aJsBg->setPosition(centerPoint);
    aJsBg->setTag(88);
    this->addChild(aJsBg);
    this->addChild(jsSprite);
    if(isFollowRole){
        this->setVisible(false);
    }
    this->Active();//激活摇杆
    return this;
}

 调用

	CCSprite *spRocker = CCSprite::create("button-pressed.png");//摇杆
	CCSprite *spRockerBG = CCSprite::create("button-activated.png");//摇杆背景
	HRocker *rocker = HRocker::HRockerWithCenter(ccp(150.0f, 130.0f), 50.0f, spRocker, spRockerBG, false);//创建摇杆
	this->addChild(rocker);//摇杆添加到layer中