本文转之himi的blog
#ifndef HRocker_H
#define HRocker_H
#include "cocos2d.h"
using namespace cocos2d;
class HRocker :public CCLayer
{
public :
//初始化 aPoint是摇杆中心 aRadius是摇杆半径 aJsSprite是摇杆控制点 aJsBg是摇杆背景
static HRocker* HRockerWithCenter(CCPoint aPoint ,float aRadius ,CCSprite* aJsSprite,CCSprite* aJsBg,bool _isFollowRole);
//启动摇杆
void Active();
//解除摇杆
void Inactive();
private:
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
#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);
}
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);
}
}
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("hand_shank.png");
//CCSprite *spRockerBG=CCSprite::create("hand_shank_background.png");
//HRocker *rocker=HRocker::HRockerWithCenter(ccp(210.0f,130.0f),50.0f ,spRocker ,spRockerBG,false);
//this->addChild(rocker);