cocos2d摇杆

摇杆头文件

#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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值