摇杆头文件
#ifndef _ROCKER_H_
#define _ROCKER_H_
#include"cocos2d.h"
class Rocker :public cocos2d::Layer
{
public:
//初始化方法分别为摇杆位置,摇杆背景,摇杆
virtual bool init(const cocos2d::Vec2& ve,const char* rockerbg,const char* rocker);
//create方法分别为摇杆位置,摇杆背景,摇杆
static Rocker* create(const cocos2d::Vec2& ve, const char* rockerbg, const char* rocker);
//摇杆单位化的方法后续可用于控制英雄移动
cocos2d::Vec2 getOffset();
private:
//摇杆半径
cocos2d::Sprite* m_spRockerbg;
//摇杆
cocos2d::Sprite* m_spRocker;
//判断是否点击至中心点
bool isTouch;
};
#endif
摇杆cpp
#include"Rocker.h"
USING_NS_CC;
static Rocker* create(const cocos2d::Vec2& ve, const char* rockerbg, const char* rocker)
{
//创建Rocker的指针变量
Rocker* rockerlayer = new Rocker;
if (rockerlayer&&rockerlayer->init(ve,rockerbg,rocker))
{
//创建成功加入自动回收池
rockerlayer->autorelease();
}
else
{
delete rockerlayer;
rockerlayer = nullptr;
}
//返回Rocker指针
return rockerlayer;
}
bool Rocker::init(const cocos2d::Vec2& ve, const char* rockerbg, const char* rocker)
{
//判断父类的初始化是否成功
if (!Layer::init())
return false;
//给摇杆与背景纹理
m_spRocker = Sprite::create(rocker);
m_spRockerbg = Sprite::create(rockerbg);
//设置二者的显示位置
m_spRocker->setPosition(ve);
m_spRockerbg->setPosition(ve);
this->addChild(m_spRockerbg);
this->addChild(m_spRocker);
//为摇杆创建触摸事件
EventListenerTouchOneByOne*touch = EventListenerTouchOneByOne::create();
//是否吞噬事件
touch->setSwallowTouches(true);
//触摸开始
touch->onTouchBegan = [this](Touch*t,Event*event)
{
//获取触摸点
Vec2 touchpos = t->getLocation();
//获取矩形包围圈
Rect rect = m_spRocker->getBoundingBox();
//判断触摸点是否与摇杆有接触
if (rect.containsPoint(touchpos))
{
//将摇杆触摸状态设置为可触摸
isTouch = true;
return true;
}
return false;
};
//触摸移动
touch->onTouchMoved = [this](Touch*t, Event*event)
{
if(isTouch){
//获取触摸点
Vec2 touchpos = t->getLocation();
//获取摇杆的活动范围
float r = m_spRockerbg->getContentSize().width / 2;
//利用相似三角形的原理来获取摇杆活动的坐标
float X = touchpos.x-m_spRockerbg->getPositionX();
float Y = touchpos.y - m_spRockerbg->getPositionY();
float R = sqrt(X*X+Y*Y);
//表示在摇杆内的坐标
float x = r / R*X;
float y = r / R*Y;
if (R<r)
{
m_spRocker->setPosition(touchpos);
}
else
{
m_spRocker->setPosition((x+m_spRockerbg->getPositionX()),(y+m_spRockerbg->getPositionY()));
}
}
};
//结束触摸
touch->onTouchEnded = [this](Touch*t, Event*event)
{
//将触摸状态置为无
isTouch = false;
//将摇杆位置复原
m_spRocker->runAction(MoveTo::create(0.1f,m_spRockerbg->getPosition()));
};
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(touch,m_spRocker);
return true;
}
Vec2 Rocker::getOffset()
{
Vec2 ve(m_spRocker->getPositionX() - m_spRockerbg->getPositionX, m_spRocker->getPositionY() - m_spRockerbg->getPositionY);
//偏移量单位化方法
ve.normalize();
return ve;
}