提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
摇杆类
前言
摇杆类
一、摇杆是什么?
摇杆是可以控制英雄移动,是cocos2d一个强大的控件。
二、使用步骤
1.引入库
#include"cocos2d.h"
using namespace cocos2d;
.h文件
#ifndef _ROCKER_H_
#define _ROCKER_H_
#include"cocos2d.h"
using namespace cocos2d;
class Rocker:public Layer
{
public:
//参数,一个是摇杆背景的文件的路径,一个是摇杆中心的文件的路径,还有摇杆的位置向量
static Rocker* create(const char* r_bg,const char* rocker,const Vec2& r_pos);
virtual bool init(const char* r_bg,const char* rocker,const Vec2& r_pos);
//单位化向量
Vec2 getofferset();
private:
//摇杆背景
Sprite* rocker_bg;
//摇杆中心
Sprite* rocker;
//摇杆是否被触摸
bool isTouchRocker;
}
#endif
.cpp文件
#include"Rocker.h"
Rocker* Rocker::create(const char* r_bg,const char* rocker,const Vec2& r_pos)
{
Rocker* rocker=new Rocker;
if(rocker&&rocker->init(r_bg,rocker,r_pos))
{
rocker->autorelese();
}
else{
delete rocker;
rocker=nullptr;
}
return rocker;
}
bool Rocker::init(const char* r_bg,const char* rocker,const Vec2& r_pos)
{
if(!Layer::init())
{
return false;
}
//摇杆是否被触摸
isTouchRocker=false;
//初始化摇杆背景
rocker_bg=new Sprite::create(r_bg);
this->addChild(rocker_bg);
rocker_bg->setPosition(r_pos);
//初始化摇杆中心
rocker=new Sprite::create(rocker);
this->addChild(rocker);
rocker->setPosition(rocker_bg->setPosition());
EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = [this](Touch* touch, Event* event)
{
//获取触摸点的位置
Vec2 touchpos = touch->getLocation();
//获取摇杆中心包围盒
Rect rect = rocker->getBoundingBox();
//触摸点在摇杆点包围盒内
if(rect.containsPoint(touchpos))
{
//摇杆是否被触摸置为true
isTouchRocker=true;
//结束开始触摸事件
return true;
}
return false;
};
listener->onTouchMoved = [this](Touch* touch, Event* event)
{
Vec2 touchpos = touch->getLocation();
Rect rect = rocker->getBoundingBox();
//如果摇杆被触摸
if(isTouchRocker)
{
//1.如果在摇杆圆内,直接移动到触摸点
//半径
float r=rocker_bg->getContentSize().width / 2;
//X
float X=touchpos.x-rocker_bg->getPositionX();
//Y
float Y=touchpos.y-rocker_bg->getPositionY();
//触摸点到圆心的距离
float Dis=sqrt(x*x+y*y);
if(Dis<r)
{
rocker->setPosition(touchpos);
}
//2.如果触摸点在圆外,利用相似三角形
else
{
float x=r/Dis*X;
float y=r/Dis*Y;
rocker->setPosition(rocker_bg->getPositionX() + x, rocker_bg->getPositionY() + y);
}
}
};
listener->onTouchEnded = [this](Touch* touch, Event* event)
{
isTouchReocker = false;
rocker->runAction(MoveTo::create(0.2f, rocker_bg->getPosition()));
};
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
return true;
}
Vec2 Rocker::getofferset()
{
Vec2 vec=rocker->getPosition()-rocker_bg->getPosition();
//向量单位化
vec.normalize();
return vec;
}
# 总结
以上就是今天要写的摇杆类,本文仅仅简单介绍了摇杆的初始化和单位化(可以联系到英雄的移动)。