cocos2dx 簡易搖桿demo

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章