cocos2dx學習記錄---簡單搖桿實現
效果圖:
#ifndef _Rocker_H_
#define _Rocker_H_
#include "cocos2d.h"
USING_NS_CC;
//搖桿類
class Rocker : public Node
{
public:
static Rocker* create(std::string bgName,float bgRadius,std::string rokerNmae,float rockerRadius);//靜態創建搖桿實例
bool init(std::string bgName,float bgRadius,std::string rokerNmae,float rockerRadius);//初始化方法
bool onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
void onTouchMoved(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
void onTouchEnded(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
void onTouchCancelled(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
void addMoveListener(Node *ref);//添加控制節點
void callHandleEvent(float interval);//搖桿控制回調事件
private:
Sprite* spriteBg,*spriteRocker;//背景精靈,搖桿控制精靈
float radiusBg,radiusRocker;//背景半徑,搖桿半徑
Rocker* mRocker;//搖桿實例
Node *control;//需要控制的節點
Point touchStart , tuchMove;//開始觸控的座標點,移動時的座標點
bool isMove;//標記是否正在操作搖桿
};
#endif // !_Rocker_H_
#include "Rocker.h"
#include "math.h"
/* @param 背景紋理,背景半徑,搖桿紋理,搖桿半徑 */
Rocker* Rocker::create(std::string bgName,float bgRadius,std::string rokerNmae,float rockerRadius){
Rocker *rocker = new Rocker();
if(rocker && rocker->init(bgName,bgRadius,rokerNmae,rockerRadius)){
rocker -> autorelease();
return rocker;
}
CC_SAFE_DELETE(rocker);
return nullptr;
}
bool Rocker::init(std::string bgName,float bgRadius,std::string rokerNmae,float rockerRadius){
radiusBg = bgRadius;
radiusRocker = rockerRadius;
//實例化背景精靈
this -> spriteBg = Sprite::create(bgName);
if(!this -> spriteBg)
return false;
float scale = bgRadius * 2 / this -> spriteBg -> getContentSize().width;//按比例縮放到設置大小
this -> spriteBg -> setScale(scale);
this -> addChild(this -> spriteBg);
//實例化搖桿精靈
this -> spriteRocker = Sprite::create(rokerNmae);
if(!this -> spriteRocker)
return false;
scale = rockerRadius *2 / (this -> spriteRocker -> getContentSize()).width;//按比例縮放到設置大小
this -> spriteRocker -> setScale(scale);
this -> addChild(this -> spriteRocker);
//創建觸摸監聽事件
auto listener = EventListenerTouchOneByOne::create();
listener -> onTouchBegan = CC_CALLBACK_2(Rocker::onTouchBegan,this);
listener -> onTouchMoved = CC_CALLBACK_2(Rocker::onTouchMoved,this);
listener -> onTouchEnded = CC_CALLBACK_2(Rocker::onTouchEnded,this);
listener -> onTouchCancelled = CC_CALLBACK_2(Rocker::onTouchCancelled,this);
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener,this);
this->schedule(schedule_selector(Rocker::callHandleEvent));//開始定時回調
return true;
}
bool Rocker::onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent){
Point point = this->convertTouchToNodeSpaceAR(pTouch);
if(point.x * point.x + point.y * point.y < radiusRocker * radiusRocker){//判斷觸摸點是否在搖桿上
touchStart = point;
isMove = true;//標記開始控制搖桿
return true;
}else{
return false;
}
}
void Rocker::onTouchMoved(cocos2d::Touch *pTouch, cocos2d::Event *pEvent){
Point point = this->convertTouchToNodeSpaceAR(pTouch);
if(point.x * point.x + point.y * point.y < radiusBg * radiusBg){//限制搖桿不能超出背景半徑
spriteRocker -> setPosition(point);
tuchMove = point;
}else{
/* float x = radiusBg * sin(atan(point.y / point.x));
float y = radiusBg * cos(atan(point.y / point.x));*/
point.normalize();
point = point * radiusBg;
tuchMove = point;
spriteRocker -> setPosition(point);
}
}
void Rocker::onTouchEnded(cocos2d::Touch *pTouch, cocos2d::Event *pEvent){
spriteRocker -> setPosition(Point(0,0));//將搖桿設置爲起始位置
isMove = false;
}
void Rocker::onTouchCancelled(cocos2d::Touch *pTouch, cocos2d::Event *pEvent){
spriteRocker -> setPosition(Point(0,0));//將搖桿設置爲起始位置
isMove = false;
}
void Rocker::addMoveListener(Node *ref){
control = ref;
}
void Rocker::callHandleEvent(float interval){
if(control && isMove){//擁有控制節點並且可以操作搖桿
Point refPoint = control -> getPosition();
control -> setPosition(refPoint.x + tuchMove.x / 10,tuchMove.y / 10 + refPoint.y);
}
}