最近需要实现游戏地图的平移缩放功能,想到这是一个常用的功能,应该有现成的组件,可是到处找也没找到合适完美的实现,干脆自己写一个,经过一些测试没有问题,共享出来,有什么问题欢迎大家提出来继续完善。基于cocos2d-x 3.7.1,ide为vs2013。
使用方法:
PanZoomController panzoom;
panzoom.start(your node or layer or sprite);
PanZoomController.h
#ifndef __PAN_ZOOM_CONTROLLER_H__
#define __PAN_ZOOM_CONTROLLER_H__
#include "cocos2d.h"
USING_NS_CC;
// 当前拖动或缩放状态
enum PanZoomState
{
None, // 无状态
Pan, // 拖动平移
Zoom, // 缩放
Rebound // 弹回动画中
};
/**
* 触控平移缩放操作控件
*/
class PanZoomController : public Ref
{
public:
PanZoomController();
~PanZoomController();
/**
* @param node 要控制的节点
* @param enableRebound 是否启用拖动到边缘时的弹回效果
*/
void start(Node* node, bool enableRebound = false);
protected:
// 要控制的节点
Node* _node;
// 一次连续缩放操作是否初始化
bool _scaleInited = false;
// 拖动到边缘时允许的黑边宽度 单位 像素点
float _blackBorder = 50.0f;
// 回弹动画播放时间 单位 秒
float _reboundTime = 0.2f;
// 当前拖动或缩放状态
PanZoomState _state = PanZoomState::None;
// 是否启用拖动到边缘时的弹回效果
bool _enableRebound = false;
// 最小缩放倍率
float _minScale = 0.5;
// 最大缩放倍率
float _maxScale = 2;
Director* _director;
Vec2 _visibleOrigin;
Size _visibleSize;
void onTouchesBegan(const std::vector<Touch*>& touches, Event *event);
void onTouchesMoved(const std::vector<Touch*>& touches, Event *event);
void onTouchesEnded(const std::vector<Touch*>& touches, Event *event);
void onTouchesCancelled(const std::vector<Touch*>& touches, Event *event);
// 回弹动画结束
void onReboundEnd();
/**
* 平移后有黑边则移动图片对齐屏幕,获取移动相对偏移值
* @param minXY maxXY node's boundingBox's minXY in opengl coordinate
* @return delta position
*/
Vec2 getDeltaPosition(Vec2 minXY, Vec2 maxXY);
std::vector<long> times;
};
#endif // __PAN_ZOOM_CONTROLLER_H__
PanZoomController.cpp
#include "PanZoomController.h"
PanZoomController::PanZoomController()
{
}
PanZoomController::~PanZoomController()
{
}
void PanZoomController::start(Node* node, bool enableRebound /* = false */)
{
_node = node;
_director = Director::getInstance();
_visibleOrigin = _director->getVisibleOrigin(); // 注意应该使用visibleOrigin而不是0,0
_visibleSize